bash:在案例陈述中,转到其他案例

时间:2016-07-08 15:44:45

标签: bash

我试图编写一个脚本,我使用选项操作变量,但如果没有指定选项,则有快捷方式。例如,我有addshowsetdelete,但如果我没有指定其中任何一个,那么输入会被解释为确定要执行的操作:

  • script keyscript show key
  • 的快捷方式
  • script key=valuescript set key=value
  • 的快捷方式

我为选项写了一个case声明,但是在收集中,是否可以说"转到案例X"?:

case $1 in
    add)
        #blah;;
    show)
        #blah;;
    set)
        #blah;;
    delete)
        #blah;;
    *)
        if [[ $1 == *=* ]]; then
            #go to case "set"
        elif [[ $1 ]]; then
            ##go to case "show"
        else
            echo "FAILURE!!!"
            exit 1
        fi
    esac

修改

我想出了:

case $1 in
    add)
        #blah;;
    delete)
        #blah;;
    set|*=*)
        #blah;;
    show|*)
        #blah;;
    esac

哪个几乎有效,但现在如果没有最后一个参数(即我只是执行script),它将尝试运行script show

3 个答案:

答案 0 :(得分:4)

我建议像这样构建你的代码:

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

case $1 in
    add)
        #blah;;
    set|*=*)
        #blah;;
    delete)
        #blah;;
    show|*)
        #blah;;
esac

即。在点击case语句之前失败,并使用|组合每个案例的模式。

答案 1 :(得分:2)

您可以在"${1?arg needed}"开头使用$1代替case,以便在未提供$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

答案 2 :(得分:-2)

尝试:

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