我确实有 2 个 Shell 脚本。第一个触发第二个并添加一些参数。第二个调用命令并将第一个脚本中的参数添加为命令的参数。
第一个看起来像:
#!/usr/bin/env bash
ADDITIONAL_ARGUMENTS='--set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"'
SUPER_PARAMS=${ADDITIONAL_ARGUMENTS} my_second_script.sh
然后,第二个脚本执行以下操作:
#!/usr/bin/env bash
randomBinary --some-hardcoded-parameters \
"${SUPER_PARAMS}"
我期望得到的是以下输出:
randomBinary --some-hardcoded-parameters --set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"
但相反,调用看起来像:
randomBinary --some-hardcoded-parameters '--set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"'
我尝试了 2 天正确引用参数,但没有结果。
要存储多个参数,请使用数组,而不是标量变量。
请注意,由于环境变量是非 NUL 字节的字符串,因此如果您想通过环境将数组定义传递给另一个命令,则需要进行一些编码。
使用
ksh
,bash
,zsh
或者yash
您可以使用:在调用脚本的环境变量中导出数组定义。
并
eval "$ARRAY_DEFINITION"
在被调用的脚本中导入该数组定义。请注意,代码在与生成代码的语言环境相同的语言环境和相同的 shell 中进行评估是很重要的。
另请注意,如果数组定义在函数内部求值,则数组将是函数的本地数组。
一些 shell 像
rc
,es
或fish
允许导出数组(在内部使用它们自己的编码)。在这里,将信息作为参数传递给被调用脚本会更容易,因为这是一个数组。
在调用脚本中:
在被调用的脚本中:
或者调用被调用的脚本,
.
这样它就可以共享调用者的 shell 变量,这样你就不需要使用环境来在执行过程中传递该数据。这里,
SUPER_PARAMS
contains--set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"
,并且由于它被引用,它按原样传递。如果它没有被引用,它将在空白处被分割成五个字符串--set
,"args={/bin/bash,-c,cd
,/var/www
,&&
,sudo -u www-data bash scripts/system/update.sh}"
,并且这些将作为参数传递。似乎您希望变量中的引号也被解释,这需要添加另一层 shell 解析,或者
eval
通过bash -c '...'
这里的测试脚本:
印刷:
(脚本
args.sh
打印的数字是不同参数的数量,并且参数本身打印在 内<...>
)请注意,
eval
它将执行例如任何命令替换,因此它会打开任意代码执行。通常,将参数保存在shell 数组中会更好,但是在这里您将它们从一个脚本传递到另一个脚本,因此效果不太好。请参阅“如何将命令存储在变量中?”部分。在这个关于处理空白的答案中。还有Bash Guide 中的 Word Splitting,您还可以使用它
set -x
来查看 shell 实际运行的命令。