命令在 BASH 中不起作用

命令在 BASH 中不起作用

我有一个脚本可以检查用户主目录是否存在,这是我遇到的问题

j=`su $p -c df -h | grep $p`

有人能帮我吗?df -h 不起作用,但 df 可以起作用...

答案1

你把这件事想得太复杂了。

我在这里假设$p保存着您当前感兴趣的用户的用户名(因为您将其传递给su),并且您仅对主目录是否存在的“是/否”答案感兴趣。

我们可以利用 bash 中的这一事实,~username扩展为 的主目录路径username。这是完成的在这个答案中(该问题还有其他答案,也指向其他潜在的解决方案):

eval echo ~$USER

然后,我们可以利用test -d测试文件系统名称是否“存在并且是目录”的事实,并使用子进程替换和eval将扩展值提供给~username它:

test -d $( eval echo ~"$p" ) && echo yes

这将echo yes在以下情况下执行:(因为它位于 之后&&,这要求前面的命令返回成功状态)(1)名为 的用户的主目录$p存在(请注意,这并不依赖于它在文件系统中是否有任何特定位置),并且(2)它是一个目录。引号确保即使用户名包含空格(这在类 Unix 系统中是有效的但不常见),这也不会中断。

只需将 替换echo yes为您想要的任何内容即可。我感觉您只是希望 $j在主目录存在时不为空,在这种情况下您可以执行类似操作(此代码片段将构成循环主体):

unset j
test -d $( eval echo ~"$p" ) && j=1
if test -n "$j"; then
    echo Home directory found for "$p"
else
    echo Home directory NOT found for "$p"
fi

(最后一行显然可以被你心中的具体逻辑所取代)

如果您确实需要 的输出df,那么调整上面的脚本来提供它应该不会太难。暂时,我把这个留给读者作为练习。

哦,尝试使用更具描述性的变量名。这会有所帮助非常下次您需要对该脚本进行任何调整。$p会更好$user,例如,因为$user实际上描述了该变量的值的含义。

相关内容