使用 Bash 编写 Shell 脚本进行 Linux 管理 - 第二部分
设置
有关设置工作区的其他上下文,请查看本系列中的第一个指南《Linux 中的用户和组管理》以及使用 Bash 进行 Linux 管理的 Shell 脚本 - 第 1 部分》。
Shell 脚本的条件语句
当您需要根据条件执行不同的一系列命令时,shell 提供了标准的if/elif/else结构,类似于大多数编程语言。
基本条件语句的语法以伪代码显示如下。请注意,在左括号后和右括号前必须有一个空格:
if [ condition 1 ]
then
commands
elif [ condition 2 ]
commands
else
commands
fi
elif部分是可选的,仅在需要测试通过if指定的条件的特定替代方案时使用。
我们用下面的例子来说明:
#!/bin/bash
CURRENTDAYOFTHEMONTH=$(date +%d)
if [ $CURRENTDAYOFTHEMONTH -le 10 ]
then
echo "We are within the first 10 days of the month";
elif [ $CURRENTDAYOFTHEMONTH -le 20 ]
then
echo "We are within the first 20 days of the month";
else
echo "We are within the last 10 days of the month";
fi
上述脚本根据当前月份的日期返回不同的消息。第一个if测试当前日期是否小于或等于 10。如果此条件的计算结果为真,则显示消息我们处于本月的前 10 天内,而不测试其他条件。否则, elif检查$CURRENTDAYOFTHEMONTH是否小于或等于 20。如果是这种情况,则将返回我们处于本月的前 20 天内。如果先前的条件均不满足,则将应用默认的else块,返回我们处于本月的最后 10 天内。
循环
有时,某些任务需要重复执行固定次数或直到满足指定条件。这时 for 和 while 循环结构就派上用场了。此外,有时您需要一个脚本来根据给定变量的值在不同的行动方案之间进行选择 - 我们将使用 case 语句来实现这一点。
For 循环
此循环结构用于对已知项列表的每个元素进行操作。此类列表可以明确指定(通过逐个列出每个元素)或作为命令的结果。for 循环的基本语法在以下伪代码中说明:
for variable-name in list
do
Run command on variable-name as $variable-name
done
变量名是任意名称,代表每次迭代期间列表中的一项。
例如,我们可以使用for循环轻松将文件file1.txt、file2.txt和file3.txt的权限更改为640 :
for FILE in file1.txt file2.txt file3.txt
do
chmod 640 $FILE
done
在上面的例子中,名为FILE的变量在循环内部(do和done行之间)用作$FILE。在第一次、第二次和第三次迭代中,$FILE分别代表file1.txt、file2.txt和file3.txt。
另一种方法是使用ls命令提供文件列表,并使用 grep仅返回名称以单词file开头的文件。
for FILE in $(ls -1 | grep file)
do
chmod 640 $FILE
done
这会产生与前面的示例相同的结果。
While 循环
与for循环相反,while循环通常用于事先不知道迭代次数或不宜使用for 的情况。示例包括但不限于逐行读取文件、增加或减少变量值直至达到给定值,或响应用户输入。
while循环的基本语法是:
while condition is true
do
Run commands here
done
为了说明这一点,我们来看两个例子。首先,我们逐行读取/etc/passwd文件并返回一条消息,其中显示每个用户名及其对应的 UID。这是一个需要重复迭代不确定次数的情况的例子。
UID,即用户 ID,是一个整数,用于在/etc/passwd 的第三个字段中标识每个用户。可以使用 id 命令加上用户名来返回每个帐户的 UID。
while read LINE
do
USERNAME=$(echo $LINE | cut -d':' -f 1)
USERID=$(echo $LINE | cut -d':' -f 3)
echo "The UID of $USERNAME is $USERID"
done < /etc/passwd
在此示例中,每次迭代开始时检查的条件是是否已到达文件末尾。名为LINE的变量表示/etc/passwd中的每一行。使用<重定向运算符将此文件设置为循环的输入。读取每一行时,第一个和第三个字段的内容分别存储在USERNAME和USERID中。
让我们看一下 while 循环的输出,我们已将其保存在当前工作目录中名为users.sh的脚本中。输出的内容可能因系统而异,具体取决于用户帐户的数量和名称。
最后,让我们在名为guess.sh的脚本中编写一个简单的猜数字游戏。启动脚本时,会生成一个介于 1 和 10 之间的随机数,并将其存储在变量RANDOMNUM中。然后,脚本将等待用户的输入,并指示猜测是否正确、小于或大于正确数字。此过程将持续进行,直到用户正确猜出数字。在此示例中,$NUMBER != $RANDOMNUM括在方括号中,以准确指示要测试的条件是什么。
#!/bin/bash
RANDOMNUM=$(shuf -i1-10 -n1)
NUMBER=0
while [ $NUMBER != $RANDOMNUM ]
do
read -p "Enter a number between 1 and 10: " NUMBER
done
echo "Congratulations! Your guess was right!"
下图展示了我们的游戏实际运行情况:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~