如何在 shell 脚本中有一个 case 参数,后跟一个不同的参数?

如何在 shell 脚本中有一个 case 参数,后跟一个不同的参数?

我希望用户输入-s后跟一个数字(例如-s 3)。但是,我似乎无法在现有的旁边传递另一个变量-s。这是我的代码:

echo choose
read choice 
       case $choice in 
       -a) echo you chose a 
        ;;
       -s $num) echo you chose the number $num #this is the -s number (e.g. -s 3) choice.
        ;;
      esac
exit 0

答案1

几乎肯定有更好的方法来处理你正在做的事情。对于初学者,您应该避免提示用户输入任何输入,而是让他们在运行程序时在命令行上提供参数,但修改您的代码以使其工作:

read -rp 'choose: ' choice 
case $choice in 
    -a) echo 'you chose a';;
    -s\ [1-4]) "echo you chose the number ${choice#"-s "}";;
esac

您的num变量似乎没有设置,因此它将扩展为空,使您的案例模式简单-s )并且-s 4不会匹配,-s )因为......好吧,它们不一样。所以我们需要修改它以使其后面有一个数字 ( -s\ [1-4]))。然后我们使用参数扩展来删除-s.


我处理它的方法是使用getopts类似于:

#!/bin/bash

while getopts as: opt; do
    case $opt in
        a) printf '%s\n' 'You have chosen: a';;
        s) n=$OPTARG; printf '%s: %d\n' 'You have chosen s with an argument of' "$n";;
    esac
done

有了这个,您可以在命令行上运行指定参数,例如:

./script.sh -s 4

相关内容