2011-03-05 39 views
0

我製作了一個bash腳本,該腳本以root用戶身份執行,並且必須驗證用戶桌面中是否存在文件。下面是代碼:測試文件是否存在於多個用戶的特定用戶的文件夾中

if [ -e /Users/*/Desktop/file ]; then 
.... 

的事實是,如果有多個用戶在/Users/,並且該文件不存在的第一個用戶(按字母順序排列),但在別人的一個,它就會失敗。

因此,要解決這個問題,我認爲這是很好的:

if [ -e ~/Desktop/file ]; then 
.... 

但是,作爲腳本作爲根執行,~/Desktop//private/var/root/Desktop而不是/Users/my_user/Desktop

我現在不是很安心,因此我希望你能幫我解決這個問題!謝謝 !

回答

0

你可以使用循環一個在bash來測試每個用戶的主目錄反過來,如:

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手冊關於循環構造的部分,包括循環,is here - 這可能不是最好的開始,但您可以在Google中找到大量示例。

有一點需要注意,這個答案是,如果你是嚴格的,用戶的主目錄不必被稱爲/用戶/用戶名 - 嚴格來說,你需要在/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用戶。

+0

感謝您的幫助!目前在'其他'腳本殺死一個過程。所以每次找不到文件時,都會殺死進程。只有當文件根本找不到時,如何才能使processus死掉? – b1onic 2011-03-05 15:00:42

+0

@ b1onic:只有在文件「〜/ Desktop/file」不存在於任何用戶的情況下,你纔想殺死一個進程? – 2011-03-05 16:26:07

0

在你的問題的標題你說「特定用戶」。爲什麼不命名特定用戶?

if [ -e /Users/username/Desktop/file ] 

如果你想找到這樣的文件,使用find

find /Users -path '/Users/*/Desktop/*' -name 'file' 
+0

因爲腳本不是由我自己運行的,而是由不同的人運行的,所以用戶每次都會更改。我會測試你的方式! – b1onic 2011-03-05 14:48:54

+0

@ b1onic:如果它由不同的人運行,那麼'〜'應該工作(或者更好:'$ HOME')。 – 2011-03-05 14:58:30

0

我不明白這一點?你爲什麼不指定該特定用戶的主目錄~youruser/Desktop

我假設你想這樣做。所以該行看起來像:

if [ -e ~youruser/Desktop/file ]; the 
... 

我理解正確的問題了嗎? 只是在'linux波浪擴展'搜索谷歌

並小心不要引號圍繞代字號。 關於如何使用報價,請閱讀討論:https://stackoverflow.com/a/3984130/1579985

相關問題