bash:在case语句中,转到其他case语句

bash:在case语句中,转到其他case语句,bash,Bash,我正在尝试编写一个脚本,其中使用选项操纵变量,但如果没有指定选项,则会有快捷方式。例如,我有添加、显示、设置、和删除,但如果我没有指定其中任何一项,则会解释输入以确定要执行的操作: 脚本键是脚本显示键 script key=value是script set key=value 我为选项编写了一个case语句,但在catchall中,是否可以说“转到案例X” 编辑 我想到了: case $1 in add) #blah;; delete) #bl

我正在尝试编写一个脚本,其中使用选项操纵变量,但如果没有指定选项,则会有快捷方式。例如,我有
添加
显示
设置
、和
删除
,但如果我没有指定其中任何一项,则会解释输入以确定要执行的操作:

  • 脚本键
    脚本显示键
  • script key=value
    script set key=value
我为选项编写了一个
case
语句,但在catchall中,是否可以说“转到案例X”

编辑

我想到了:

case $1 in
    add)
        #blah;;
    delete)
        #blah;;
    set|*=*)
        #blah;;
    show|*)
        #blah;;
    esac
它几乎可以工作,但现在如果没有最后一个参数(即我只执行
script
),它将尝试运行
script show

尝试:

case $1 in
    add)
        #blah;;
    show|*)
        #blah;;
    set|*=*)
        #blah;;
    delete)
        #blah;;
    *)
        echo "FAILURE!!!"
        exit 1
    esac

我建议您的代码结构如下:

if [[ -z $1 ]]; then
    echo "FAILURE!!!"
    exit 1
fi

case $1 in
    add)
        #blah;;
    set|*=*)
        #blah;;
    delete)
        #blah;;
    show|*)
        #blah;;
esac
i、 e.在点击
case
语句之前失败,并使用
|
组合每个case的模式。

您可以使用
“${1?arg needed}”
而不是
case
开头的
$1
使脚本在未提供
$1
时失败

case "${1?arg needed}" in
   add)
      echo "add";;
   delete)
      echo "delete";;
   set|*=*)
      echo "set";;
   show|*)
      echo "show";;
esac
对此进行测试:

bash ./script
-bash: 1: arg needed

bash ./script foobar
show

bash ./script abc=123
set

抱歉,我没有看到您的upate:-)
*
与空字符串匹配
?*
不会。因此,如果我将大小写更改为
show |?*)
我可以使用标准的
*)
catchall将其保留为单个
大小写?i、 它应该是。不过,我并不完全喜欢走捷径。如果您有一个名为
show
的键怎么办?这与我有一个关键字names
add
delete
set
的问题是一样的。在这3种情况下,用户必须使用
script show[key]
,并且
show
快捷方式将无效,这很有意义。不过,出于好奇,
if[[-z$1]]
if[$#-lt 2]]
之间有什么区别吗?
$1
可以解释为空字符串:
somecommand”“a b c d e f g h i
。在这里,
$1
是空的,但是
$#
比2大得多。@ewook chepner说的话!)任何
$1
值,而不是
添加
将进入您的
显示|*)
分支;换句话说:永远不会到达所有剩余的分支。
bash ./script
-bash: 1: arg needed

bash ./script foobar
show

bash ./script abc=123
set