我制作了一个以root身份执行的bash脚本,必须验证用户桌面中是否存在文件。这是代码:
if [ -e /Users/*/Desktop/file ]; then
....
事实是,如果/Users/
中有多个用户,并且该文件不在第一个用户中(按字母顺序排列),但在其中一个用户中,它将失败。
所以为了解决这个问题,我认为这很好:
if [ -e ~/Desktop/file ]; then
....
但是,由于脚本是以root身份执行的,~/Desktop/
是/private/var/root/Desktop
而不是/Users/my_user/Desktop
。
我现在用bash不太放心,所以我希望你能帮我解决这个问题!谢谢!
答案 0 :(得分:0)
你可以在bash中使用 for loop 依次测试每个用户的主目录,例如:
for d in /Users/*
do
if [ -e "$d/Desktop/file" ]
then
echo "The file existed under $d"
else
echo "The file was not found under $d"
fi
done
/Users/*
扩展为/Users/alice /Users/bob /Users/charles
(或其他),然后$d
在循环内依次给出每个值的值。显然,你可以用任何你想要做的事情替换echo
的陈述。
bash手册中关于循环结构的部分,包括for循环,is here - 可能不是最好的起点,但你可以在Google上找到很多例子。
关于这个答案需要注意的一点是,如果你是严格的,用户的主目录就不必被称为/ Users / username - 严格来说你需要查看/etc/passwd
来查找全部用户及其相应的主目录。但是,对于你想要做的事情,这可能就足够了。
更新1:如果没有任何用户存在匹配/Users/*/Desktop/file
的文件,则从下面的评论中发出声音,就好像您想要采取行动一样。这对我来说听起来很奇怪,但如果你真的想这样做,你可以使用this other Stack Overflow问题中的一个食谱,例如:
if [ -z "$(shopt -s nullglob; echo /Users/*/Desktop/file)" ]
then
echo "No one had a file in ~/Desktop/file"
fi
更新2:您对Dennis Williamson's answer的评论表明此脚本应由此计算机上的非root用户运行。如果是这样,那么我认为他在评论中的建议是正确的 - 你只想测试:
if [ -e "$HOME/Desktop/file" ]
then
echo "Found the file"
else
echo "Failed to find the file"
fi
...然后你只需确保以非root用户身份进行测试。
答案 1 :(得分:0)
在问题的标题中,您说“特定用户”。为什么不命名特定用户?
if [ -e /Users/username/Desktop/file ]
如果您要查找此类文件,请使用find
:
find /Users -path '/Users/*/Desktop/*' -name 'file'
答案 2 :(得分:0)
我不明白吗?为什么不指定该特定用户{1}的主目录?
我认为你想要那个。所以该行看起来像:
~youruser/Desktop
我是否正确理解了问题? 只需在'linux tilde expansion'上搜索谷歌
注意不要在波浪号周围加上引号。 关于如何使用引号,请阅读讨论:https://stackoverflow.com/a/3984130/1579985