将带引号的用户输入作为参数传递给bash

时间:2016-06-12 10:31:05

标签: bash

我希望将包含引号和空格的用户输入(例如:a" b c")传递给正确的bash功能,并且无法找到我要做的方法这一点。

test.sh:

#!/bin/bash

myFunction () {
    echo "Parameter 1: $1"
    echo "Parameter 2: $2"
}

read -p "Enter parameters: " parameters
myFunction $parameters

当我跑到上面并输入一个" b c"结果如下:

$ ./test.sh 
Enter parameters: a "b c"
Parameter 1: a
Parameter 2: "b

引号被忽略。参数由空格分隔。

在引号(myFunction "$parameters")中包装变量无效,因为包含引号的整个字符串将变为$1,而$2将为空。

我需要的是$1=="a"$2=="b c",但我无法找到如何使bash将"bc"粘合在一起。

1 个答案:

答案 0 :(得分:1)

您想要的不是您通常应该做的事情,但您可以使用eval来获得所需的结果:

eval "myFunction $parameters"

你应该直接接受它们作为你脚本的参数:

% cat my_script.bash
#!/bin/bash
myFunction() {
    echo "Parameter 1: $1"
    echo "Parameter 2: $2"
}
myFunction "$@"

并将其命名为:

% ./my_script.bash a "b c"
Parameter 1: a
Parameter 2: b c

另一个错误的是你没有引用$parameters,这会让它经历word splittingglobbing,而myFunction将会像这样调用:

myFunction 'a' '"b' 'c"' 

完整代码:

#!/bin/bash
myFunction () {
    echo "Parameter 1: $1"
    echo "Parameter 2: $2"
}

read -rp "Enter parameters: " parameters
eval "myFunction $parameters"

我还在读取时堵塞了-r来对待反斜杠。