在Shell中,if、then、elif、else、fi等命令用于实现分支控制,类似于C语言。这些流程控制语句由多个Shell命令组成。例如:if [ -f ~/.bashrc ]; then ~/.bashrc fi 实际上包括三条命令:if [ -f ~/.bashrc ]、then . ~/.bashrc和fi。如果多条命令写在同一行,则需要用分号;隔开;一行只写一条命令则无需分号。当then后面有换行且命令未写完时,Shell会自动续行,将下一行接在then后面作为一条命令处理。需要注意的是,命令和参数之间必须用空格分隔。
在if命令中,参数构成一条子命令。如果该子命令的Exit Status为0(表示真),则执行then后面的子命令;如果Exit Status非0(表示假),则执行elif、else或fi后面的子命令。如果if后面的子命令为测试命令,也可以是其他命令。Shell脚本没有花括号{}来表示语句块,因此fi表示if语句块的结束。例如:
#! /bin/sh if [ -f /bin/bash ] then echo "/bin/bash is a file" else echo "/bin/bash is NOT a file" fi
此外,还存在一个特殊的命令::,称为空命令,不做任何事,但Exit Status总是真。可以通过/bin/true或/bin/false获取真或假的Exit Status。例如:
#! /bin/sh if :; then echo "always true"; fi
再看一个示例:
#! /bin/sh 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 exit 0
该示例中的read命令用于等待用户输入一行字符串,并将该字符串存储到一个Shell变量中。Shell还提供了&&和||语法,类似于C语言中的短路特性,常用于连接两个命令:
test "$(whoami)" != 'root' && (echo you are using a non-privileged account; exit 1)
&&相当于逗if...then...地,而||相当于逗if not...then...地。&&和||用于连接两个命令,而-a和-o仅用于在测试表达式中连接两个测试条件。例如:
test "$VAR" -gt 1 -a "$VAR" -lt 3 和以下写法是等价的 test "$VAR" -gt 1 && test "$VAR" -lt 3
通过这些技巧,你可以构建复杂的Shell脚本来完成各种任务。
温馨提示:答案为网友推荐,仅供参考