2014-09-03 163 views
0

我想讓DIR遍歷所有參數(使用空格和「」)。但是這個代碼並不認可,「cd ef」就是其中之一。將它們分成兩部分。 我該怎麼做?bash參數在一個變量中,然後循環遍歷

#test.sh 
echo Number of arguments: $# 

if [ $# -eq 0 ] 
then 
    echo "No arguments" 
    DIR=. 
else 
    DIR="$*" 
fi 

echo DIR =$DIR 
for arg in $DIR; 
do 
    echo $arg; 
done 

命令

#bash test.sh ab "cd ef" 

輸出,自變量數:2

但是,列舉在環3層的元件ab, cd,和ef

我知道,我能做的,

for arg in "$*"; 

但是,這不是在這種情況下的解決方案。我可以使用DIR來達到這個目的嗎? 該平臺是OSX Mavericks外殼。

+2

'$ *'是幾乎從來沒有適合使用 - 它加到論點的第一個字符'IFS',這意味着如果IFS的第一個字符出現任何參數,就不可能區分參數和參數內的字符*。 – 2014-09-03 15:08:20

+0

另外,非導出的非內建變量應至少包含一個小寫變量,以避免潛在的與環境變量和內建命名空間的命名空間衝突。 – 2014-09-03 15:09:03

+1

BashFAQ#50,http://mywiki.wooledge.org/BashFAQ/050是(相切)相關的,因爲它解決了許多相同的誤解,導致在不適用的情況下使用標量變量。 – 2014-09-03 15:11:06

回答

4

你需要使用一個陣列,不是一個普通的標量變量,爲了這個目的 - 和"[email protected]",不$*

if (($#)); then 
    dirs=("[email protected]") 
else 
    dirs=(.) 
fi 

for dir in "${dirs[@]}"; do 
    ... 
done 

參見BashFAQ #5

1

如果你實際上並不需要一個變量DIR,您可以使用參數擴展的一種形式:

echo "DIR=${@:-.}" 
for dir in "${@:-.}"; do 
    ... 
done