【发布时间】:2021-01-02 12:45:26
【问题描述】:
我有一个 bash 脚本,它应该在两行中打印参数。第一行应该是第一个参数,第二行应该是其余的参数
#!/bin/bash
FIRST_ARG="$1"
shift
REST_ARGS="$@"
echo $FIRST_ARG
echo $REST_ARGS
这适用于普通参数,例如
root@us:~# /bin/bash parse.sh testName test1 test2 test3
testName
test1 test2 test3
root@us:~#
但是,我想要的是发送一个键值对作为参数,例如
testName "X-Api-Key: 1be0ad48" "Name: someTest" "Interval: * * * * *"
我希望这会产生如下结果
testName
"X-Api-Key: 1be0ad48" "Name: someTest" "Interval: * * * * *"
包括引号。但是,我得到以下结果
root@us:~# /bin/bash parse.sh testName "X-Api-Key: 1be0ad48" "Name: someTest" "Interval: * * * * *"
testName
X-Api-Key: 1be0ad48 Name: someTest Interval: parse.sh parse.sh parse.sh parse.sh parse.sh
root@us:~#
这里发生了两件我不希望发生的事情。 1) 它删除引号 ", 2) 它用文件名替换 *。
我尝试用 " 转义那些但没有用。有没有办法解决这个问题?我在哪里做错了?
【问题讨论】:
-
在将参数传递给脚本之前,引号被删除,所以你想要的实际上是不可能的。但根据您想要引号的为什么,有可能实现您的实际目标。对"Preserve Quotes in bash arguments" 的回答有帮助吗?
-
在unix.stackexchange.com/q/171346/4667接受的答案的序言中有非常透彻的解释
-
无论你写
cmd a b还是cmd "a" "b",cmd都是用相同的参数调用的,而且这些参数中没有引号。它们只是字符串a和b。
标签: bash shell arguments quotes