![如何将变量发送到内联 shell 脚本?](https://linux22.com/image/18711/%E5%A6%82%E4%BD%95%E5%B0%86%E5%8F%98%E9%87%8F%E5%8F%91%E9%80%81%E5%88%B0%E5%86%85%E8%81%94%20shell%20%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我运行以下脚本:
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"'