【问题标题】:Shell Script : how to make getopts just read the first character post `-`Shell 脚本:如何使 getopts 只读取第一个字符帖子`-`
【发布时间】:2012-08-01 07:29:12
【问题描述】:

我有一个使用getopts 的shell 脚本testShell.sh,如下所示:

#!/bin/bash
while getopts ":j:e:" option; do
    case "$option" in
        j) MYHOSTNAME=$OPTARG ;;
        e) SCRIPT_PATH=$OPTARG ;;
        *) ;;
    esac
done

echo "j=$MYHOSTNAME"
echo "e=$SCRIPT_PATH"
shift $((OPTIND - 1))
echo "remaining=$@"

当我像下面这样测试运行它时:

$ testShell.sh  -jvalue1 -evalue4 -Djvalue3  -pvalue2

我得到的输出如下:

j=value3
e=2
remaining=

但我希望输出为:

j=value1
e=value4
remaining=-Djvalue3 -pvalue2

是否可以确保 getopts 只查看第一个字符帖子 - 符号? 这样它就不会'将-Djvalue3 解释为-jvalue3,将-pvalue2 解释为-e2

【问题讨论】:

  • 请不要多发:也在superuserunix&linux 上问过
  • 我会确保不再这样做。但我非常需要这个,绝望地这样做了。

标签: bash shell parameters getopt


【解决方案1】:

你可以在j)后面加个休息:

#!/bin/bash
while getopts ":j:e:" option; do
    case "$option" in
        j) MYHOSTNAME=$OPTARG ; break ;;
        e) SCRIPT_PATH=$OPTARG ;;
        *) ;;
    esac
done

echo "j=$MYHOSTNAME"
echo "e=$SCRIPT_PATH"
shift $((OPTIND - 1))
echo "remaining=$@"

输出:

$ bash test.sh -jvalue1 -Djvalue3 -pvalue2
j=value1
e=
remaining=-Djvalue3 -pvalue2

选项/参数之间有空格的输出:

$ bash test.sh  -jvalue1 -evalue4 -D jvalue3  -p value2
j=value1
e=value4
remaining=jvalue3 -p value2

【讨论】:

  • 我可以但它不会读取 e 参数...testShell.sh -jvalue1 -evalue4 -Djvalue3 -pvalue2 也将返回 j=value1 e= remaining=-evalue4 -Djvalue3 -pvalue2 但我想j=value1 e=value4 remaining=-Djvalue3 -pvalue2 我已经更新了示例以更清晰。跨度>
  • 为什么选项和参数之间没有空格?我更新了我的帖子。
  • -pvalue2-p value2 根本不一样。当它们被链接时,e 是一个选项,当它们被分隔时,e 在选项 p 的参数内。
  • +1 谢谢@Ayoubi。我能够找到解决方案。 :)
  • 这仍然可以工作:在esac 之后,您可以添加[[ -n $MYHOSTNAME ]] && [[ -n $SCRIPT_PATH ]] && break 以退出while 循环。仍然-j-e 必须出现在任何其他选项之前。
【解决方案2】:

您可以手动进行选项处理:

set -- -jvalue1 -evalue4 -Djvalue3 -pvalue2

remaining=()
for arg; do
    case $arg in
        -j*) j=${arg#-j} ;;
        -e*) e=${arg#-e} ;;
        *)   remaining+=($arg) ;;
    esac
done
printf "%s='%s'\n" j "$j" e "$e" remaining "${remaining[*]}"

哪个输出

j='value1'
e='value4'
remaining='-Djvalue3 -pvalue2'

这样您就不必依赖用户以特定方式输入参数,例如在中间添加--,或强制-j-e 排在第一位。

【讨论】:

    【解决方案3】:

    在 3 个论坛上发布并到处搜索之后……最终我尝试了以下方法,它成功了……

    testShell.sh  -jvalue1 -evalue4 -- -Djvalue3  -pvalue2
    

    通知

    --  
    

    -evalue4之后

    输出是

    j=value1
    e=value4
    remaining=-Djvalue3 -pvalue2
    

    我相信-- 要求getopts停止处理选项。

    编辑: Here 是解释其工作原理的链接。

    【讨论】:

    猜你喜欢
    • 2012-02-02
    • 1970-01-01
    • 2019-02-10
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多