Unix / Linux -壳决策制定

你好,有抱负的程序员们!今天,我们将深入探讨Unix和Linux壳脚本中的决策世界。作为你友好的邻里计算机老师,我将引导你完成这个旅程,一步一步。所以,拿起你最喜欢的饮料,舒服地坐下来,让我们一起开始这次冒险!

Unix / Linux - Decision Making

if...else语句

想象一下,你在代码中面临一个岔路口,需要根据某些条件做出决策。这时,if...else语句就派上用场了。它们就像编程中的交通信号灯,根据条件是真还是假,引导你的代码走向不同的路径。

基本的if语句

让我们从if语句的最简单形式开始:

if [ condition ]
then
command1
command2
...
commandN
fi

这是一个现实世界的例子:

#!/bin/bash
age=18

if [ $age -ge 18 ]
then
echo "Du bist alt genug, um zu wählen!"
fi

在这个例子中,我们检查age变量是否大于或等于18。如果是,将显示消息“Du bist alt genug, um zu wählen!”(你年龄足够大,可以投票!)。

if...else语句

现在,如果条件是假的,我们想要做什么呢?这时else子句就派上用场了:

if [ condition ]
then
command1
command2
...
commandN
else
alternative_command1
alternative_command2
...
alternative_commandN
fi

让我们修改我们的投票例子:

#!/bin/bash
age=16

if [ $age -ge 18 ]
then
echo "Du bist alt genug, um zu wählen!"
else
echo "Entschuldigung, du bist zu jung, um zu wählen."
fi

现在,如果年龄小于18岁,它将显示消息“Entschuldigung, du bist zu jung, um zu wählen.”(抱歉,你太年轻,不能投票。)。

if...elif...else语句

有时,生活(和代码)不仅仅是非黑即白。我们经常需要检查多个条件。这时elif(else if)子句就派上用场了:

if [ condition1 ]
then
command1
elif [ condition2 ]
then
command2
else
alternative_command
fi

让我们创建一个更复杂的例子:

#!/bin/bash
grade=75

if [ $grade -ge 90 ]
then
echo "A - Ausgezeichnet!"
elif [ $grade -ge 80 ]
then
echo "B - Gute Arbeit!"
elif [ $grade -ge 70 ]
then
echo "C - Du hast bestanden."
else
echo "F - Du musst mehr lernen."
fi

这个脚本评估学生的成绩,并根据不同的成绩范围提供相应的反馈。

case...esac语句

现在,想象一下你在一个有多个食物选项的自助餐。这就是编程中的case...esac语句。它允许你将一个值与一系列模式匹配,并根据匹配执行命令。

基本语法如下:

case expression in
pattern1)
command1
command2
...
commandN
;;
pattern2)
command1
command2
...
commandN
;;
*)
default_command
;;
esac

让我们看一个实际的例子:

#!/bin/bash
fruit="apple"

case $fruit in
"apple")
echo "Es ist eine leckere rote Frucht!"
;;
"banana")
echo "Es ist eine gelbe gebogene Frucht!"
;;
"orange")
echo "Es ist eine saftige Zitrusfrucht!"
;;
*)
echo "Ich kenne diese Frucht nicht."
;;
esac

在这个例子中,我们正在将fruit的值与不同的模式匹配。如果它匹配“apple”,它将输出相应的消息。如果它不匹配任何指定的模式,它将执行默认情况(*)。

多个模式

你还可以为同一组命令匹配多个模式:

#!/bin/bash
day=$(date +%A)

case $day in
Monday|Tuesday|Wednesday|Thursday|Friday)
echo "Es ist ein Wochentag. Zeit zu arbeiten!"
;;
Saturday|Sunday)
echo "Es ist das Wochenende. Zeit zu entspannen!"
;;
*)
echo "Auf welchem Planet bist du?"
;;
esac

这个脚本检查当前的星期几,并输出是工作日还是周末。

if...else与case...esac的比较

现在,让我们比较这两种决策结构:

特性 if...else case...esac
复杂性 可以处理复杂条件 最佳用于简单的值匹配
可读性 在许多条件时可能难以阅读 在多个条件时更易读
性能 对于许多条件稍微慢一些 对于许多条件更快
灵活性 可以使用任何类型的条件 限于模式匹配

在我多年的教学过程中,我发现学生们经常在选择if...elsecase...esac之间挣扎。这里有一个简单的经验法则:如果你正在检查单个变量与多个可能值的匹配,case...esac是你的好朋友。对于其他情况,坚持使用if...else

记住,编程就像烹饪。这些决策结构是你的食材,随着实践,你将学会在何时使用每一个来创造完美的菜肴……我是说,脚本!

总之,决策是壳脚本的关键方面。它允许你的脚本适应和响应不同的情况,使它们更强大和灵活。无论你使用if...else还是case...esac,你现在都配备了使脚本更智能的工具。继续练习,很快你将能够比说出“sudo”更快地编写出可以做出决策的脚本!

Credits: Image by storyset