我有一个脚本可以检查用户主目录是否存在,这是我遇到的问题
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
实际上描述了该变量的值的含义。