shell 脚本文件中如何处理多个选项参数?

新手上路,请多包涵

如下代码

# test.sh

while getopts "n:r:h" opt; do
      case $opt in
             n)
                 nValue=$OPTARG
                 ;;
             r)
                 rValue=$OPTARG;
                 ;;
             h)
                  help
                  exit 0
                  ;;
       esac
done
echo nValue
exit 0

当我输入 ./test.sh -n -r 123 时, 控制台 nValue 的输出值为 -r ,既 -r 参数名称变成了 -n 参数的值,请问如何避免第二个参数的名称变成第一个参数的值这种情况?

阅读 1.5k
avatarAI BotBETA

在你的 shell 脚本中,问题出在你在处理参数时没有正确地跳过 getopts 命令将参数分解为选项和值。在你的例子中,-n 选项的值被设置为了 -r,因为 -r 选项并没有跟随一个参数值。

你需要在输入 -r 选项时为其提供一个值。你可以通过在选项后面添加一个冒号来告诉 getopts 你期望的参数值。修改后的代码如下:

# test.sh

while getopts "n:r::h" opt; do
      case $opt in
             n)
                 nValue=$OPTARG
                 ;;
             r)
                 rValue=$OPTARG;
                 ;;
             h)
                  help
                  exit 0
                  ;;
       esac
done
echo nValue: $nValue
echo rValue: $rValue
exit 0

现在,当你输入 ./test.sh -n -r 123 时,它将正确地输出 nValue: -nrValue: 123。注意,getopts 允许为选项提供多个参数值。例如,如果你输入 ./test.sh -r 123 -r 456,那么 rValue 的值将是 123456

2 个回答

去掉 n 后面的 :
nr:h

新手上路,请多包涵
#!/bin/bash

# 定义帮助函数(可选)
help() {
    echo "Usage: ./test.sh [-n <值>] [-r <值>] [-h]"
    echo ""
    echo "选项:"
    echo "  -n <值>   设置n的值"
    echo "  -r <值>   设置r的值"
    echo "  -h         显示此帮助信息并退出"
}

# 初始化变量
nValue=""
rValue=""

while getopts "n:r:h" opt; do
    case $opt in
        n)
            nValue=$OPTARG
            ;;
        r)
            rValue=$OPTARG
            ;;
        h)
            help
            exit 0
            ;;
        *)
            echo "无效选项: -$OPTARG" >&2
            help
            exit 1
            ;;
    esac
done

# 输出值或按需处理
echo "nValue: $nValue"
echo "rValue: $rValue"

exit 0
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题