Shell脚本深入教程(1):快速入门 (5)

例如:

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 case

case常用于确定的分支判断。比如:

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 esac

case用法基本要求:

除最后一个分支外,每个分支都以;;结尾,否则出现分支穿透(所以;;不是必须的)

分支条件可以使用通配符号

分支条件中可使用竖线隔开多个条件,表示只要匹配其中之一就执行该分支

最后一般会定义一个能匹配其它任意条件的默认分支,即*)

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 4

C语言型的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;done

while循环,开始时会测试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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwzjd.html