1、SHELL编程实用教程SHELL编程Bash编程手册= SHELL编程 =一、Shell语法1.1、变量声明1.2、数组声明和使用1.3、特殊的变量1.4、运算和运算符1.4.1、整数运算符1.5、流程语句1.5.1、if 语句1.5.2、case语句1.5.3、select 语句1.6、循环语句1.6.1、for语句1.6.2、while 语句1.6.3、breake 和continue1.6.4、shift二、函数三、shell程序调试四、信号五、bash中常用的命令= 一、Shell语法 =1.1、变量声明变量值 (注意:等号两侧不能有空格)a=”hello”b=9unset a 撤销变
2、量 areadonly a=2 声明静态的变量 a=2 ,不能 unsetexport 变量名 可把变量提升为全局环境变量,可供其他shell程序使用变量应用中要注意:echo “$1 = $1 ; $2 = $2 “; 屏蔽$1 ,屏蔽 $2 ,直接显示 $1 ,$2,同理*也屏蔽了 * 的通配符作用$SATday ,变量要与字符串连在一起时,应该用 $a= ls -al 反引号,运行里面的命令,并把结果返回给变量aa=$(ls -al) 等价于反引号单引号和双引号“”的区别,单引号完全屏蔽 $a 变量,双引号不屏蔽$a,单引号和双引号都屏蔽 * 的通配符作用。1.2、数组声明和使用1 na
3、me0=Tom2 name1=Tomy3 name2=John4 或5 name=(Tom Tomy John)例子:1 #!/bin/bash2 name=(Tom Tomy John)3 for i in 0 1 24 do5 echo $i:$name$i6 done1.3、特殊的变量$0:脚本名字。此变量包含地址,可以使用basename $0获得脚本名称。$1:第一个参数$2,$3,$4,$5,一次类推。$# 传递到脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数,,以(“$1 $2”)$ 脚本运行的ID号$! 后台运行的最后一个进程的ID号$ 与$*相同,但是使用时加引号
4、,并在引号中返回每个参数。(“$1”$2)$- 显示shell使用的当前选项。$? 显示最后命令的推出状况。0表示没有错误。例子: 1 #!/bin/sh 2 if $# -ne 2 ; then 3 echo Usage: $0 string file; 4 exit 1; 5 fi 6 grep $1 $2 ; 7 if $? -ne 0 ; then 8 echo Not Found $1 in $2; 9 exit 1;10 fi11 echo Found $1 in $2;上面的例子中使用了$0 $1 $2 $# $? 等变量,下面是程序的解释:判断运行参数个数,如果不等于2,显示使
5、用”用法帮助”, 其中 $0 表示就是脚本自己。用grep 在$2 文件中查找$1 字符串。判断前一个命令运行后的返回值(一般成功都会返回0, 失败都会返回非0)。如果没有成功显示没找到相关信息,否则显示找到了。其中”表示转义,在” 里面还需要显示”号,则需要加上转义符”参数置换的变量1、变量=$参数:-word:如果设置了参数,则用参数的值置换变量的值,否则用word置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值。 -z $COLUMNS:- & COLUMNS=802、变量=$参数:=word:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成
6、word,然后再用word替换参数的值。注意,位置参数不能用于这种方式,因为在Shell程序中不能为位置参数赋值。3、变量=$参数:?word:如果设置了参数,则用参数的值置换变量的值,否则就显示word并从Shell中退出,如果省略了word,则显示标准信息。这种变量要求一定等于某一个参数的值。如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。4、变量=$参数:+word:如果设置了参数,则用word置换变量,否则不进行置换。字符串匹配的操作:$PARAMETER#WORD shell 像文件名扩展中那样扩展 WORD,并从 PARAMETER 扩展后的值的开头删除最
7、短的匹配模式(若存在匹配模式的话)。使用 或 $ 即可删除列表中每个参数的模式。$PARAMETER#WORD 导致从开头删除最长的匹配模式而不是最短的匹配模式。$PARAMETER%WORD shell 像文件名扩展中那样扩展 WORD,并从 PARAMETER 扩展后的值末尾删除最短的匹配模式(若存在匹配模式的话)。使用 或 $ 即可删除列表中每个参数的模式。$PARAMETER%WORD 导致从末尾删除最长的匹配模式而不是最短的匹配模式。$PARAMETER/PATTERN/STRING shell 像文件名扩展中那样扩展 PATTERN,并替换 PARAMETER 扩展后的值中最长的匹
8、配模式(若存在匹配模式的话)。为了在 PARAMETER 扩展后的值开头匹配模式,可以给 PATTERN 附上前缀 #,如果要在值末尾匹配模式,则附上前缀 %。如果 STRING 为空,则末尾的 / 可能被忽略,匹配将被删除。使用 或 $ 即可对列表中的每个参数进行模式替换。$PARAMETER/PATTERN/STRING 对所有的匹配(而不只是第一个匹配)执行替换。變數設定方式 str 沒有設定 str 為空字串 str 已設定非為空字串 1 var=$str-expr var=expr var= var=$str 2 var=$str:-expr var=expr var=expr va
9、r=$str 3 var=$str+expr var= var=expr var=expr 4 var=$str:+expr var= var= var=expr 5 var=$str=expr str=expr 6 var=expr str 不變 7 var= str 不變 8 var=$str 9 var=$str:=expr str=expr10 var=expr str=expr11 var=expr str 不變12 var=$str13 var=$str?expr expr 輸出至 stderr var= var=str14 var=$str:?expr expr 輸出至 stde
10、rr expr 輸出至 stderr var=str15 16 17 subsirpinguino $ x=a1 b1 c2 d218 subsirpinguino $ echo $x#*119 b1 c2 d220 subsirpinguino $ echo $x#*121 c2 d222 subsirpinguino $ echo $x%1*23 a1 b24 subsirpinguino $ echo $x%1*25 a26 subsirpinguino $ echo $x/1/327 a3 b1 c2 d228 subsirpinguino $ echo $x/1/329 a3 b3
11、c2 d230 subsirpinguino $ echo $x/?1/z331 z3 z3 c2 d2字符串子集提取:$x:3:5的值就是 “e val”,清单 9. shell 参数值的子字符串1 subsirpinguino $ x=some value2 subsirpinguino $ echo $x:3:53 e val字符串长度:您已经知道 $# 表示参数的数量,而 $PARAMETER:OFFSET:LENGTH 扩展适用于单个参数以及 $* 和 $,因此,可以使用一个类似的结构体 $#PARAMETER 来确定单个参数的长度也就不足为奇了。清单 10 中所示的简单的 test
12、length 函数阐明了这一点。自己去尝试使用它吧。清单 10. 参数长度1 subsirpinguino $ testlength () for p in $; do echo $#p;done 2 subsirpinguino $ testlength 1 abc def ghi3 14 35 71.4、运算和运算符1.4.1、整数运算符整数的算术运算符+ * / %赋值运算符 * / 位运算符 & | 位运算赋值运算符 & | 逻辑运算符:& | ! 小于 -lt shift by 2 7 -) shift;break; # end of options 8 -*) echo error
13、: no such option $1. -h for help;exit 1; 9 *) break;10 esac11 done就像平常执行命令一样,当有参数-h 时,则执行相应的动作1.6.3、breake 和continue关键字”break” 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。1.6.4、shiftshift将存放在位置变量中的命令行参数,依次向左传递.例如位置变量当前值为:$1=file1 $2=file2 $3=file3执行一次shift命令后,位置变量的值为:$1=file2 $2=file3还可以在shift命令中指定位置变
14、量转移的次数, 如:shift n例子: 1 while $1 2 do 3 if $1=-i then 4 infile=” $2 5 shift 2 6 else if $1=-o then 7 outfile=”$2 8 shift 2 9 else10 echo “Program $0 does not recognize option $111 fi12 done二、函数脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子: 1 #!/bin/sh 2 # vim: set sw=4 ts=4 et: 3 help() 4 5
15、 cat b2h - convert binary to decimal 6 USAGE: b2h -h binarynum 7 OPTIONS: -h help text 8 EXAMPLE: b2h 111010 9 will return 5810 HELP11 exit 012 13 14 15 error()16 # print an error and exit17 echo $118 exit 119 20 21 lastchar()22 # return the last character of a string in $rval23 if -z $1 ; then24 #
16、empty string25 rval=26 return27 fi28 # wc puts some space behind the output this is why we need sed:29 numofchar=echo -n $1 wc -c sed s/ /g 30 # now cut out the last char31 rval=echo -n $1 cut -b $numofchar32 33 34 chop()35 # remove the last character in string and return it in $rval36 if -z $1 ; then
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1