Shell getopts用于获取参数

时间:2013-01-22 10:46:29

标签: linux bash shell debian

我有一个脚本应该作为这两个中的一个运行:

script.sh -t TYPE
script.sh -t TYPE -f FILE
  • 如果没有-t标志运行我想让它出错并退出。
  • 如果使用-t标志运行,我想获取值并将其存储在a中 变量名为“$ TYPE”并打印“JUST $ TYPE”
  • 如果使用-f标志运行,我希望它获取值并将其存储在名为的变量中 “$ FILE”并打印“$ TYPE和$ FILE”

从这里和互联网上的信息和教程来看,这是我能得到的最接近的。任何人都可以帮我把第二个条件放入现有的代码吗?

while getopts ":t:" opt; do
  case $opt in
    a)
      echo "JUST $OPTARG" >&2
      ;;
    \?)
      echo "Error - Invalid type argument" >&2
      exit 1
      ;;
    :)
      echo "Error - No type argument" >&2
      exit 1
      ;;
  esac
done

2 个答案:

答案 0 :(得分:4)

我认为你应该如何处理命令行参数。

常见的方法是所有参数的处理先于程序/脚本的实际作业。

如果选项附加冒号,则更多(与getopts相关),表示该选项应具有参数。

您的case语句看起来人口过多。您不需要测试冒号和问号。整个测试可以在while循环

之后进行

我会这样做

#!/bin/bash
unset TYPE
unset FILE

#uncomment if you want getopts to be silent
#OPTERR=0

while getopts "t:f:" opt; do
  case $opt in
    t)
      TYPE=$OPTARG
      echo "JUST $OPTARG"
      ;;
    f)
      FILE=$OPTARG
      ;;
  esac
done

if ! test "$TYPE" ; then
    echo "-t is obligatory"
    exit 1
fi

if test "$TYPE" && test "$FILE" ; then
    echo "$TYPE and $FILE"
fi

答案 1 :(得分:2)

看看这个:

TYPE=""
FILE=""

while getopts "t:f:" opt; do
    case $opt in
        t)  TYPE="$OPTARG"
            ;;
        f)  FILE="$OPTARG"
            ;;
    esac
done

if [ -z "$TYPE" ]; then
  echo "No -t. Bye."
  exit 1 # error
else
  if [ -n "$FILE" ]; then
    echo "$TYPE and $FILE"
  else
    echo JUST $TYPE
  fi
fi