getopts 在 bash 脚本中不起作用

vka*_*l11 3 unix bash

#! 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  
Run Code Online (Sandbox Code Playgroud)

并得到输出

Test range: test4
Train range: test3
Experiment: test1
DataSet: test2
file:
Run Code Online (Sandbox Code Playgroud)

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

Kee*_*yOn 6

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

./train.sh -f testf test1  test2 test3 test4
Run Code Online (Sandbox Code Playgroud)

带输出

Hi
Test range: test4
Train range: test3
Experiment: test1
DataSet: test2
file: testf
Run Code Online (Sandbox Code Playgroud)

你也需要一些改变

while getopts "f:" flag
do
     case $flag in
         f)
           echo "Hi" 
           STARTPOINT=$OPTARG
           shift
           ;;
     esac
     shift
done
Run Code Online (Sandbox Code Playgroud)

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