我想将一个Bash文件中的几个参数传递给另一个,问题是,它似乎忽略了我的引号,我不想用$@
传递它。
这是我目前的设置:
agent.sh
:
#!/bin/bash
KEY='INSERT_KEY_HERE';
RESP='command start Test "srcds_run -game garrysmod +maxplayers 32 +map gm_construct"'
./CMD.sh ${KEY} ${RESP}
实际上RESP
来自CURL,但这给了我相同的结果。
CMD.sh
:
#!/bin/bash
echo $1;
echo $2;
echo $3;
echo $4;
echo $5;
然后猜测,$5
给了我:
"srcds_run
而不是
srcds_run -game garrysmod +maxplayers 32 +map gm_construct
我真正想要的是什么。
所以当使用$*
时,它给了我所有参数,很好,但是我希望它们被分割,与使用$@
相同,我会覆盖angent.sh脚本中的参数但是将所有参数转换为$2
我希望他们分开......
所有传递带空格参数的解决方案都没有问题吗?
答案 0 :(得分:5)
在这种情况下,您必须使用数组(和更多引号):
#!/bin/bash
key='INSERT_KEY_HERE'
resp=( command start Test "srcds_run -game garrysmod +maxplayers 32 +map gm_construct" )
./CMD.sh "$key" "${resp[@]}"
请注意,我使用了小写变量名(这是一种很好的做法!)。
答案 1 :(得分:0)
所以,这是邪恶的方法:
#!/bin/bash
key='INSERT_KEY_HERE'
resp='command start Test "srcds_run -game garrysmod +maxplayers 32 +map gm_construct"'
eval './cmd "$key" '"$resp" # HUGE SECURITY HOLE DO NOT DO THIS
这是邪恶和错误的原因是它信任$resp
的内容实际上是你可以安全执行的东西。想想如果它在某处包含"$(rm -rf $HOME)"
会发生什么 - 那将是非常非常糟糕的。
现在,如果您希望在通过curl检索时形成一个可以安全地解析为列表的文件,那将是这样的:
printf '%s\0' command start Test \
"srcds_run -game garrysmod +maxplayers 32 +map gm_construct" \
>cmds.nsv
...然后你可以从curl中读出来并充分利用它:
cmds=( )
while IFS= read -r -d '' element; do
cmds+=( "$element" )
done < <(curl http://path.to/cmds.nsv)
./cmd "$key" "${cmds[@]}"