2016-05-22 149 views
1

我想比较Hello Worldhello world。结果应该是真实的,就好像它们是平等的。我做:比较字符串不区分大小写

while read line; do 

    newLine="$newLine$line" 
done < $1 

newp="Hello World" 
if ((${newp,,}==${newLine,,})); then 
    echo "true" 
else 
    echo "false" 

fi 

当我通过包括一个文本文件:

#filename: file.txt 

hello world 

输出似乎是:

./testScript.txt: line 20: 0à»: hello world==hello world : syntax error in expression (error token is "world==hello world ") 
+ echo false 

我在做什么错在这里?此外,有点无关,有没有办法将file.txt中的行传递给一个字符串(newLine),而没有这样做while我已经完成了?

+1

'((a == b))'是数学和数字。 '[[“$ a”=“$ b”]]'用于字符串。空格不是可选的。 –

+0

即使你得到了你的具体问题的答案,周围的循环意味着任何测试都会说'x \ y'匹配'xy'并且可以有其他错误的[错误]匹配。请参阅[为什么要使用shell循环处理文本被认为是坏习惯](http://unix.stackexchange.com/questions/169716/why-is-using-a-shell -loop到过程文本视为坏实践)。 –

+0

您可以使用带'hello world'风格的'grep -v'来测试其他风格。 – boardrider

回答

7

您应该添加逗号并将双括号更改为单个括号。如果陈述应该是这样的:

if [ "${newp,,}" = "${newLine,,}" ]; then 

而且与while循环有关......这取决于你想要做什么。如果像在这种情况下,你想获得整个文件并将其保存为一个字符串,你可以简单地做:

line=$(cat $1) 

我会建议你只使用该循环您写的,如果你试图解析逐行添加文件,即添加if语句,使用不同的变量等等。但对于这样一个简单的例子,cat将会很好。

+0

太棒了,谢谢。 – LamaEu

+0

周围的循环意味着这个测试会说'x \ y'匹配'xy'并且可以有其他的错误匹配。请参阅[为什么要使用shell循环处理文本被认为是坏习惯](http://unix.stackexchange.com/questions/169716/why-is-using-a-shell -loop到过程文本视为坏实践)。 –

0

有一个shell option,nocasematch,它可以启用不区分大小写的模式匹配与[[case一起使用。

比较,通过仅外壳不同的字符串:

$ var1=lowercase 
$ var2=LOWERCASE 
$ [[ $var1 == $var2 ]] && echo "Matches!" || echo "Doesn't match!" 
Doesn't match! 

现在使外壳选项并再次尝试:

$ shopt -s nocasematch 
$ [[ $var1 == $var2 ]] && echo "Matches!" || echo "Doesn't match!" 
Matches! 

只要确保,如果你不与shopt -u nocasematch再将它关闭想做全部比较不区分大小写。

相关问题