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

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

我运行以下脚本:

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

但我得到:

# ./test.sh
Hello

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

答案1

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

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

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

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

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

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

答案2

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

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

答案3

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

.var_init.sh

VAR="Test"

从命令行:

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

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

答案4

感谢“enharmonic”帖子,我解决了我的问题。我必须更改此命令,以添加“/etc/docker/daemon.json”文件(如果尚不存在):

sudo echo "{ ${dqt}insecure-registries${dqt} : [${dqt}$ipaddress:5000${dqt}] }" >> $dockdaemoncfg

必须更改此命令,因为它无法保留变量“$ipaddress”和“${dqp}”(其中双引号 dqt='"')的内容,并且在文件中的位置不写入任何内容因此,感谢“enharmonic”解决方案,我成功地将其更改如下:

sudo VAR1="$IPaddress" VAR2="$dockdaemoncfg" bash -c 'echo "{ \"insecure-registries\" : [\"$VAR1:5000\"] }" >> "$VAR2"'

相关内容