如何使用 getopts 正确解析 shell 脚本标志和参数

如何使用 getopts 正确解析 shell 脚本标志和参数

我正在使用这个:

例如./imgSorter.sh -d directory -f format

脚本的内容是:

#!/bin/bash
while getopts ":d:f:" opt; do
  case $opt in
    d)
      echo "-d was triggered with $OPTARG" >&2
      ;;
    f)
      echo "-f was triggered with $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

用例 :

$ ./imgSorter.sh -d myDir -d was triggered with myDir好的

$ ./imgSorter.sh -d -f myFormat -d was triggered with -fNOK:为什么以 - 开头的字符串没有被检测为标志?

答案1

您已经告诉getopts-d选项应该接受一个参数,并且在您使用的命令行中-d -f myformat清楚地(?)说“-f是我给予该-d选项的参数”。

这不是代码中的错误,而是命令行上脚本的使用错误。

您的代码需要验证选项参数是否正确以及所有选项是否以适当的方式设置。

可能是这样的

while getopts "d:f:" opt; do
  case $opt in
    d) dir=$OPTARG      ;;
    f) format=$OPTARG   ;;
    *) echo 'error' >&2
       exit 1
  esac
done

# If -d is *required*
if [ ! -d "$dir" ]; then
    echo 'Option -d missing or designates non-directory' >&2
    exit 1
fi

# If -d is *optional*
if [ -n "$dir" ] && [ ! -d "$dir" ]; then
    echo 'Option -d designates non-directory' >&2
    exit 1
fi

如果该-d选项是可选的,并且您想使用默认dir对于上面代码中的变量的值,您可以首先在循环dir之前设置为该默认值while

命令行选项不能既接受参数又不接受参数。

相关内容