能够作为当前用户以及其他用户通过 su 命令使用值中包含 $ 的变量

能够作为当前用户以及其他用户通过 su 命令使用值中包含 $ 的变量

假设一个变量值有$符号(java内部类的存储路径)。

我想以当前用户和其他用户的身份处理它(假设当前用户是root这样,这样我在使用命令时不需要输入密码su)。

例子:

path_value=/home/username/filename\$1.class

echo ${path_value}

su username -c "echo ${path_value}"

第一个的结果echo

/home/username/filename$1.class

echo第二个内部命令的结果su

/home/username/filename.class

我想使用该变量,以便能够在两个地方以相同的值处理它。

答案1

通过环境导出值,然后让内壳扩展它。假设 的username登录 shell 与 Bourne 类似:

$ export path_value=/home/username/filename\$1.class
$ su username -c 'echo "$path_value"'
/home/username/filename$1.class

即使变量包含引号,这也将起作用,但如果使用的命令清除环境,则这将不起作用。我认为不su应该这样做,但sudo可能会。

如果我们知道变量不能包含单引号²,那么只需在内壳中单引号扩展字符串即可:

$ path_value=/home/username/filename\$1.class
$ su username -c "echo '$path_value'"
/home/username/filename$1.class

(请注意,引号的顺序相反。)


¹ 如果username的登录 shell 是cshor tcsh,则替换echo "$path_value"echo $path_value:q;如果是rc或导数,则 与echo $path_value.

csh如果用户的登录 shell 是或, 则包含 ² 和换行符,tcsh并且如果用户的登录 shell 是 ,则它不包含不形成有效字符的字节yash。另请注意,以反斜杠开头-或包含反斜杠的参数会出现问题 echo,最好用于printf '%s\n'任意数据

答案2

为什么不使用sudo代替su

# path_value=/home/username/filename\$1.class
# echo "${path_value}"
/home/username/filename$1.class
# sudo -u username echo "${path_value}"
/home/username/filename$1.class

答案3

在第二个 echo 中将变量放在单引号中 - 例如:

su username -c "echo '${path_value}'"

这样 echo 将变量的内容解释为字符串,并且“$”符号被转义。

答案4

请记住正确引用所有扩展。 shell 不会查看单引号字符串内部。

path_value='/home/username/filename$1.class'
printf '%s\n' "$path_value"

输出/home/username/filename$1.class

su username -c "printf '%s\n' '$path_value'"

相同的输出。

在第二个命令中,当前的path_valueshell 将扩展命令内部的值,因为它是双引号的。然后内部printf将打印单引号字符串。

有关的:


请注意,这${variable}与 完全相同$variable。添加{...}不会以任何方式引用它,并且仅当紧随扩展之后的字符被视为其名称的一部分时才需要,如 中所示"${variable}x"

相关内容