在编写 Bash 脚本时,通常会根据变量检查字符串,然后根据指定的内容执行某些操作。
考虑以下脚本。 它检查用户指定的第一个参数,并根据给定的内容执行不同的操作:
#!/usr/bin/env bash
if [[ "${1}" == "" ]]; then
echo "No shape was specified."
elif [[ "${1}" == "square" ]]; then
echo "You specified 'square'."
elif [[ "${1}" == "circle" ]]; then
echo "You specified 'circle'."
elif [[ "${1}" == "triangle" ]]; then
"You specified 'triangle'."
else
echo "Unknown shape '${1}'."
exit 1
fi
这演示了一个简单的任务,尽管没有功能,但可以将已知形状重复给用户,或者如果形状未知,则显示错误消息。
一切都很好,花花公子,一切都按预期工作。 但是看看有多少行。 了解您必须如何处理用户通过的每个选项 elif
陈述?
现在成像这个程序有更多的选择,比如说 20。使用当前的方法,你将编写一个 if
带有 20 的声明 elif
里面的部分。
是的,您可能大部分时间都可以阅读它。 但它笨重,占用太多空间,最重要的是,有更好的选择。
在 Bash 中引入 case 语句
这就是 case 语句的用武之地。与 if
陈述。
相同 if
您用来检查提供的选项的语句可以在案例一中重写,如下所示:
#!/usr/bin/env bash
case "${1}" in
"") echo "No option was specified."; exit 1 ;;
square) echo "You specified 'square'." ;;
circle) echo "You specified 'circle'." ;;
triangle) echo "You specified 'triangle'." ;;
*) echo "Unknown shape '${1}'."; exit 1 ;;
esac
看看看起来多么简单和有条理。 也就是 12 行代码 if
声明,并且只有 7 个 case
一。 你允许的选项越多,差异就越大。
那就是 case
声明闪耀。 虽然两者都完全清晰,尤其是少量, case
从长远来看,语句只会让一切变得更干净、更易于维护。
如何在 Bash 中创建 case 语句?
案例陈述很容易理解,只需一点点练习。 有了这个,这里是正在发生的事情的基础知识:
你看到的第一行是 case ${1} in
. 这 ${1}
给出将被检查的字符串,这里是传递给脚本的第一个参数。
为了 example,考虑这个案例陈述:
case linux in
windows) echo "windows" ;;
macos) echo "macos" ;;
linux) echo "linux" ;;
esac
在这个 example,它会一直运行 echo "linux"
. 这 case *string* in
部分只是指定您将检查的字符串,然后它下面的选项将在找到匹配项时运行命令。
接下来,您开始指定您的选项。 记住,你有 ""
, square
, circle
, triangle
, 和 *
作为您的第一个脚本中的选项。
Case 语句从上到下检查,并且仅在第一个匹配时运行。 考虑以下 example:
case linux in
linux) echo "linux" ;;
windows) echo "windows" ;;
linux) echo "linux 2.0" ;;
esac
在这里,唯一可以运行的命令是 echo "linux"
. 然后将跳过第二个匹配项,因为已经找到了一个匹配项。
case 语句中的每一行也必须以 ;;
. 这表示选项命令列表的结束,并且不应处理更多命令。
case 语句中的参数列表( linux)
和 windows)
零件还支持通配符。 因此,输入类似 linu*)
将匹配两者 linux
和 linus
.
最后,你 以结束case语句 esac
. 这让它知道您已经列出了您希望它处理的所有内容,例如 done
会做 for
或者 while
环形。
要记住完成案例陈述的关键字,请记住 esac
是 case
向后。
实践中的案例陈述 – 论据检查
在我自己的编程中经常使用 case 语句来检查参数列表。
假设您允许为您的程序提供以下选项:
--vertical
--add-txt
--replace
--verify
要在 case 语句中检查这一点,您可以使用如下内容:
while [[ "${1}" != "" ]]; do
case "${1}" in
--vertical) verticle="true" ;;
--add-txt) add_txt="true" ;;
--replace) replace="true" ;;
--verify) verify="true" ;;
esac
shift 1
done
这运行一个 while
循环while ${1}
(给脚本的第一个参数)不为空。 然后它检查参数列表,并在设置提供的选项时分配变量。
在检查 case 语句后,它会运行 shift 1
,导致值 ${2}
(提供给脚本的第二个参数)移动到的值 ${1}
,并针对新的重复此操作 ${1}
(以前是 ${2}
) 直到 ${1}
没有设置任何东西。
你去吧! 这就是使用 case 语句的所有基础知识。
总结
案例语句可以帮助您更快、更有效地编写代码。 从长远来看,它们还有助于使事情更加清晰和可维护。
如果您是 Bash 新手,您可以在我们的 Bash 初学者系列中从头开始学习 Bash 的基础知识。
有任何问题,或者有些事情不太正常? 欢迎在下方发表评论,我会尽力回复!