如何将变量发送到内联 shell 脚本?

Mat*_*oli 30 shell scripting shell-script variable

我运行以下脚本:

VAR="Test"
sh -c 'echo "Hello $VAR"'
Run Code Online (Sandbox Code Playgroud)

但我得到:

# ./test.sh
Hello
Run Code Online (Sandbox Code Playgroud)

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

Ign*_*ams 49

要么用于export将其转换为环境变量,要么将其直接传递给命令。

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

VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Run Code Online (Sandbox Code Playgroud)

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

sh -c " echo '你好 $VAR' "

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

  • 仅供参考,您也可以在一行中执行 `export var="Test"`。 (5认同)
  • @Matthieu:它们仅被设置为环境变量*为您的进程的孩子*,如果这让您担心的话。 (4认同)

小智 11

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

{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
Run Code Online (Sandbox Code Playgroud)

  • @Peter.O 而不是使用“\_”,我会使用“sh”或一个合理的 _name_ 来赋予该命令,因为 shell 的错误/警告消息中显示了 `$0`。 (2认同)

rah*_*hmu 6

如果您不想将它们导出为环境变量,那么您可以使用以下技巧。将您的变量定义保存到一个文件中.var_init.sh,并在您的子 shell 中提供它,如下所示:

.var_init.sh

VAR="Test"
Run Code Online (Sandbox Code Playgroud)

从命令行:

sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
Run Code Online (Sandbox Code Playgroud)

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