Linux 获取参数的Shell getops

Linux 获取参数的Shell getops,linux,bash,shell,debian,Linux,Bash,Shell,Debian,我有一个脚本,它应该作为以下两个脚本之一运行: script.sh -t TYPE script.sh -t TYPE -f FILE 如果它在没有-t标志的情况下运行,我希望它出错并退出 如果它是使用-t标志运行的,我想获取该值并将其存储在 变量名为“$TYPE”并打印“JUST$TYPE” 如果它使用-f标志运行,我希望它获取值并将其存储在一个名为 “$FILE”并打印“$TYPE和$FILE” 从这里和互联网上的信息和教程来看,这是我能得到的最接近的。有人能帮我把第二个条件放进现有的

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

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

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

我想您可能会对如何处理命令行参数感到困惑

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

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

你的
案例
陈述看起来也人满为患。你不需要测试冒号和问号。整个测试可以放在
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

非常感谢你的帮助。这对#有用吗/bin/sh也是吗?我不知道
/bin/sh
后面是什么shell,但我会尝试一下。严格来说,不是。如果shell不支持
getopts
命令,可以使用一个外部程序
getopt
,来处理选项。