2

我有一个脚本应该作为以下两者之一运行:

script.sh -t TYPE
script.sh -t TYPE -f FILE
  • 如果它在没有 -t 标志的情况下运行,我希望它出错并退出。
  • 如果它使用 -t 标志运行,我想获取该值并将其存储在一个名为“$TYPE”的变量中并打印“JUST $TYPE”
  • 如果它使用 -f 标志运行,我希望它获取值并将其存储在名为“$FILE”的变量中并打印“$TYPE and $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
4

2 回答 2

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
于 2013-01-22T12:19:11.023 回答
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
于 2013-01-22T12:16:39.973 回答