假设一个变量值有$
符号(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 是csh
or 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_value
shell 将扩展命令内部的值,因为它是双引号的。然后内部printf
将打印单引号字符串。
有关的:
请注意,这${variable}
与 完全相同$variable
。添加{...}
不会以任何方式引用它,并且仅当紧随扩展之后的字符被视为其名称的一部分时才需要,如 中所示"${variable}x"
。