我几天来一直在处理这个问题,我需要检查用户 $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
。您可以仅使用该选项来获取字数,而不是对wc
withsed
或的输出进行后处理:cut
-w
su - root -c 'echo $HOME | wc -w'