2010-08-03 48 views
1

我瘋了這個......讓我解釋一下......bash腳本中字符串變量的奇怪行爲...請幫忙!

我有一個非常簡單的Bash腳本,它有一個函數,它接收3個參數。這些論據都是字符串。一切工作正常'直到我必須傳遞一個字符串與空格到函數。

我也有一些測試代碼來調用函數(他的名字是substracFromFile):

# try the function 

PATTERN=`echo -e '<Location test14>'` 

echo "PATTERN IS $PATTERN" 

HEADERPATTERN=`echo -e '<Location [a-zA-Z0-9]*>'` 

echo "HEADERPATTERN IS $HEADERPATTERN" 

FILE="subversion.conf" 

echo "FILE IS $FICHERO" 

substracFromFile $PATTERN $HEADERPATTERN $FILE 

的這個輸出是:

PATTERN IS <Location prueba14> 
HEADERPATTERN IS <Location [a-zA-Z0-9]*> 
FILE IS subversion.conf 
PATTERN ARGUMENT IS <Location 
HEADERPATTERN ARGUMENT IS prueba14> 
FILE ARGUMENT IS <Location 
grep: <Location: No such file or directory 
expr: syntax error 

正如你所看到的,當參數傳遞功能和我呼應他們屏幕他們在某種程度上分裂在白色空間...讓我告訴你功能初始代碼:

function substracFromFile 
{ 

     PATTERN=$1 

     HEADERPATTERN=$2 

     FILE=$3 

     # Debug only 
     echo "HEADER ARGUMENT IS $PATTERN" 

     # Debug only 
     echo "HEADERPATTERN ARGUMENT IS $HEADERPATTERN" 

     # Debug only 
     echo "FILE ARGUMENT IS $FILE" 

只要傳遞的字符串根本沒有空格,它就可以工作得很甜蜜。當我調用函數字符串似乎沒問題,但我不明白爲什麼他們被分割一旦函數被調用....我敢肯定這是非常沉悶的東西,但我只是不明白它.. 。

在預先感謝你的問題的 亞歷

+1

嘗試向所有變量添加雙引號 – ghostdog74 2010-08-03 11:47:46

回答

1

零件與其他部分不一致。例如:

FILE="subversion.conf" 

echo "FILE IS $FICHERO" 

但我假設這些只是發佈問題時發生的錯誤。

由於ghostdog74在評論中提到,您需要引用包含空白的變量。特別是,這條線應該有引號的變量:

substracFromFile "$PATTERN" "$HEADERPATTERN" "$FILE" 

另外,我不明白爲什麼你用echo設置在線路的變量,如這一個:

PATTERN=`echo -e '<Location test14>'` 

這可能僅僅是:

PATTERN='<Location test14>' 

如果該值有時已經逃跑了特殊字符,你可以使用以下方法之一:

PATTERN=$'value\nwith\tescapes' 

哪些「價值」換行「與」選項卡「轉義」作爲它的價值。

此外,我建議養成對變量名不使用全部大寫的習慣。這將減少與Bash內置變量發生名稱衝突的可能性。

+0

嗨丹尼斯,你說得對,那些只是錯別字,我在發帖時將腳本從西班牙語翻譯成英語......對不起。 這裏的問題是,當我得到函數中的參數,如果他們有空格,他們會搞砸。我會試着用帶引號的參數來調用函數,不知道我是否已經嘗試過。 我會讓你知道,如果我取得任何進展 同意有關的變量名:) 問候 – AlejandroVK 2010-08-04 08:23:22

+0

你是對的,調用該函數解決了問題,當報價參數...我想了解的原因這雖然... 再次感謝 亞歷克斯 – AlejandroVK 2010-08-04 08:26:44

+0

@AlejandroVK:引用參數防止他們被分割在空白(IFS的變量 - 通常包括空格,製表符和換行符)。這對大多數(如果不是所有的Unix shell)都是很常見的[進一步閱讀](http://mywiki.wooledge.org/WordSplitting)和[這裏](http://tiswww.case.edu/php/chet/bash/bashref.html#SEC35)。 – 2010-08-04 13:55:02