如何将变量发送到嵌入式shell脚本?


26

我运行以下脚本:

VAR="Test"
sh -c 'echo "Hello $VAR"'

但是我得到:

# ./test.sh
Hello

如何将VAR脚本的变量发送到使用创建的shell sh -c '...'

Answers:


44

可以使用export将其转换为环境变量,也可以将其直接传递给命令。

VAR="Test" sh -c 'echo "Hello $VAR"'

VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'

避免在外壳程序代码周围使用双引号以允许插值,因为这样会引入命令注入漏洞,例如:

sh -c“ echo'Hello $ VAR'”

如果在$VAR包含以下内容时调用,则会导致重新启动';reboot #


不太实用(我有多个变量,并且我不希望它们成为环境变量),但是可以,谢谢!
Matthieu Napoli

3
@Matthieu:如果您担心的话,它们只会被设置为您的进程子进程的环境变量。
Piskvor,2011年

5
仅供参考,您也可以export var="Test"一行完成。
user606723 2011年

@Piskvor很好,谢谢您的精确度,那就太完美了。
Matthieu Napoli

9

这是将变量传递给sh -c(作为位置参数)的另一种方法:

{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}

1
(+1)为使其更符合脚本变量的正常$ 1 $ 2期望,它可以具有$ 0的虚拟值。这将允许 $@按预期方式工作,例如。sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
Peter.O 2011年

2
@ Peter.O而不是使用“ _”,我将使用“ sh”或一个合理的名称来给该命令,因为该命令$0会在shell的错误/警告消息中显示。
斯特凡Chazelas

5

如果您不想将它们导出为环境变量,则可以采取以下技巧。将您的variabe定义保存到文件,.var_init.sh并像下面这样在子shell中提供它:

.var_init.sh

VAR="Test"

从命令行:

sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'

这样,您仅在子shell执行时设置变量。


…或ENV=.var_ini.sh sh -c '...'
库萨兰达

请注意,如果.var_init.sh预计将在当前目录中寻找(与$PATH),它应该写成. ./var_init.sh
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.