shell脚本传递带空格的参数

时间:2015-10-23 10:21:36

标签: bash shell parameters space

我有以下脚本(示例):

#!/bin/bash
while getopts a: opt; do
    case "$opt" in
        a) val="$OPTARG";;
        ?) echo "use the flag \"-a\""
           exit 2;;
    esac
done
echo "a specified with: ${val}"  

当我现在使用test.sh -a "here is a string"调用此脚本时,输出为:a specified with: here,因为我希望a specified with: here is a string

我知道我可以使用test.sh -a here\ is\ a\ stringtest.sh -a "here\ is\ a\ string"来调用该脚本,它会起作用。但在我的情况下,我无法操纵我想传递的字符串 那么如何更改getopts功能以使其正常工作?

我也试过getopt,但我的工作更加恶劣:

commandsShort="a:"
commandsLong="aval:"
TEMP=`getopt \
        -o $commandsShort \
        -l $commandsLong \
        -q \
        -n "$0" -- "$@"`

我做错了什么?

1 个答案:

答案 0 :(得分:3)

这在你的问题评论中得到了解决。 : - )

您正在使用以下命令调用脚本:

eval "test.sh $@"

如果“这是一个字符串”是你的选择,这个“eval”行的效果是创建引号中的命令行:

test.sh here is a string

eval uate it。

根据其他评论,如果你可以避免使用eval,你应该。

那就是说,如果你需要它,你总是可以在eval中引用字符串:

eval "test.sh \"$@\""

或者,如果您不喜欢转义引号,请使用单打,因为您的$@会因外引号加倍而展开:

eval "test.sh '$@'"

最后,正如您在评论中提到的,直接运行可能是最佳选择:

test.sh "$@"

注意如果您的$@包含-a选项,则可能会遇到新问题。考虑命令行:

test.sh "-a here is a string"

在这种情况下,您的整个字符串(以-a开头)位于$1,您将无法选择getopts,也无法选择OPTARG。