2012-01-26 70 views
0

我在OS X上使用bash並希望讀取Embedded目錄中每個應用程序中嵌入的密鑰中的數據。結果似乎是試圖將自己應用於整個列表而不是每個返回的應用程序的「默認」命令。列表中的Bash循環命令

#!/bin/bash 

# appList=$(ls /Applications) 

for APPS in "$(ls /Applications)" ; do 
     result=$(defaults read /Applications/"$APPS"/Contents/Info DTPlatformBuild) 
done 

echo result is $result 

exit 0 

任何幫助表示讚賞。

回答

0

我打算繼續下面的內容。文本文件「appleApps.txt」僅僅是新版本的默認Apple應用程序的列表,以避免搜索。 有效的公司應用程序將有一個新的插入到「Info.plist」文件中,其中布爾值設置爲true
因此,我們現在有一種機制來報告用戶是否正在安裝他們自己已經打包的應用程序的副本。

#!/bin/bash 
echo " " 
echo " " 
rm -f /tmp/validApps /tmp/notValid 
find /Applications -name "*.app" | grep -v -F -f /Library/Application\ Support/CompanyData/appleApps.txt | while read APP 
do 
appVersion=`defaults read "$APP/Contents/Info" Company 2>/dev/null` 
if test "$appVersion" = 1 ; then 
    echo "$APP : $appVersion" >> /tmp/validApps 
else 
    echo "$APP" >> /tmp/notValid 
fi 
done 

echo " " 
echo " " 

result=$(cat -n /tmp/validApps) 
notValidResult=$(cat -n /tmp/notValid) 

printf "%s\n" "Our packaged Applications are:" "$result" 
echo " " 
echo " " 
printf "%s\n" "User installed Applications are:" "$notValidResult" 
echo " " 

rm -f /tmp/validApps /tmp/notValid 

exit 0 

感謝您的提示,只要我的錯誤與$result

我爲什麼不讀了我們ls已經學會不這樣做,雙方@克里斯和@anubhava

的提示
1

圍繞"$(ls /Applications)"這樣的引號引起shell將引用的東西視爲單個參數,而不是將其在空格處拆分爲多個參數。因此,您的for循環將只執行一次,其中APPS設置爲整個應用程序列表,而不是爲每個應用程序運行一次。如果刪除了引號,只要應用程序名稱中沒有空格,它就會爲每個應用程序運行一次。不幸的是,如果名稱中有空格,它將在空格處打破名稱並且不能正常工作。

安全地處理文件名中帶有空格的文件在shell中很痛苦,這就是爲什麼建議您不要在文件名中使用空格的原因。不幸的是,微軟和蘋果不遵循這個建議。有一兩件事你可以在這種情況下,做的是一樣的東西:

ls /Applications | while read APPS; do 
    result=...whatever 
done 

與你的腳本另一個問題(書面)是將存儲到結果在每次迭代中,覆蓋以前的結果。所以打印結束時$result的內容將只是最後一次迭代的結果。

+0

感謝您對「克里斯」的評論,因爲您向我明確了我出錯的地方,這很有道理。我同意使用空格,並告訴我們的辦公室用戶不要在文件名中使用它們。 – chop

1

我會建議不要使用ls命令進行循環,因爲它容易出錯。運行你的循環這樣遞歸地找到應用程序:

find /Applications -name "*.app" -print0 | while IFS= read -r -d '' APP 
do 
    defaults read "$APP/Contents/Info" DTPlatformBuild 
done 

因爲所有你感興趣的呼應結果沒有必要存儲在一個變量的默認命令的輸出,然後呼應它。

+0

感謝@anubhava,這是行得通的,但我也需要通過子目錄,並照顧密鑰不存在的地方。我很想知道爲什麼'ls'很容易出錯,謝謝。 – chop

+1

請閱讀關於解析ls輸出的內容:http://mywiki.wooledge.org/ParsingLs您可以在SO上找到許多問答,並討論在循環中使用'ls'。如果你想遞歸的應用程序,然後請檢查我更新的答案。 – anubhava

+0

謝謝@anubhava我已經閱讀並學會了不使用'ls',我修改了我的代碼以使其適用於您的答案。 – chop