2012-05-18 85 views
0

我想使用通配符檢查Bash腳本中是否存在一個或多個目錄。Bash Shell腳本:確認一個或多個目錄的存在

我試過這個;

if [ -d app/*management ] 
then 
    for mscript in `ls -d app/*management` 
    do 
     ... 
    done 
fi 

如果只有一個匹配,但是會拋出錯誤「二元運算符預期」,那麼該函數有效。

任何建議一個好辦法做到這一點?

回答

4

您不能使用-d在同一時間檢查多個目錄,而在你的表情& &(和)。我會用這個:

for dir in app/*management; do 
    if [[ -d $dir ]]; then 
     ... 
    fi 
done 

你應該使用globs而不是解析ls的輸出。請參閱以下鏈接瞭解更多信息:http://mywiki.wooledge.org/ParsingLs

2

你爲什麼不去做這樣的:

for mscript in app/*management ; do 
    if [ -d "$myscript" ] ; then 
    ... 
    fi 
done 
+0

你應該在報價,謝謝'['或'使用[' – jordanm

+0

Ninja'd內的擴張。 – Mat

2

水珠擴展到管理目錄的列表之後,if語句看起來像

if [ -d app/1management app/2management ] 

由於-d只有一個參數,bash將不知道該怎麼用剩下的目錄來做。爲了打擊,它看起來像你忘了包含一個二元運算符。

你可以做只是做到以下幾點:

for mscript in app/*management; do 
    if [ ! -d $mscript ]; then 
     continue 
    fi 
    ... 
done 

編輯:由於jordanm評論,下面可能是沒有必要的,但我會離開這裏作爲參考,nullglob是很好的瞭解。

一個警告。如果app/*管理有可能無法擴展爲任何內容,則需要在循環之前設置shell選項nullglob,否則「app/* management」將被視爲文字字符串,而不是shell外殼。

if ! shopt nullglob; then 
    setting_nullglob=1 
    shopt -qs nullglob 
fi 
for mscript in app/*management; do 
... 
done 
if [ ${setting_nullglob:-0} = 1 ]; then 
    unset setting_nullglob 
    shopt -qu nullglob 
fi 
+1

擴展爲「app/* management」的glob應該沒問題,因爲它會使'[-d'檢查失敗。 – jordanm

+0

@jordanm - 那個想法超出了我的想法,但不夠強烈讓我記得提及它:)感謝您指出它。 – chepner

相關問題