shell 的使用(其二 分支 循环语句)
一,shell 判断语句:
1,Shell中用if、then、elif、else、fi(if 语句的结束)这几条命令实现分支控制
#! /bin/sh # : 表示空命令 永远为真的意思 if :;then echo "alwsys true";fi echo "Is it morning? Please answer yes or no." # 此处是读取键盘操作!讲键盘输入保存到变量之中 read YES_OR_NO if [ "$YES_OR_NO" = "yes" ]; then echo "Good morning!" elif [ "$YES_OR_NO" = "no" ]; then # 加不加" " 是等价的 echo Good afternoon! else echo "Sorry, $YES_OR_NO not recognized. Enter yes or no." exit 1 fi # 设置状态为 0,也就是 echo $? 为0 exit 0 # 如果 输入了 no echo $? 不在为 1 因为执行下面语句更改为 0 if :;then echo "alwsys true";fi
第二种 判断语句写法:
1,Shell还提供了&&和||语法,
2,&&相当于“if...then...”,而||相当于“if not...then...”
test "$(whoami)" != 'root' && (echo you are using a non-privileged account; exit 1) test "$(whoami)" != 'admin' || (echo you are not using a non-privileged account; exit 1)
二,shell case 语句的使用:
1,相当于 C语言的switch/case语句,esac表示case语句块的结束
2,很多服务的启动脚本是使用的 case 实例
#! /bin/sh echo "Is it morning? Please answer yes or no." # 读取键盘输入 保存到 YES_OR_NO 变量之中 read YES_OR_NO case "$YES_OR_NO" in yes|y|Yes|YES) # 语法格式是 半括号 echo "Good Morning!";; # ;; 表示 break 的意思 [nN]* 正则匹配 [nN]*) echo "Good Afternoon!";; *) echo "Sorry, $YES_OR_NO not recognized. Enter yes or no." exit 1;; esac exit 0
执行 reboot -f 命令时
在/etc/init.d/reboot 启动脚本之中是这么使用的!
do_stop () { # Message should end with a newline since kFreeBSD may # print more stuff (see #323749) log_action_msg "Will now restart" reboot -d -f -i } # 捕获键盘输入 case "$1" in start) # No-op ;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2 exit 3 ;; stop) do_stop ;; status) exit 0 ;; *) echo "Usage: $0 start|stop" >&2 exit 3 ;; esac
for 与 while 循环的使用 for--do--done while--do--done
#! /bin/sh # for 循环的使用! for FRUIT in apple banana pear; do echo "I like $FRUIT" done # 密码输入三次就退出! echo "Enter password:" read TRY num=1 while [ "$TRY" != "secret" ]; do echo "Sorry, try again" num=$(($num+1)) if [ $num -gt 3 ];then # \n 表示换行 echo '\nYou can only try three times at most.' break fi read TRY done