使用 getopt 带有可选输入参数的 bash 脚本

使用 getopt 带有可选输入参数的 bash 脚本

我已经复制了代码tutorialspoint 的 getopt 文章并让以下脚本正常工作(有点):


##argument_script.sh
VARS=`getopt -o i::o:: --long input::,output:: -- "$@"`
eval set -- "$VARS"

# extract options and their arguments into variables.
while true ; do
    case "$1" in

        -i|--input)
            case "$2" in
                "") MAPPE='/default/input/here/' ; shift 2 ;;
                *) MAPPE=$2 ; shift 2 ;;
            esac ;;
        
            -o|--output)
            case "$2" in
                "") OUTPUTFOLDER='/default/input/here/' ; shift 2 ;;
                *) OUTPUTFOLDER=$2 ; shift 2 ;;
        esac ;;
        --) shift ; break ;;
    esac
done

echo "${MAPPE}"
echo "${OUTPUTFOLDER}"

#do something here..

也就是说,我有两个可选参数标志-i/--input-o/ -output。我目前的脚本有问题:

要覆盖标志的默认值,您需要在标志后面写入所需的值,不带任何空格。示例:如果我想传递/c/into-i/f/into -o,我需要将脚本调用为:bash argument_script.sh -i/c/ -o/f/。注意缺少的空格。如果我要编写bash argument_script.sh -i /c/ -o /f/变量MAPPE并将OUTPUTFOLDER使用默认值。
脚本可以重写吗,所以传入-i/的参数-o需要写在空格后面(例子:bash argument_script.sh -i /c/ -o /f/

答案1

您所描述的行为是因为您:getopt.只需将您的getopt行更改为此即可:

VARS=`getopt -o i:o: --long input:,output: -- "$@"`

然而,这是一种非常非常复杂的编写脚本的方式。这是一个更简单的版本(还纠正了一些不好的做法,例如大写变量):

#!/bin/bash

##argument_script.sh
vars=$(getopt -o i:o: --long input:,output: -- "$@")
eval set -- "$vars"

mappe='/default/input/here/'
outputFolder='/default/input/here/'

# extract options and their arguments into variables.
for opt; do
    case "$opt" in
      -i|--input)
        mappe=$2
        shift 2
        ;;
      -o|--output)
        outputFolder=$2
        shift 2
        ;;
    esac
done
echo "mappe: $mappe"
echo "out: $outputFolder"

您现在可以执行以下操作:

$ ./argument_script.sh -i /c/  -o /f/
mappe: /c/
out: /f/

请注意,如果您运行它也可以工作./argument_script.sh -i/c/ -o/f/。该空间不是必需的,而是允许的。

答案2

不幸的是,这是预期的行为,由getopt(3)getopt(1)实用程序所基于的 GNU 函数实现。从它的联机帮助页(强调我的):

两个冒号表示一个选项带有一个可选参数;如果有文字 在当前argv元素中(即与选项名称本身在同一个单词中,例如,-oarg,则返回 optarg,否则optarg设置为零。

如果您希望能够在选项及其参数之间使用空格(例如-o value代替-ovalue),您必须使其参数非可选的:,通过在规范中的选项字符后使用单个。

相关内容