bash 条件语句
在Bash中使用if语句
任何决策结构中最基本的构建体都是一种情况。
基本IF语句的一般语法如下:
if [ condition ]; then your code fi
“if”语句以“fi”结束(与if相反)。
注意空格!
- 打开和关闭括号之间必须有一个空间,以及写入的条件。否则,shell会抱怨错误。
- 条件运算符(=,==,<=等)之前和之后必须存在空间。否则,我们将看到类似"Unary Operator Interpertan"的错误。
现在,让我们创建一个示例脚本root.sh.如果将脚本运行为root用户,则此脚本将暂停"我们是root"的语句:
#!/bin/bash if [ $(whoami) = 'root' ]; then echo "You are root" fi
"whoami"命令输出用户名。
从BASH变量教程中,我们知道"$(命令)"语法用于命令替换,它会给我们提供命令的输出。
条件$(whoami)='root'
只有在作为root用户身份登录时才为真。
使用if-else语句
我们可能已经注意到当我们将root.sh脚本运行为常规用户时,我们就不会得到任何输出。
如果在IF条件被评估为FALSE时,则要运行的任何代码可以包含在else语句中,如下所示:
#!/bin/bash if [ $(whoami) = 'root' ]; then echo "You are root" else echo "You are not root" fi
现在,当我们将脚本作为常规用户运行时,我们将被提醒我们不是全能的root用户:
Hyman@theitroad:~$./root.sh You are not root
使用否则在bash中使用否则
只要我们想要同时测试多个表达式(条件),我们就可以使用Elif(else-if)语句。
例如,以下yege.sh bash脚本将年龄作为参数,并将输出与年龄相对应的有意义的消息:
#!/bin/bash AGE= if [ $AGE -lt 13 ]; then echo "You are a kid." elif [ $AGE -lt 20 ]; then echo "You are a teenager." elif [ $AGE -lt 65 ]; then echo "You are an adult." else echo "You are an elder." fi
现在执行几次龄.sh脚本以用不同的年龄测试:
Hyman@theitroad:~$./age.sh 11 You are a kid. Hyman@theitroad:~$./age.sh 18 You are a teenager. Hyman@theitroad:~$./age.sh 44 You are an adult. Hyman@theitroad:~$./age.sh 70 You are an elder.
请注意,我使用$age变量使用了-lt
(小于)测试条件。
也意识到我们可以拥有多个Elif
语句,而是只有一个IF构造中的其他语句,它必须用fi
关闭。
在bash中使用嵌套if语句
我们还可以在另一个IF语句中使用IF语句。
例如,请查看以下天气.sh bash脚本:
#!/bin/bash TEMP= if [ $TEMP -gt 5 ]; then if [ $TEMP -lt 15 ]; then echo "The weather is cold." elif [ $TEMP -lt 25 ]; then echo "The weather is nice." else echo "The weather is hot." fi else echo "It's freezing outside ..." fi
该脚本将任何温度作为参数,然后显示一条反映天气如何的消息。
如果温度大于五,则评估嵌套(内部)IF-ELIF语句。
让我们做一些脚本来查看它是如何工作的:
Hyman@theitroad:~$./weather.sh 0 It's freezing outside ... Hyman@theitroad:~$./weather.sh 8 The weather is cold. Hyman@theitroad:~$./weather.sh 16 The weather is nice. Hyman@theitroad:~$./weather.sh 30 The weather is hot.
在BASH中使用案例语句
我们还可以使用Bash中的案例语句替换多个IF语句,因为它们有时会令人困惑,并且难以阅读。
案例构造的一般语法如下:
case "variable" in "pattern1" ) Command … ;; "pattern2" ) Command … ;; "pattern2" ) Command … ;; esac
请注意!
- 模式始终是空白符和
)
。 - 命令始终是双分号
;;
。白色空间不是强制性的。 - 案例语句以"esac""结束(案例相反)。
在处理模式匹配或者正则表达式时,案例语句特别有用。
要演示,请查看以下char.sh bash脚本:
#!/bin/bash CHAR= case $CHAR in [a-z]) echo "Small Alphabet." ;; [A-Z]) echo "Big Alphabet." ;; [0-9]) echo "Number." ;; *) echo "Special Character." esac
该脚本将一个字符作为参数,并显示字符是否为小/大字母,数字或者特殊字符。
Hyman@theitroad:~$./char.sh a Small Alphabet. Hyman@theitroad:~$./char.sh Z Big Alphabet. Hyman@theitroad:~$./char.sh 7 Number. Hyman@theitroad:~$./char.sh $ Special Character.
请注意,我已使用通配符星号符号(*)来定义默认情况,该默认情况是在IF条件下等效的其他语句。
BASH中的测试条件
有许多测试条件我们可以与IF语句一起使用。
如果我们使用数字,字符串或者文件,则测试条件会发生变化。
将它们视为抨击逻辑运算符。
常见的测试条件:
条件 | 等同于 |
---|---|
$a -lt $b | $a <$b |
$a-gt $b | $a> $b |
$a -le $b | $a <= $b |
$a -ge $b | $a> = $b |
$a -eq $b | $a等于$b |
$a-ne $b | $a不等于$b |
-e $FILE | $文件存在 |
-D $FILE | $文件存在,并且是一个目录。 |
-f $FILE | $文件存在,是一个常规文件。 |
-L $FILE | $文件存在,是一个软链接。 |
$string1 = $string2 | $string1等于$string2 |
$string1!= $string2 | $string1不等于$string2 |
-z $string1 | $string1是空的 |
幸运的是,我们不需要记住任何测试条件,因为我们可以在测试手册页中查找它们:
Hyman@theitroad:~$man test
让我们创建一个名为filetype.sh的一个名为filetype.sh的最终脚本,它检测文件是常规文件,目录或者软链接:
#!/bin/bash if [ $# -ne 1 ]; then echo "Error: Invalid number of arguments" exit 1 fi file= if [ -f $file ]; then echo "$file is a regular file." elif [ -L $file ]; then echo "$file is a soft link." elif [ -d $file ]; then echo "$file is a directory." else echo "$file does not exist" fi
我通过添加支票数量的参数来改进脚本。
如果没有参数或者多个参数,则脚本将输出消息并退出,而不在脚本中运行其剩余语句。
让我们执行一些脚本来用各种类型的文件测试它:
Hyman@theitroad:~$./filetype.sh weather.sh weather.sh is a regular file. Hyman@theitroad:~$./filetype.sh /bin /bin is a soft link. Hyman@theitroad:~$./filetype.sh /var /var is a directory. Hyman@theitroad:~$./filetype.sh Error: Invalid number of arguments
奖金:如果在一行中的否则否则抨击
到目前为止,我们所看到的所有如果我们所看到的声明都用于适当的Bash脚本。
这是这样做的方式,但你没有义务。
当我们只想看到shell本身的结果,我们可以使用Bash中的单行中的If els语句。
假设你有这个bash脚本。
if [ $(whoami) = 'root' ]; then echo "You are root" else echo "You are not root" fi
我们可以使用这样的单行中的所有If els语句:
if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi
我们可以在终端中复制和粘贴上面的上面并为自己看结果。
基本上,我们只需在命令后添加分号,然后添加下一个if-else语句。