我希望将包含引号和空格的用户输入(例如: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将"b
和c"
粘合在一起。
答案 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 splitting和globbing,而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
来对待反斜杠。