Linux内核4大主要功能:

内存管理

进程管理

设备管理

文件系统管理


Linux系统启动的进程和脚本管理

1./etc/inittab   管理系统开机时会自动启动的进程

2./etc/init.d     管理开机时启动或停止某个应用的脚本放在这个目录下,/etc/rcX.d目录在启动时,所有加载的脚本都是init.d下脚本的link


Linux 命令集合

1.ipcs -m  查看系统上的当前共享内存页面


2.cp -R dir1 dir2:  递归的复制dir1dir2

   cp -f test* dir2:将所有以test开头的文件复制到dir2-f参数用来强制覆盖dir2目录中已有的同名文件,而不会提示用户

   cp -a old/. new/:将old目录下的所有文件拷贝到new,包括隐藏文件

   cp -l test1 test4: 创建了test1的硬链接文件test4,实际上二者标示的是同一个文件,因二者的节点号是相同的

   cp -s test1 test5:创建了test1的软链接文件test5。链接文件只要存储源文件的信息,并不需要存储源文件中的数据


   ln -s test1 test5      ln -l test1 test4  可以达到和上述类似的效果


  1. rm -rf dir2:删除dir2目录及其子目录和文件
  2. stat test1:查看文件统计信息
  3. file test1:查看文件类型,包括ASCII文本文件;Shell脚本文件;二进制可执行文件
  4. cat -n 1.txt  查看1.txt的内容,且给文本的每行加上行号 

       cat -b 1.txt  与上述指令的区别,只在文本非空白行加上行号

       cat -s 1.txt  压缩文本中连续的多个空白行为一个空白行

       more 1.tx  查看文本文件的内容,空格键可以翻页; 回车键可以显示下一行

  1. ps -aux:可以查看当前系统所有进程的详细信息

       ps l: 查看当前控制台下属于当前用户的进程信息

       可以在上述指令后增加参数 - -forest,可以看到进程之间的启动关系

       进程信息中STAT列含义如下:

       <:该进程运行在高优先级

       N:该进程运行在低优先级

       L:该进程有页面锁定在内存中

       s:该进程是个控制进程

       l:该进程是多线程的

       +:该进程运行在前端

  1. top指令设置刷新间隔为2: top -d 2 
  2. df -h: 显示某个设备上还有多少磁盘空间
  3. du -h: 显示某一个目录下各个子目录的空间
  4. printenv:打印当前shell所在的全局变量
  5. set:显示为某个特定进程设置的所有环境变量(包括全局变量)
  6. export 变量名:可以导出当前的局部变量成为全局变量  如:export test
  7. 变量定义注意事项:环境变量名称、等号和值之间没有空格;如果赋值一个含有空格的字符串,必须用单引号将字符串扩起来

 15. unset:删除环境变量,如:unset test. 注意:在shell子进程中unset的全局环境变量,在父进程中该环境变量依然有效。

  1. PATH:定义了命令行输入命令的搜索路径。
  2. /etc/profile 是每个shell启动时,默认的主启动文件
  3. 每个用户的shell启动脚本,有如下三者中的一种:$HOME/.bash_profile   $HOME/.bash_login   $HOME/.profile 这三个文件会加载$HOME目录下的.bashrc的启动脚本,.bashrc会加载/etc目录下的bashrc文件,同时$/HOME/.bashrc可以作为用户自定义脚本执行的地方。
  4. alias -p 可以查看已有的命令别名列表
  5. 查看Flash分区信息:cat /proc/mtd(显示分区名称、大小)    cat /proc/partition(显示block)
  6. shell中显示提示而不换行,如:echo -n “This is a test string: ”
  7. shell中显示$符号,需要按照转义处理。如:echo “test print \$15”
  8. shell中使用反引号,可以获取命令的输出结果,然后赋值给一个变量。如:test=`date`   test变量内容即为date的输出
  9. IFS:内部字段分隔符,该环境变量定义了bash shell用作字段分隔符的一系列字符。可以如下方式使用该变量:

IFS.OLD=$IFS

IFS=$’\n’

<……use the new IFS value in code>

IFS=$IFS.OLD

  1. $*变量:把所有参数当成一个参数,而不是多个参数;   $@变量:会单独处理每个参数,所有参数当做同一字符串中的多个独立的单词
  2. 最后一个参数的表现方式:

params=$#

echo the last parameter is $params

echo the last parameter is ${!#}

  1. 使用$和方括号将数学表达式圈起来:var1=$[1+(2*5)]
  2. bc:浮点计算器
  3. $?: 该变量用来保存上个执行命令的退出状态码,退出码0,表示命令成功结束;0,表示命令异常结束
  4. exit:该命令可以在shell结束时,指定一个退出状态码。该值取值范围0~255,如果指定返回大于255,会被系统自动取模后的结果,作为退出状态码
  5. if-then语句格式一:

if command

then

      commands

fi


  1. if-then语句格式二(command之后增加一个分号)

if command: then

      commands

fi


  1. if-then-else格式:

if command

then

    commands

else

    commands

fi


  1. 嵌套if( elif )

if command1

then

    commands

elif command2

then

    commands

fi


  1. test:上述if的条件判断都是根据命令的执行退出状态码来执行,如果想执行条件判断,需要使用test命令,或者使用[ ]
  2. if条件判断命令格式一:

if test condition

then

    commands

fi


  1. if条件判断命令格式二:

if [ condition ]

then

    commands

fi


  1. test命令可以判断3类条件:数值比较、字符串比较、文件比较
  2. test数值比较功能:

n1 -eq n2                  检查n1是否等于n2

n1 -ge n2                  检查n1是否大于或等于n2

n1 -gt  n2                  检查n1是否大于n2

n1 -le n2                   检查n1是否小于或等于n2

n1 -lt n2                    检查n1是否小于n2

n1 -ne n2                  检查n1是否不等于n2


  1. test字符串比较功能:

str1 = str2                 检查str1是否与str2相同

str1 != str2                检查str1是否与str2不同

str1 < str2                 检查str1是否比str2小(在使用时,需要对于符号转义,如:if [ $val1 \< $val2 ]

str1 > str2                 检查str1是否比str2大(在使用时,需要对于符号转义,如:if [ $val1 \> $val2 ]

-n str1                       检查str1的长度是否大于0

-z str1                       检查str1的长度是否为0

注:在test命令中,大写字母会小于小写字母,这是因为test使用标准ASCII顺序,即小写字母的ASCII值会大于大写字母的ASCII

sort命令排序时,小写字母的会排在前面


  1. test文件较功能:

-d file                        检查file是否存在并且是一个目录

-e file                        检查file是否存在

-f  file                        检查file是否存在并且是一个文件

-s file                        检查file是否存在并且非空

-r file                         检查file是否存在并且可读

-w file                       检查file是否存在并且可写

-x file                        检查file是否存在并且可执行

-O file                       检查file是否存在并属于当前用户所有

-G file                       检查file是否存在并与当前用户有相同的组

file1 -nt file2             检查file1是否比file2

file1 -ot file2             检查file1是否比file2


-b file     若文件存在且是一个块特殊文件,则为真

-c file     若文件存在且是一个字符特殊文件,则为真

-d file     若文件存在且是一个目录,则为真

-e file     若文件存在,则为真

-f file     若文件存在且为一个规则文件,则为真

-g file     若文件存在且设置了SGID位的值,则为真

-h file     若文件存在且为一个符号链接,则为真

-k file     若文件存在且设置了“sticky”位的值,则为真

-p file     若文件存在且为一已命名管道,则为真

-s file     若文件存在且其大小大于零,则为真

-u file     若文件存在且设置了SUID位的值,则为真

-r file     若文件存在且可读,则为真

-w file     若文件存在且可写,则为真

-x file     若文件存在且可执行,则为真

-o file     若文件存在且被有效用户ID所拥有,则为真


$# 是传给脚本的参数个数

$0 是脚本本身的名字

$1 是传递给该shell脚本的第一个参数

$2 是传递给该shell脚本的第二个参数  (注意:对于多过9个参数,需要在数字周围加花括号,如第10个参数: ${10})

$@ 是传给脚本的所有参数的列表

$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9

$$ 是脚本运行的当前进程ID

$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

$-记录着当前设置的shell选项


  1. 复合条件测试:

[ condition1 ] && [ condition2 ]    只有在 && 左边的命令返回真(命令返回值 $? == 0),&&右边的命令才会被执行

[ condition1 ] || [ condition2 ]


  1. test使用标准数学运算符

if (( $val1 ** 2 > 90))          双括号中的特殊字符,如 < > 不再需要转义,就可以直接使用了


  1. 双括号中命令符号

val++                        后增

val- -                         后减

++val                        先增

- -val                         先减

**                               幂运算

<<                             左移位

>>                             右移位

&&                             逻辑与

||                                逻辑或

                             逻辑非

&                               位与

|                                位或

~                               位求反


  1. test使用字符串模式匹配比较

if [[ $USER == r* ]]        $USER环境变量是否是以字母r开头的


  1. case命令

case variable in

pattern1 | pattern2)

    commands1;;

pattern3)

    commands2;;

*)

    default commands;;

esac


  1. for命令

for var in list

do

    commands

done


  1. for命令中使用通配符

for file in /home/rich/test/*

do

    echo “test file $file”

done


  1. C语言风格for命令

for (( i=1; i <= 10; i++))

do

    echo “test…”

done


  1. while 命令

while test command

do

    other commands

done

如:

while [ $val1 -gt 0]

do

    echo $val1

    var1=$[$var1 - 1]

done

注意:while命令允许你在while语句行定义多个测试命令,但只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环


51.until 命令

until test command

do

    other commands

done

注意:until命令要求你指定一个通常输出非零退出码的测试命令。(非零,表示测试条件尚不成立)


52.break 跳出多重循环

break n

这里n 说明了要跳出的循环层级。默认情况下,n1,表明跳出的是当前的循环。

如果将n 设置为2break命令就会停止下一级的外部循环


  1. continue 继续循环

continue n

这里n 定义了要继续的循环层级。

continue 2 表示跳出当前循环,继续外层的循环


54.要在shell脚本的参数值中包含空格,需要把有空格的参数用单引号或双引号括起来


55.basename命令会只返回程序名而不包括路径

如: name=`basename $0`


56.shift 命令

默认情况下,这个命令会将命令前移,如,变量$3的值会移到$2

shift的好处:不知道参数个数,可以利用shift指令,只操作第一个参数$1,只需要在循环中每次shift,同时判断$1是否为空(while [ -n “$1” ]

shift n

表明要移动几个位置,如shift 2 : 移动2个位置


注意:当使用shift时,一个参数被移除后,它的值会被丢掉,且无法恢复



57.getopt  命令

处理命令行选项和参数时非常方便的工具

格式:

getopt options  optstring parameters

options:如 -q选项,可以在命令执行时忽略错误信息

optstring是这个过程的关键,定义了命令行有效的选项字母,还定义了那些选项字母需要参数值。每个需要参数的选项字母后加一个冒号。

例如:

getopt -q ab:cd  -a -b test1 -c -d test2 test3


执行结果:-a -b test1 -c -d  - - test2 test3

这里- - 表示分开行中的额外参数


  1. getopts 命令

getopt的命令中,选项字母的参数值是不能有空格的,而 getopts就可以解决该问题

格式:

getopts opstring variable 

opstring: 有效字母都会列在其中,如果选项字母要求有个参数,就加一个冒号。要去掉错误消息,可以在opstring之前加一个冒号。

例如:

getopts :ab:c  -a -b “test1 test2“ -c


59.read命令

1)基本的读取

例如1

echo -n “Enter you name: ”    -n 选项会移除掉字符串末尾的换行符,允许用户紧跟其后输入数据

read name                             读取的数据存储到$name中了


例如2

read -p “please enter you age: ” age     -p选项,允许你直接在read命令行中指定提示字符,读取的数据存储到 $age


(2)超时处理

例如1

read -t 5 -p “please enter you name: ” name      -t选项指定了read命令等待输入的秒数


例如2

read -n1 -p “Do you want to continue [Y/N] ?” answer         -n1选项,表明read读取单个字符后退出


3)隐藏读取(多用于密码)

read -s -p “Enter you password: ” pass        -s选项,阻止将数据显示在显示器上,实际上只是将输入文本颜色设置成和背景色一样罢了


4)从文件中读取

cat test | while read line                将从cat test文件内容,每次read都读取一行,将一行内容存储到变量$line


60.查看系统的所有线程

1ps -T

2top之后输入h,可以查看各个线程对于CPU的占用


61.重定向描述符

例如1:同时重定向错误和数据

ls -al test test2 test3 2>test6 1>test7

重定向错误到test6重定向输出到test7


例如2:重定向输入

cat < testfile

强制cat命令接收来自非STDIN的文件的输入


62.重定向输出和错误   &>

例如:

ls -al test test2 test3 &> test7

ls的结果,包括可能的错误输出都重定向到文件test7


63.临时重定向输出到错误STDERR    >&2

例如:

echo “This is an error” >&2


64.永久重定向  exec命令

shell脚本中,使用exec命令,永久重定向shell执行期间的特定描述符

例如1:脚本中重定向输出

exec 1>testout

exec命令会启动一个新shell并将STDOUT文件描述符重定向到文件。脚本中所有发给STDOUT的输出,都会被重定向到testout文件中


例如2:脚本中重定向输入

exec 0< testfile

这个命令告诉shell它应该从文件testfile中获得输入,而不是STDIN


65.阻止命令输入,重定向到/dev/null

这种情况,在脚本运行在后台时很常见。shell输入到null的任何数据都不会保存,这些数据都被丢掉了。

例如1

ls -al > /dev/null


例如2:阻止任何错误都不保存

ls -al badfile test6 2> /dev/null


例如3>/dev/null 2>&1 

shell中可能经常能看到:>/dev/null 2>&1 


命令的结果可以通过%>的形式来定义输出


/dev/null 代表空设备文件

代表重定向到哪里,例如:echo "123" > /home/123.txt

表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"

表示stderr标准错误

表示等同于的意思,2>&1,表示2的输出重定向等同于1


那么本文标题的语句:

1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。

2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。


66.快速移除现有文件数据

输入重定向时,将/dev/null作为输入文件。由于/dev/null文件不含有任何内容,程序员通常用它来快速移除现有文件中的数据,而不用先删除再创建文件。

例如:

cat /dev/null > testfile

文件testfile仍然存在系统上,但现在它是空文件。


67.mktemp命令

/tmp目录下创建临时文件

例如1:创建本地临时文件

mktemp testing.XXXXXX

mktemp命令会用6个字符码替换这6X,从而保证文件名在目录中是唯一的。


例如2:创建临时文件时,返回全路径

tempfile = `mktemp -t tmp.XXXXXX`

后续可以在任何目录下,通过tempfile来引用新创建的临时文件了,因此时获知了全路径


例如3:创建临时目录

tempdir =`mktemp -d dir.XXXXXX`

后续可以再tempdir这个临时目录下创建自己的临时文件。


68.tee命令

将输入一边发送到显示器,一边发送到tee命令指定的文件中

例如1

date | tee testfile

date的执行结果,既显示在屏幕上,又存储到文件testfile


例如2tee追加存储

date | tee -a testfile

testfile中追加新的date的数据。没有-a选项,则每次执行tee,都会覆盖文件的内容


69.信号处理

SIGHUP        挂起进程,当终端断开时,将发送该信号给终端控制进程

SIGINT          终止进程(ctrl + c)终端驱动程序将发送该信号给前台进程组

SIGQUIT       停止进程(ctrl + \该信号将发往前台进程组,并生成可用于调试的核心转储文件。在进程陷入死循环时,可以触发该信号调试

SIGKILL         无条件终止进程  

SIGTERM      可能的话终止进程  killkillall命令所发送的默认信号。

SIGSTOP       无条件停止进程,但不是终止进程

SIGTSTP        停止或暂停进程,但不终止进程(ctrl + z 作业控制的停止信号,发送信号给前台进程组,使其停止运行。

SIGCONT       继续运行停止的进程


shell默认情况下,会忽略收到的 SIGQUIT SIGTERM信号。正因为这样,交互式shell才不会被意外终止。


用户有时会使用kill -KILL 或者killall -9 显式向进程发送SIGKILL信号。然而这一做法通常是错误的。精心的设计应用程序应当为SIGTERM信号设置处理器程序,以便于其能够预先清除临时文件和释放其他资源,从而全身而退。

发送SIGKILL信号可以杀掉某个进程,从而绕开了SIGTERM信号的处理程序。因此,总是应该首先尝试使用SIGTERM信号来终止进程,而把SIGKILL信号作为最后手段,去对付那些不响应SIGTERM信号的失控进程


SIGKILL SIGSTOP信号,是一个必执行信号。处理器程序无法将其阻塞、忽略或者捕获,故而总能成功执行。


  1. shell中捕捉信号

trap commands signals

例如:

trap “echo ‘SorryI have trapped Ctrl-C’”  SIGINT  SIGTERM

trap在每次检测到SIGINT SIGTERM信号时显示一行简单的文本消息。


一般trap 指令放置在shell执行的正文第一行,在捕捉到信号后,自动执行。


  1. grep命令

grep -q -e "No medium found" -e "No such file or directory"

说明:

-q:安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0

-e:并列使用多个 -e参数可以实现或条件,同时查询多个条件,满足其中之一即可。


72.函数

(1)函数定义两种形式:

function name {

commands

}


name( ){

commands

}


(2)函数的返回值

情况一:

函数中最后一条命令的退出状态码,作为函数的退出状态码


情况二:

return 命令来退出函数并返回特定的退出状态码

注:函数的退出状态码必须小于256,大于256将返回一个错误


(3)函数的输出保存到shell变量中

如:result=`testfunc`

这条命令将testfunc函数的输出付给$result变量。

这种方法,可以用来从函数返回大于256的返回值,只需要在函数的最后用echo将结果输出即可。

如:echo $[$value * 2]


(4)函数中使用变量

情况一:

向函数传递变量,bash shell会将函数当做小脚本来对待。

如:

value=`addfunc 10 15`

向函数addfunc传递了两个参数10和15


情况二:

由于函数使用特殊参数环境变量作为自己的参数值,它不能直接从脚本的命令行获取脚本的参数值。即脚本的参数如$1,与函数的$1不同。


情况三:全局变量和局部变量

在shell脚本中任何地方定义的变量都是全局变量;

在函数内部使用local声明的变量,都是局部变量。

例如:local temp


  1. shell中的${},##和%%的使用 

假设我们定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt

可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 /及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个及其左边的字符串:my.file.txt
${file#*.}:删掉第一个及其左边的字符串:file.txt
${file##*.}:删掉最后一个及其左边的字符串:txt
${file%/*}:删掉最后一个  / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个及其右边的字符串:(空值)
${file%.*}:删掉最后一个  . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个  .  及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法为:
# 去掉左边(键盘上# $的左边)
%是去掉右边(键盘上% $ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5个字节:/dir1
${file:5:5}:提取第 5个字节右边的连续5个字节:/dir2

也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir替换为path/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir替换为 path/path1/path2/path3/my.file.txt

利用 ${ } 还可针对不同的变数状态赋值(沒设定、空值、非空值)
${file-my.file.txt} :假如 $file沒有设定,則使用 my.file.txt作传回值。(空值及非空值時不作处理)
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt作傳回值。 (非空值時不作处理)
${file+my.file.txt} :假如 $file設為空值或非空值,均使用 my.file.txt作傳回值。(沒設定時不作处理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt作傳回值。 (沒設定及空值時不作处理)
${file=my.file.txt} :若 $file沒設定,則使用 my.file.txt作傳回值,同時將 $file賦值為 my.file.txt(空值及非空值時不作处理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt作傳回值,同時將 $file賦值為my.file.txt (非空值時不作处理)
${file?my.file.txt} :若 $file沒設定,則將 my.file.txt輸出至 STDERR (空值及非空值時不作处理)

${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt输出至 STDERR (非空值時不作处理)

${#var} 可计算出变量值的长度:

${#file} 可得到 27,因为/dir1/dir2/dir3/my.file.txt27个字节



Shell重定向&>file、2>&1、1>&2的区别


0表示标准输入
1表示标准输出
2表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把 标准错误输出 重定向到 标准输出.
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中




1>/dev/null 2>&1的含义

shell中可能经常能看到:>/dev/null 2>&1

命令的结果可以通过%>的形式来定义输出

/dev/null
代表空设备文件
>
代表重定向到哪里,例如:echo "123" > /home/123.txt
1
表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2
表示stderr标准错误
&
表示等同于的意思,2>&1,表示2的输出重定向等同于1

那么本文标题的语句:
1>/dev/null
首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1
接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

 

/dev/null 的用途  

/dev/null ,从名称上可以很显然看出是一个空文件(写入到/dev/null时全部丢失,读取/dev/null时自己返回EOF),那么你会很疑惑,他到底有什么用途呢,请看下文听我讲解,可能你在很多脚本里看过 /dev/null,具体总结下几种常见用途.


一、禁止标准输出.

eg: 

    cat $filename >/dev/null  

    # 文件内容丢失,不会输出到标准输出,.


二、禁止标准错误

eg: 

    rm $badname 2>/dev/null  

    #删除文件错误时,不会再有提示到终端,都丢到/dev/null里去了


三、禁止标准输出和标准错误的输出.

eg1: 

    cat $filename 2>/dev/null >/dev/null 

    # 如果"$filename"不存在,将不会有任何错误信息提示.

    # 如果"$filename"存在, 文件的内容不会打印到标准输出

    # 因此, 上面的代码根本不会输出任何信息

    # 当只想测试命令的退出码而不想有任何输出时非常有用。  

eg2:

    #-----------测试命令的退出 begin ----------------------#  

    ls dddd 2>/dev/null 8 

    echo $?    //输出命令退出代码:0为命令正常执行,1-255为有出错。  

    #-----------测试命令的退出 end-----------#    

    cat $filename &>/dev/null 


四、清除日志文件内容

eg:

    cat /dev/null > /var/log/messages 

    #  : > /var/log/messages   有同样的效果, 但不会产生新的进程.(因为:是内建的)   

    cat /dev/null > /var/log/wtmp


五、 隐藏cookie而不再使用

eg:

    if [ -f ~/.netscape/cookies ]  # 如果存在则删除.  

    then

        rm -f ~/.netscape/cookies  

    fi

    ln -s /dev/null ~/.netscape/cookies 

    # 现在所有的cookies都会丢弃而不会保存在磁盘上了.


linuxshell变量$#,$@,$0,$1,$2的含义解释:
变量说明:
$$
Shell本身的PIDProcessID
$!
Shell最后运行的后台ProcessPID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n"的形式输出所有参数。
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数 




【shell】常用语法 -b file -c file -f file-d file -x file 



 shell】常用语法 -b file  -c file  -f file-d file  -x file     

一、test条件判断

1test文件测试:

-b file     若文件存在且是一个块特殊文件,则为真

-c file     若文件存在且是一个字符特殊文件,则为真

-d file     若文件存在且是一个目录,则为真

-e file     若文件存在,则为真

-f file     若文件存在且为一个规则文件,则为真

-g file     若文件存在且设置了SGID位的值,则为真

-h file     若文件存在且为一个符号链接,则为真

-k file     若文件存在且设置了“sticky”位的值,则为真

-p file     若文件存在且为一已命名管道,则为真

-s file     若文件存在且其大小大于零,则为真

-u file     若文件存在且设置了SUID位的值,则为真

-r file     若文件存在且可读,则为真

-w file     若文件存在且可写,则为真

-x file     若文件存在且可执行,则为真

-o file     若文件存在且被有效用户ID所拥有,则为真

 

2test字符串比较

-z string         string长度为0,则为真

-n string         string长度不为0,则为真

string1 = string2    若两个字符串相等,则为真

string1 != string2   若两个字符串不相等,则为真

 

3test命令的数字比较操作符

int1 -eq int2      int1等于int2,则为真

int1 –ne int2      int1不等于int2,则为真

int1 –lt int2      int1小于int2,则为真

int1 –le int2      int1小于等于int2,则为真

int1 –gt int2      int1大于int2,则为真

int1 –ge int2      int1大于等于int2,则为真

 

4test复合表达式

! expr                     expr为假则复合表达式为真。expr可以是任何有效的测试表达式

expr1 -a expr2           expr1expr2都为真,则为真

expr1 -o expr2           expr1expr2有一个为真,则为真

 

二、shell里的特殊变量

# sh /usr/local/bkeep/shell.sh 001 002

I'm $0 is:/usr/local/bkeep/shell.sh        //正在被执行脚本的名字;`basename $0`

I'm $1 is:001                //$1接收到的参数

I'm $2 is:002                //$2接收到的参数

I'm $# is:2                   //总共接收到的参数个数

I'm $* is:001 002         //把接收到的参数全部打印出来

I'm $@ is:001 002        //同上

I'm $? is:0                   //上一个脚本的退出状态“0”代表正常;“1”非正常退出

I'm $$ is:24137            //当前执行脚本的进程ID

I'm $! is:                     //前一个后台进程的id

 

:其他

1.返回值 #?

cd dir

echo "$?"

如果dir存在,则返回0,不存在则返回1.其他函数的命令也是一样,比如diff,等等。

 

每个命令都会返回一个 exit 状态(有时候也叫return状态).成功返回0,如果返回一个非0,
常情况下都会被认为是一个错误码.一个编写良好的UNIX命令,程序,和工具都会返回一个0作为
退出码来表示成功,虽然偶尔也会有例外.

同样的,脚本中的函数和脚本本身都会返回退出状态.在脚本或者是脚本函数中执行的最后的命
令会决定退出状态.在脚本中,exit nnn命令将会把nnn 退出码传递给shell

 

$?读取最后执行命令的退出码.函数返回后,$?给出函数最后执行的那条命令的退出码.这种给
函数返回值的方法是 Bash 的方法.对于脚本来说也一样.总之,一般情况下,0为成功,0失败W

 

 2 .

$ 变量替换操作符
只有在变量被声明,赋值,unsetexported 或者是在变量代表一个signal的时候,
变量才会是以本来的面目出现在脚本里.变量在被赋值的时候,可能需要使用"=",
read
状态或者是在循环的头部.
""中还是会发生变量替换,这被叫做部分引用,或叫弱引用.而在''中就不会发生变
量替换,这叫做全引用,也叫强引用.这两个符合在同一个按键上。具体见第5章的讨论.
注意:$var ${var}的区别,不加{},在某些上下文将引起错误,为了安全,使用2.

 

还有一个按键在左上角,即按键1的左边。此按键有下面的作用。即将ls -l的结果传给a

17 a=`ls -l` # ls -l的结果给a
18 echo $a # 别忘了,这么引用的话,ls的结果中的所有空白部分都没了(包括换行)
19 echo
20 echo "$a" # 这么引用就正常了,保留了空白

 或者直接

echo "$(ls -l)" 也可以取出目录

 

3.

read 命令状态中
30 echo -n "Enter \"a\" "
31 read a
32 echo "The value of \"a\" is now $a."
33
34 echo
35

这个方法可以接受键盘输入到a中。

 

 4.

在一个双引号中直接使用变量名,一般都是没有问题的.它阻止了所有在引号中的特殊字符的
重新解释--包括变量名[2]--但是$,`\除外.[3]保留$,作为特殊字符的意义,是为了能够在双
引号中也能够正常地引用变量("$var").这样在""中可以使用变量所表达的值(Example 4-1).
使用""来防止单词分割.[4]如果在参数列表中使用双引号,将使得双引号中的参数作为一个参
.即使双引号中的字符串包含多个单词(也就是包含空白部分),也不会变为多个参数,:
1 variable1="a variable containing five words"
2 COMMAND This is $variable1 # COMMAND 将以7 个参数来执行
3 # "This" "is" "a" "variable" "containing" "five" "words"
4
5 COMMAND "This is $variable1" # COMMAND 将以1 个参数来执行

 

5.赋值的方法

--------------------------------------------------------

aC风格的赋值
7 (( a = 23 )) # 给一个变量赋值,"="两边的空格就能看出这是c风格的处理.
8 echo "a (initial value) = $a"
9
10 (( a++ )) # 变量'a'后加1,C风格.
11 echo "a (after a++) = $a"
12
13 (( a-- )) # 变量'a'后减1,C风格.
14 echo "a (after a--) = $a"

 ------------------------------------------------

37(( t = a<45?7:11 )) # C 风格的3 元操作.
38 echo "If a < 45, then t = 7, else t = 11."
39 echo "t = $t " # Yes!

---------------------------------------------------

18 LIMIT=10
19
20 for ((a=1; a <= LIMIT ; a++)) # Double parentheses, and "LIMIT" with no "$".
20 for ((a=1; a <= LIMIT ; a++)) # 双圆括号, 并且"LIMIT"变量前边没有 "$".
21 do
22 echo -n "$a "
23 done

--------------------------------------------

b:let

4 a=2334 # 整型
5 let "a += 1"   #不加双引号也可以
6 echo "a = $a "  # a = 2335

--------------------------------------------------------------------

c:取变量

5 a=2334

6 a=$(($a+1))

7 echo "$a"   #a=2335

 —————————————————————



Logo

更多推荐