使用 su 检查用户的环境变量是否存在

使用 su 检查用户的环境变量是否存在

我几天来一直在处理这个问题,我需要检查用户 $1 是否存在环境变量 $2 。

我尝试了一些案例:

 $ [[ -v a ]] && echo "a ok" || echo "a no"
 a no
 $ [[ -v $HOME ]] && echo "a ok" || echo "a no"
 a no 

(所以不(我尝试过 Bash > 4.2))

if [ su - ${1} -c "[ -z "${2}" ]" ]

现在,我正在尝试这种方法,因为我没有发现问题所在:/!

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
su - root -c "echo "$HOME" | wc | sed 's/ //g'"

答案1

第一个示例中的语法不正确。如果你写:

[[ -v $HOME ]]

那么你实际上正在执行命令:

[[ -v /home/yourusername ]]

这当然会失败。你要:

[[ -v HOME ]] && echo ok || echo no

您可以将其与su以下内容结合起来:

su - root -c "[[ -v HOME ]]" && echo ok || echo no

您的最后一个示例将不起作用,因为您无法嵌套引号,并且 shell 变量扩展发生在命令执行之前。也就是说,给定:

su - root -c "echo "$HOME" | wc | cut -d' ' -f2"

您执行的命令实际上是:

su - root -c 'echo /home/somesuser | ...'

$HOME如果您想要从 的角度获取的值root,则需要防止本地 shell 中的变量扩展,例如使用单引号:

su - root -c 'echo $HOME | ...'

我不清楚为什么要将输出传递给wc,因为 的字数$HOME几乎总是为1。您可以仅使用该选项来获取字数,而不是对wcwithsed或的输出进行后处理:cut-w

su - root -c 'echo $HOME | wc -w'

相关内容