例如:
if [ "$a" ];then echo '$a' is not none;else echo '$a' undefined or empty;fi if [ ! -d ~/.ssh ];then mkdir ~/.ssh chown -R $USER.$USER ~/.ssh chmod 700 ~/.ssh fi if 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 1 fi casecase常用于确定的分支判断。比如:
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 esaccase用法基本要求:
除最后一个分支外,每个分支都以;;结尾,否则出现分支穿透(所以;;不是必须的)
分支条件可以使用通配符号
分支条件中可使用竖线隔开多个条件,表示只要匹配其中之一就执行该分支
最后一般会定义一个能匹配其它任意条件的默认分支,即*)
for循环有两种for循环结构:
# 成员测试类语法 for i in word1 word2 ...;do cmd_list;done # C语言for语法 for (( expr1;expr2;expr3 ));do cmd_list;done成员测试类的for循环中,in关键字后是使用空格分隔的一个或多个元素,for循环时,每次从in关键字后面取一个元素并赋值给i变量。
例如:
$ for i in 1 2 3 4;do echo $i;done 1 2 3 4 $ for i in 1 2 "3 4";do echo $i;done 1 2 3 4C语言型的for语法中,expr1是初始化语句,expr2是循环终点条件判断语句,expr3是每轮循环后执行的语句,一般用来更改条件判断相关的变量。
for ((i=1;i<=3;++i));do echo $i;done 1 2 3 while循环 while test_cmd_list;do cmd_list;donewhile循环,开始时会测试test_cmd_list,如果测试的退出状态码为0,则执行一次循环体语句cmd_list,然后再测试test_cmd_list,一直循环,直到测试退出状态码非0,循环退出。
例如:
let i=1,sum=0; while [ $i -le 10 ];do let sum=sum+i let ++i done还有until循环语句,但在Shell中用的很少。
while循环经常会和read命令一起使用,read是Bash的内置命令,可用来读取文件,通常会按行读取:每次读一行。
例如:
cat /etc/fstab | while read line;do let num+=1 echo $num: $line done上面的命令行中,首先cat进程和while结构开始运行,while结构中的read命令从标准输入中读取,也就是从管道中读取数据,每次读取一行,因为管道中最初没有数据,所以read命令被阻塞处于数据等待状态。当cat命令读完文件所有数据后,将数据放入到管道中,于是read命令从管道中每次读取一行并将所读行赋值给变量line,然后执行循环体,然后继续循环,直到read读完所有数据,循环退出。
但注意,管道两边的命令默认是在子Shell中执行的,所以其设置的变量在命令执行完成后就消失。换句话说,在父Shell中无法访问这些变量。比如上面的num变量是在管道的while结构中设置的,除了在while中能访问该变量,其它任何地方都无法访问它。
如果想要访问while中赋值的变量,就不能使用管道。如果是直接从文件读取,可使用输入重定向,如果是读取命令产生的数据,可使用进程替换。
while read line;do let num1+=1 echo $num1: $line done </etc/fstab echo $num1 while read line;do let num2+=1 echo $num2: $line done < <(grep 'UUID' /etc/fstab)