【问题标题】:Problem in passing command line arguments using getopts使用 getopts 传递命令行参数的问题
【发布时间】:2019-09-03 18:44:41
【问题描述】:

我正在尝试使用 getopts 将命令行参数传递给我的工作流脚本,但代码会引发错误

下面是传递命令行参数的sn-p代码

# take strings as arguments.
while getopts "TDNUW:" opt; do
  case "$opt" in
     T) T="$OPTARG" ;;
     D) D="$OPTARG" ;;
     N) N="$OPTARG" ;;
     U) U="$OPTARG" ;;
     W) W="$OPTARG" ;;
     \?) echo "Usage:[-T T1wfilename] [-D Dfilename] [-N Stream_Number] [-U User] [-W Workflow]";;

    esac
  done 
 shift $(expr $OPTIND - 1)

#Subjects Directory with $U : UserId

SUBJECTS_DIR=/Bio/Bmax/data/imaging_data/$U

#Subjects path with $W : workflow number    

SUBJECT_PATH=$SUBJECTS_DIR/$W

我尝试使用选项调用脚本

./code.sh -T dummy_t1t2.nii.gz -D dummy_dti.nii.gz -N 100000 -U Markus -W Workflow_000000000000334

我遇到了一个错误

Error: input image /Bio/Bmax/data/imaging_data/// not valid

我通过命令行传递的参数没有被代码解释,有人可以给我一些提示,为什么我的脚本无法识别这些参数。

【问题讨论】:

  • 你没有给变量 U 和 W 赋值,你期待什么?
  • 我正在为参数-U和-W分配-U Markus -W Workflow_000000000000334两个值,是不是分配变量的方法不对?
  • ":TDNUW" - 您指定的选项都没有任何参数。 getopts 需要知道哪些选项需要参数,哪些不需要
  • 但是optarg 现在不关心这个了。来自man optargIf a character is followed by a <colon>, the option shall be expected to have an argument 如果不是,那就不是。
  • @KamilCuk,所以我应该在选项后使用冒号吗?

标签: bash shell getopts


【解决方案1】:

您需要手动分配要使用的变量。 getopts 不会为您完成这项工作。

您需要在每个字母选项后添加一个: 来告诉getopts 这是一个带参数的选项。

while getopts "T:D:N:U:W:" opt; do
  case "$opt" in
     T) T="$OPTARG" ;;
     D) D="$OPTARG" ;;
     N) N="$OPTARG" ;;
     U) U="$OPTARG" ;;
     W) W="$OPTARG" ;;
     \?) echo "Usage:[-T T1wfilename] [-D Dfilename] [-N Stream_Number] [-U User] [-W Workflow]" ;;
    esac
 done 
 shift $((OPTIND - 1))

【讨论】:

    最近更新 更多