将params传递给另一个Bash文件,空格为

时间:2016-07-04 15:14:50

标签: bash shell

我想将一个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我希望他们分开......

所有传递带空格参数的解决方案都没有问题吗?

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[@]}"