4
#! 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" 命令。谁能帮我解决这个问题?

4

2 回答 2

9

您需要在裸参数之前放置任何选项

./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 选项移开

于 2013-08-08T00:26:16.860 回答
2

两点:

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

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

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

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