2015-12-20 23 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