从Bash脚本中,如何正确转义位于命令字符串中的变量? [重复]

问题描述 投票:1回答:1
我正在使用SaltStack运行一个命令,该命令在字符串中包含Linux环境变量。环境变量是$ DUO。示例:

export DUO="TESTKEY"

我可以运行以下命令:

salt computer chocolatey.install app args='/S /V" /qn '"$DUO"'"'

这实际上将产生一个命令,例如:

'/S /V" /qn TESTKEY"'

它输出我想要的环境变量。

我现在正在运行一个bash脚本,该脚本从用户那里获取环境变量并将其放在字符串中:

#!/bin/bash echo "What env do you want to use?: " read env i="\$${env}" echo $i salt computer chocolatey.install app args='/S /V" /qn '"${i@Q}"'"'

我的Bash脚本接受用户输入,并自动在其前面放置一个'$'。如果用户输入“ DUO”,该命令将运行为:

'/S /V" /qn '$DUO'"'

但是我希望它运行此:

'/S /V" /qn TESTKEY"'

在Bash脚本中,如何在命令运行时正确地转义i变量,以便它调用环境变量$ DUO?

UPDATE

这是我实际的SaltStack命令:

sudo salt computername chocolatey.install duo override_args=True install_args='/S /V" /qn HOST="xxxxxxx.com" RDPONLY="#0" '"$DUO"'"'

输出:

computername: Chocolatey v0.10.15 Installing the following packages: duo By installing you accept licenses for the packages. duo v0.3 duo package files install completed. Performing other installation steps. Installing Duo... Overriding package arguments with '/S /V" /qn HOST="xxxxxxx.com" RDPONLY="#0" TESTKEY"' (replacing '/S /V" /qn HOST="xxxxxxx.com" RDPONLY="#0" "') Duo has been installed. The install of duo was successful. Software installed as 'EXE', install location is likely default. Chocolatey installed 1/1 packages. See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

UPDATE 2

我在调试时运行了该脚本,而Bash脚本实际上以以下方式运行它:

+ salt 'computername' chocolatey.install duo override_args=True 'install_args=/S /V" /qn HOST="xxxxx.com" RDPONLY="#0" '\''$DUO'\''"'

UPDATE 3

我尝试扩展变量名,但出现错误。

bad substitution

例如,这给了我这个错误:

#!/bin/bash echo "What env do you want to use?: " read env i="\$${env}" echo "${!i}"

linux bash chocolatey
1个回答
0
投票
间接扩展

如知识库中其他地方给出的,使用${!env}扩展到$env中命名的变量。]​​>

在这里使用

DUO=TESTKEY env=DUO set -x # enable tracing; below : causes us to just trace the command and not run it : sudo salt computername chocolatey.install duo override_args=True install_args='/S /V" /qn HOST="xxxxxxx.com" RDPONLY="#0" '"${!env}"'"'

...产生

完全相同

输出作为您正常运行的Chocolatey命令的示例,无替代:DUO=TESTKEY set -x # enable tracing; below : causes us to just trace the command and not run it : sudo salt computername chocolatey.install duo override_args=True install_args='/S /V" /qn HOST="xxxxxxx.com" RDPONLY="#0" '"${DUO}"'"'
© www.soinside.com 2019 - 2024. All rights reserved.