不区分大小写地比较字符串

时间:2016-05-22 23:34:12

标签: bash shell unix

我想将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我做过的事情?

2 个答案:

答案 0 :(得分:7)

您应该添加逗号并将双括号更改为单括号。 if语句应该是这样的:

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

与此相关的循环......这取决于你想做什么。如果,就像在这种情况下,您想要获取整个文件并将其保存为单个字符串,您可以这样做:

line=$(cat $1)

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

答案 1 :(得分:0)

shell optionnocasematch,可启用不区分大小写的模式匹配,以便与[[case一起使用。

比较仅以外壳不同的字符串:

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

现在启用shell选项并再次尝试:

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

如果您不希望所有比较不区分大小写,请确保使用shopt -u nocasematch再次将其关闭。

相关问题