我想传递包含引号和空格的用户输入(例如:"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"
在一起。
你想要的不是你通常应该做的事情,但是你可以使用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
,这将使它经历分词和通感,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
,以从字面上处理反斜杠。