在 Bash 中使用案例语句

在编写 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*) 将匹配两者 linuxlinus.

最后,你 以结束case语句 esac. 这让它知道您已经列出了您希望它处理的所有内容,例如 done 会做 for 或者 while 环形。

要记住完成案例陈述的关键字,请记住 esaccase 向后。

实践中的案例陈述 – 论据检查

在我自己的编程中经常使用 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 的基础知识。

有任何问题,或者有些事情不太正常? 欢迎在下方发表评论,我会尽力回复!