【问题标题】:getopts not working in bash scriptgetopts 在 bash 脚本中不起作用
【发布时间】:2013-08-08 13:14:36
【问题描述】:
#! bin/bash
# code for train.sh
   while getopts "f:" flag
    do
         case $flag in 
             f)
               echo "Hi" 
               STARTPOINT = $OPTARG
               ;;
         esac
    done

    echo Test range: $4
    echo Train range: $3

    #path of experiment folder and data folder:
    EXP_DIR="$1"
    DATA_DIR="$2"
    echo Experiment: $EXP_DIR
    echo DataSet: $DATA_DIR
    echo file: $STARTPOINT


I ran the command > ./train.sh test1  test2 test3 test4  -f testf  

得到输出

Test range: test4
Train range: test3
Experiment: test1
DataSet: test2
file:

因此 getopts 选项似乎由于某种原因不起作用,因为您可以看到文件后没有打印任何内容,并且在 case 语句中未执行 echo "Hi" 命令。谁能帮我解决这个问题?

【问题讨论】:

    标签: bash unix


    【解决方案1】:

    你需要在裸参数前加上任何选项

    ./train.sh -f testf test1  test2 test3 test4
    

    有输出

    Hi
    Test range: test4
    Train range: test3
    Experiment: test1
    DataSet: test2
    file: testf
    

    你也需要一些改变

    while getopts "f:" flag
    do
         case $flag in
             f)
               echo "Hi" 
               STARTPOINT=$OPTARG
               shift
               ;;
         esac
         shift
    done
    

    设置环境变量并将 got 选项移开

    【讨论】:

    • 是否可以在位置参数之后有 getopts 或者必须在位置参数之前?为什么要使用两班轮班,一班内班,一班外?
    • 一个转变是处理-f,另一个是处理testf。因此,如果有一个不带参数的选项,代码会更通用。您可能可以shift 关闭您的裸参数,然后调用getopt 处理之后的任何选项
    【解决方案2】:

    两点:

    1. 选项解析必须在非选项解析之前进行。
    2. 删除选项的转移可以发生一次,毕竟所有选项 已解析。

    while 上使用的getopts 函数不需要在循环内进行移位。但是,在while getopts 完成后,需要进行一次移位 以处理非选项参数。变量OPTIND表示下一个要解析的非选项的索引,这个值可以用在shift命令中。

    这是一个示例,其中我还包括“help”、“norun”和“verbose”标志的hnv 选项:

    而 getopts 'f:hnv' opt ;做 案例“$ opt”在 h) 用法;; n) 诺伦=1 ;; f) 回声“嗨”; STARTPOINT="$OPTARG" ;; v) 详细=1 ;; 经社理事会 完毕 班次 $(( OPTIND - 1 ))

    【讨论】:

    • 感谢 Aks 的解释。很有帮助
    最近更新 更多