2016-05-22 2 views
1

Я хочу сравнить Hello World с hello 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' и может иметь другое совпадение false [mis]. См. [Why-is-use-a-shell-loop-to-process-text -emed-bad-practice] (http://unix.stackexchange.com/questions/169716/why-is-using-a-shell -loop-процесс-текст рассмотренной-плохая практика). –

+0

Вы можете использовать 'grep -v' с одним стилем' hello world' для тестирования другого стиля. – boardrider

ответ

7

Вы должны добавить запятые и сменить двойные скобки на отдельные скобки. Заявление if должно быть примерно таким:

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

И по отношению к этому циклу while ... Это зависит от того, что вы хотите сделать. Если, как в данном случае, вы хотите получить весь файл и сохранить его в виде одной строки, вы можете просто сделать:

line=$(cat $1) 

Я хотел бы предложить вам использовать только ту петлю, которую Вы написали, если вы пытаетесь разобрать файл за строкой, то есть добавление операторов if, использование разных переменных и т. д. Но для простого случая, подобного этому, cat будет прекрасно.

+0

Удивительный, спасибо. – LamaEu

+0

Окружающая петля означает, что этот тест скажет, что 'x \ y' соответствует' xy' и может иметь другие ложные совпадения. См. [Why-is-use-a-shell-loop-to-process-text -emed-bad-practice] (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, если вы этого не сделаете хочет все сравнение без учета регистра.

Смежные вопросы