使用简单引用将变量放入另一个变量中

使用简单引用将变量放入另一个变量中

我有这个命令(用户是我的用户帐户的名称:echo $USER):

sudo -H -u user bash -c 'DISPLAY=:0 /usr/bin/dbus-launch /home/user/myappimage start -i &'

工作正常。现在我想创建一些变量来替换我的用户和路径 appimage:

myuser="user"
pathappimage="/home/$myuser/myappimage"
sudo -H -u $myuser bash -c 'DISPLAY=:0 /usr/bin/dbus-launch $pathappimage start -i &'

问题是$pathappimage由于命令中的单引号导致变量无法识别它。

我该如何修复它?

答案1

也许双引号就可以了:

sudo -H -u $myuser bash -c "DISPLAY=:0 /usr/bin/dbus-launch $pathappimage start -i &"

或者如果你的$pathappimage可以包含空格等:

… "DISPLAY=:0 /usr/bin/dbus-launch \"$pathappimage\" start -i &"
                                   ^^             ^^
# these double quotes are escaped and they will remain

如果由于某种原因您需要单引号,您可以更改引号类型,如下所示:

sudo -H -u $myuser bash -c 'DISPLAY=:0 /usr/bin/dbus-launch '"$pathappimage"' start -i &'
#                          ^---- this is still treated as a single argument to bash ----^

$pathappimagebash将在运行之前由当前 shell 扩展。如果您希望bash看到结果为双引号,以防 中有空格或其他内容$pathappimage,则像这样调用:

… 'DISPLAY=:0 /usr/bin/dbus-launch "'"$pathappimage"'" start -i &'
#                                  ^                 ^
# these double quotes are in single quotes and they will remain

或甚至单引号:

… 'DISPLAY=:0 /usr/bin/dbus-launch '\'"$pathappimage"\'' start -i &'
#                                   ^^               ^^
# these single quotes are escaped and they will remain

另一种(较差的)方法。您可以使用export变量,将整个字符串放在单引号中传递,然后根据需要取消导出:

export pathappimage
bash -c 'DISPLAY=:0 /usr/bin/dbus-launch "$pathappimage" start -i &'
# bash will see the whole single-quoted string literally
export -n pathappimage

现在bash你调用将会扩展$pathappimage,这个变量将在其环境中。然而 sudo除非您使用 ,否则不会保留环境sudo --preserve-env,这可能不是您想要的或无法做到的。因此,巧妙引用更好,也可能更安全。

相关内容