Shell脚本深入教程:Bash流程控制语句
Linux基础系列文章大纲Shell系列文章大纲
Bash流程控制语句if语句123456if test-commands; then consequent-commands;[elif more-test-commands; then more-consequents;][else alternate-consequents;]fi
test-commands既可以是test测试或[]、[[]]测试,也可以是任何其它命令,test-commands用于条件测试,它只判断命令的退出状态码是否为0,为0则为true。
例如:
12345678910111213141516if [ “$a” ];then echo ‘$a’ is not none;else echo ‘$a’ undefined or empty;fiif [ ! -d ~/.ssh ];then mkdir ~/.ssh chown -R $USER.$USER ~/.ssh chmod 700 ~/.sshfiif grep ‘junmajinlong’ /etc/passwd &>/dev/null;then echo ‘User “junmajinlong” already exists…’elif grep ‘malongshuai’ /etc/passwd &>/dev/null;then echo ‘User “malongshuai” already exists…’else echo ‘you should create user,exit…’ exit 1ficase
case常用于确定的分支判断。比如:
1234567891011121314151617while [ “$1” ];do case “$1″ in start) echo start;; stop) echo stop;; restart) echo restart;; reload | force-reload) echo reload;; status) echo status;; *) echo $”Usage: $0 {start|stop|status|restart|reload|force-reload}” exit 2 esacdone
case用法基本要求:
每个小分句中的pattern部分都使用括号『()』包围,只不过左括号『(』不是必须的 每个小分句的pattern支持通配模式匹配,可使用『|』分隔多个通配模式,表示满足其中一个模式即可 例如([yY]|yY][eE][sS]])表示即可以输入单个字母的y或Y,还可以输入yes三个字母的任意大小写格式 最后一般会定义一个能匹配其它任意条件的默认分支,即(*) 除最后一个分支外,每个分支都建议以;;结尾,但还支持其它结尾符号:;&或;;&,这三个结尾符号分别表示:;;结尾符号表示小分句执行完成后立即退出case语句 ;&表示继续执行下一个小分句的命令体,而无需进行匹配动作,并由此小分句的结尾符号来决定是否继续操作下一个小分句 ;;&表示继续向后(不止是下一个,而是一直向后)匹配小分句,如果匹配成功,则执行对应小分句中的command部分,并由此小分句的结尾符号来决定是否继续向后匹配
例如:
1234567891011121314151617181920212223set — ycase “$1” in ([yY]|[yY][eE][sS]) echo yes;& ([nN]|[nN][oO]) echo no;; (*) echo wrong;;esacyesnoset — ycase “$1” in ([yY]|[yY][eE][sS]) echo yes;;& ([nN]|[nN][oO]) echo no;; (*) echo wrong;;esacyeswrongfor循环
有两种for循环结构:
12345# 成员测试类语法for i [ [in [words …] ] ; ] do commands; done# C语言for语法for (( expr1;expr2;expr3 ));do cmd_list;done
成员测试类的for循环中,in关键字后是默认使用空格分隔的一个或多个元素,for循环时,每次从in关键字后面取一个元素并赋值给i变量。
例如:
1234$ for i in 1 2 “3 4”;do echo $i;done123 4
如果省略in words,则等价于in “[email protected]”,即迭代位置参数。例如:
123set — a b cfor i do echo $i;donefor i;do echo $i;done
C语言型的for语法中,expr1是初始化语句,expr2是循环终点条件判断语句,expr3是每轮循环后执行的语句,一般用来更改条件判断相关的变量。
1234for ((i=1;i/dev/null) && source_flag=1 || source_flag=0# 方案二:使用$0和$BASH_SOURCE[0]# 在a.sh脚本中source b.sh,那么b.sh中的:# $0 = a.sh, $BASH_SOURCE[0]=b.sh[ “$0” != “$BASH_SOURCE” ] && source_flag=1 || source_flag=0