2011-10-04 64 views
0

假設文件夾存在於下面的腳本中,有人可以告訴我爲什麼這不起作用嗎?我逃避了額外的空間測試工作,但不知何故它不喜歡它沒有錯誤...Bash文件系統目錄測試技巧

#!/bin/bash 
Base='/tmp/' 
Sub='one space/another space/' 
declare -a ASub 
for argR in "${Sub[@]}" 
    do 
     Sub+=($(printf %q "$argR")) 
    done 
clear 
echo -n $Base 
if [ -d $ExBase ] 
    then 
     echo "...OK" 
    else 
     echo "...FAIL" 
fi 
BaseAndSub=$Base$Sub 
echo -n $BaseAndSub 
if [ -d "$BaseAndSub" ] 
    then 
     echo "...OK" 
    else 
     echo "...FAIL" 
fi 
exit 0 
+1

你想用這個腳本做什麼? –

+0

你聲明'ASub',但從不使用它。目前還不清楚在$ {Sub [@]}「'中爲argR定義/初始化'Sub'數組的位置。至少經典,你需要使用'BaseAndSub =「$ Base/$ Sub」';否則,我不會寫它,儘管它可能不是100%必要的(但它絕對清晰和萬無一失)。如果名稱有多個相鄰空格,'echo -n $ BaseAndSub'會丟失它們的蹤跡,其中'echo -n「$ BaseAndSub」'不會。使用雙引號更寬鬆一點。 –

回答

0

正如@glenn所說,這裏有很多錯誤; ASub聲明,但沒有使用,Sub有時被用作一個字符串變量有時作爲數組,ExBase而不將其設置使用,...

最根本的問題,不過,是你經歷了很多不必要的(有時是破壞性的)工作,試圖處理文件名中的空格,當所有必要的事情是圍繞可能包含空格的所有內容使用雙引號時。數組非常適合存儲文件名列表(每個文件名可能有空格)或命令字符串(可能在其參數中有空格),但在這種情況下,您只有一個文件名,因此不需要。添加引號(printf %q)幾乎是沒有用的,它只是意味着你將尋找具有實際引號/轉義/名稱中的任何文件。

這是我的重寫,刪除了不相關的東西,並在幾個地方添加了雙引號。我也更改爲更標準的約定,不包括文件名中的尾部斜線,因此將Base和Sub放在一起不僅是"$Base$Sub",還有"$Base/$Sub"。這似乎爲我工作的罰款:

#!/bin/bash 
Base='/tmp' 
Sub='one space/another space' 
clear 
echo -n "$Base" 
if [ -d "$Base" ] 
    then 
     echo "...OK" 
    else 
     echo "...FAIL" 
fi 
BaseAndSub="$Base/$Sub" 
echo -n "$BaseAndSub" 
if [ -d "$BaseAndSub" ] 
    then 
     echo "...OK" 
    else 
     echo "...FAIL" 
fi 
exit 0 

BTW,試圖解決的bash腳本的時候,這是非常有幫助的使用-x選項(或者與set -x,或使用#!/bin/bash -x爲您的家當)。這使bash在執行之前打印每個命令 - 擴展參數以準確顯示發生了什麼。

2

該腳本很大的錯誤。 ASub已聲明,從未使用過。 ExBase從未聲明,但使用。

我想這是主要的問題:if [ -d $ExBase ]
由於ExBase是空和取消,外殼看到這樣的:if [ -d ]
我本來期望一個語法錯誤,但顯然外殼看到「-d」只是一個非 - 空字符串,因此是正確的。

+0

我使用'set -o nounset;在我所有的Bash腳本的開始處設置-o errexit',這將導致Bash停止這樣的錯誤,而不是讓它們靜靜地通過。 –