bash 条件语句

时间:2020-03-05 15:31:45  来源:igfitidea点击:

在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语句。