Bash Shell编程要点小结

时间:2021-07-01 03:41:32

一、case命令

case variable in
value1)

command(s)
;;

value2)

command(s)
;;

*)

command(s)
;;

esac

如果case变量没有被匹配,程序就执行*)后面的语句。
case值中允许出现Shell通配符和竖线(|)作为OR操作符

二、if命令

if command
then

command(s)

fi

if test expression
then

command(s)

fi

if [ string/numeric expression ]
then

command(s)

fi

if [[ string/numeric expression ]
then

command(s)

fi

if ((numeric expression))
then

command(s)

fi

注意:
1)if命令可以嵌套,在嵌套的情况下,fi命令总是和最近的if配对使用

2、if/else命令
if command
then

command(s)

else

command(s)

fi

3、if/elif/else命令
if command
then

command(s)

elif command

command(s)

elif command

command(s)

else

command(s)

fi
注意:
1)elif=else if,但elif不需要fi命令对应了
2)else块被称为默认块

三、eval命令

eval命令可以对命令行求值,做shell替换,并执行命令行。通常在普通命令行解析不能满足要求时使用。

例子:

$ set a b c d
$ echo The last argument is\$$#
The last argument is $4

$ eval echo The last argument is\$$#
The last argument is d

cb@cb-K43SV:~$ set -x //打开bash shell的调试功能
cb@cb-K43SV:~$ eval echo The last argument is \$$#
+ eval echo The last argument is '$4'
++ echo The last argument is d
The last argument is d

四、exit命令

exit命令结束脚本返回命令行。
exit命令可以带一个返回值参数,0表示顺利退出,否则,非正常退出。
exit命令的返回值保存在$?变量中。

五、IFS域分隔符

shell的内部域分隔符可以是空格、制表符和换行符,它可以作为命令的分隔符用在read、set、for等命令中。
在修改IFS之前,最好将原始的IFS保存在另一个变量中。

names=Tom:Dick:Harray:John
OLD_IFS=$IFS
IFS=":"
for persons in $names
do

echo $persons

done
IFS=$OLD_IFS

六、null命令

null命令用:表示,是一个内建的什么都不做的命令,返回状态值为0(真),通常用来建立无限循环。
例子:
if grep "hello" hello.txt
then

:

else

echo "not found!"

fi

七、shift命令

shift命令用来把位置参量向左位移指定次数,没有参数的shift命令则把参数变量表向左位移一位。
shift [n]

while (($#>0))
do

echo $*
shift

done

八、循环命令

Bash shell有四种循环:for 循环、while循环、until循环、select循环

1、for循环

for variable in word_list
do

command(s)

done

例子:
for pal in Tom Dick Harry Joe
do

echo "Hi $pal"

done

for file in memo[1-5] #world_list可以是正则表达式,但文件必须存在才能展开,否则不展开
do

......

done

for file #word_list为空,自动循环位置参量,等效于for file in $*
do

......

done

2、while循环

while循环形式:当command退出状态值为0时,执行循环体内的命令command(s),直到command退出状态值非0
while command
do

command(s)

done

例子:
num=0
while ((num<10))
do

let num+=1
echo "num=$num"

done

while "$answer" != "Bill Clinton"
do

......

done

while [ -n "$go" ] #-n:字符串长度非0
do

......

done

while true #true命令是Linux中退出状态值永远为0的命令
do

......

done

3、until循环

until循环形式:和while循环相反,当command退出值为非0时,执行循环体内的命令command(s),否则,退出循环
until command
do

command(s)

done

例子:
until who | grep linda
do

sleep 5

done
talk linda@dragonwings

num=0
until ((num>10))
do

let num+=1
echo "num=$num"

done

4、select循环

select循环的主要作用是建立菜单,数字化的菜单显示在标准错误上,PS3(默认为#?)提示用户输入。
输入的是菜单序号,并被保存到REPLY中。
如果REPLY变量为空,将会重新显示菜单。
变量COLUMN表示终端上显示的用select命令建立的菜单的列宽度,默认80。
变量LINES控制菜单在终端上的垂直显示的行数,默认为24;当LINES=1时,菜单将在一行上显示。
break命令或CTL+C退出循环。

select var in wordlist
do

command(s)

done

例子:
select name in chenjy panda xiaopang
do

echo "name=$name, REPLY=$REPLY"

done

输出:
1) chenjy
2) panda
3) xiaopang
#?

5、break命令

内建的break命令用来从循环中强形退出,但是不退出程序。
break可以用一个数字作为参数,指定强行退出的循环层数。如果有三层循环,最外层的循环为3,中间的为2,最里层的为1。
break [n] n默认值为1

6、continue命令

continue [n] n默认值为1
如果某些条件为真,continue命令控制跳转到循环的顶部,所有continue命令后面的语句都将被忽略。
如果用一个数字作为参数,控制就可以在指定的任何层的循环顶部重新开始执行。如果有三层循环,最外面的循环号为3,中间层为2,最里层为1。

7、循环中的IO重定向

文件中的输入可以通过管道重定向给一个循环,循环的输出也可以重定向给一个文件或通过管道重定向给其它程序。Shell启动一个子shell来处理IO重定向和管道。

cat file | while read line
do

echo $line

done >tmp$$

for i in 7 9 2 3 4 5
do

echo $i

done | sort -n

8、后台运行循环

循环可以在后台运行,程序可以不等待循环结束而连续运行。

例子:关键字done后面的&使得循环在后台运行。在循环运行的同时,程序继续运行。

#!/bin/bash
for person in bob jim joe sam
do

mail $person < memo

done &

九、文件检验操作符

常用文件检验操作符,可分为四类:
1、文件读写执行权限检验
-r filename 文件可读
-w filename 文件可写
-x filename 文件可执行

2、文件存在检验
-e filename 文件存在
-d filename 目录存在
-f filename 非目录普通文件存在

3、文件类型检验
-b filename 块文件
-c filename 字符文件
-L filename 符号链接

4、文件大小检验
-s filename 文件尺寸非0

十、陷阱trap命令

trap命令允许你控制程序在收到信号以后的行为。当接收到指定的信号数字后,就执行trap命令中用引号引用的命令。
信号:由一个进程发送给另一个进程的,或者在特定的健按下后由操作系统发送给进程的,又或者在异常情况下发生时由数字组成的非同步消息。

trap命令格式:
trap 'command;command' signal-number
trap 'command;command' signal-name

注意:
1、Shell总共读取两次命令字符串,一次是在设置trap的时候,一次是在信号到达的时候。
2、如果命令字符串被双引号引用,在第一次设置trap时执行变量和命令替换。如果用的是单引号,则等到信号到达trap开始执行时,才看执行变量和命令替换。
3、陷阱的设置对于脚本来说是全局的。

例子:
1、信号列表
$ trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

2、设置信号陷阱
$ trap 'rm tmp*;exit 1' 0 1 2 15

$ trap 'rm tmp*;exit 1' EXIT HUP INT TERM

3、忽略信号
$ trap "" 1 2

4、信号复位:在trap命令后面跟一个信号或者数字,可以把信号复位为默认动作。
$ trap 2

$ trap INT

5、陷阱嵌套
$ trap 'trap 2' 2
设置用户按两次Control-C终止程序。第一次陷阱捕捉信号,第二个陷阱复位信号2的默认动作-杀死进程

十一、getopts命令

当脚本需要一些命令行选项时,位置参量不是总有效的,因为有的选项需要指定参数,而位置参量无法区分。
bash内嵌函数getopts能够处理带参数的选项

1、基本用法
while getopts :xyn: name
do

case $name in
x)
command(s);;
y)
command(s);;
n)
echo "The argument for -n is $OPTARG";;
\?)
command(s);;
esac;

done

说明:
1)x、y和n都是选项。选项x前面有一个冒号:,选项n后面有一个冒号:
2)选项前面的冒号:告诉getopts静默错误报告
3)选项后面的冒号:表示选项需要一个用空格与它间隔开的参数,参数是非破折号开头的单词。-n选项就需要参数。
4)没有破折号的选项告诉getopts已经到了选项清单的末尾。当getopts没有参数可处理时,返回一个非0退出状态值,导致while循环终止。
5)每次调用getopts时,它把从位置参量读取的合法选项赋值给指定的变量(例子中为name),如果不合法,就把问号?赋值给变量。
6)选项参数保存在变量OPTARG中。
7)变量OPTIND初始值为1,并在getopts每处理完一个命令行参数后增加1,因此$OPTIND=$#+1。

=-=-=-=-=
Powered by Blogilo