2015-12-20 21 views
0

我有以下腳本。bash中變量結尾處的echo asterix

#!/bin/bash 

PHOTOS_DIR=$1 
PHOTOS_LIST=$2 

while read line   
do 
    echo "line: ${line}" 
    pattern="*`echo \"$line\" | tr ' ' '*'`*" 
    echo "pattern: ${pattern}" 
done <$PHOTOS_LIST 

它給出了非常奇怪的輸出。例如:

line: 20121224-100 5777 
*attern: *20121224-100*5777 
line: 20121224-100 5778 
*attern: *20121224-100*5778 

我試着逃脫最後一個asterix字符,但它不工作。

line: 20121224-100 5777 
\*ttern: *20121224-100*5777 
line: 20121224-100 5778 
\*ttern: *20121224-100*5778 

如果我試圖在bash控制檯類似的事情,它工作得很好:

$ line='a b' 
$ pattern="*`echo \"$line\" | tr ' ' '*'`*" 
$ echo "pattern: ${pattern}" 
pattern: *a*b* 

什麼是錯誤的腳本?


我做了另一個測試。以下運作良好。

for line in "20121224-100 5777" "20121224-100 5778" 
do 
    echo -e "line: ${line}" 
    pattern="*`echo \"$line\" | tr ' ' '*'`*" 
    echo -e "pattern: ${pattern}" 
done 

有這東西while read line循環。但是什麼?

+1

請看看:http://www.shellcheck.net/ – Cyrus

+0

很好的工具。我以前不知道。我修復了錯誤,但沒有幫助。 – gumik

回答

4

輸入文件$PHOTOS_LIST具有CRLF行結束。
運行dos2unix $PHOTOS_LIST改好文件。

或者,試試這個:

#!/bin/bash 

PHOTOS_DIR=$1 
PHOTOS_LIST=$2 

while read line   
do 
    echo "line: ${line}" 
    pattern="*`echo \"$line\" | tr ' ' '*'`*" 
    echo "pattern: ${pattern}" 
done < <(tr -d '\n' < $PHOTOS_LIST) 
+0

你是對的!其實我現在自己找到了。尊重你只需看看輸出就能搞清楚! – gumik