2014-09-16 8 views
0

Я пишу скрипт оболочки, в котором я пытаюсь сравнить 2 переменных, которые являются строками. Все прекрасно работает, так как во всех переменных есть значение из команд, однако инструкция if if else else не работает.Bash if else сравнение строковых переменных

#!/bin/bash 

name=$1 

for i in {1...10} 

do   
username=sudo cat /class/rolls/CSCE215-*|awk 'BEGIN {FIELDWIDTHS = "32 20"} {print $2}'|cut -d " " -f6 |sed -n '1,1p' 

if ["$name" == "$username"] 
then 
echo Correct Username 
else 
echo Incorrect Username 
fi 

done 

Все учебники и помочь в Интернете, кажется, есть то, что я здесь, но я не могу выяснить, что случилось с моим.

+2

Вы должны добавить пробелы после '[' и before ']': 'if [" $ name "==" $ username "]' –

+1

Использовать [ShellCheck] (http://www.shellcheck.net/#) –

ответ

1

При использовании test или [, правильное сравнение:

test "$string1" = "string2" 

или

[ "$sting1" = "$string2" ] 

Примечание: сингл = вместо == и всегда приводите жалят переменные. Кроме того, существует ничего плохого с использованием операторов test или [, по сути, они предпочитают, когда необходима переносимость. Им просто не хватает некоторых расширенных функций оператора [[, таких как класс символов сравнение и возможность использования =~.

Теперь при использовании оператора [[, правильная форма:

[[ "$sting1" == "$string2" ]] 

Примечание: как указывалось, котировки не требуется при использовании оператора [[, но если вы получаете в привычку всегда цитируя строки, вы будете в безопасности в обоих случаях.

+0

+1: s/sting/string и кавычки не требуются внутри '[[..]]'. –

+0

Правильно, но, как правило, я предпочитаю объяснять его цитируемыми переменными в интересах тех, кому не хватает такой глубины понимания, нужны ли кавычки с помощью '[' или '[['. Таким образом, они по умолчанию используют безопасное выражение. –

+0

Вы правы, что тест является предпочтительным для переносимости. У него много неприятных ловушек. Во многих случаях переносимость не является проблемой (большую часть времени вы уверены, что всегда будете запускать скрипт с bash), и поэтому я бы сказал, что условное выражение действительно предпочтительнее. – rje

1

Вы используете «классический тест», но это хорошая идея, чтобы всегда использовать новую условное выражение: http://wiki.bash-hackers.org/syntax/ccmd/conditional_expression

if [[ "$name" == "$username" ]] 

Насколько я знаю тестовую команду (с одним кронштейном) не даже официально поддерживают оператора «==».

О, и, конечно же, не забывайте о пространствах внутри скобок, bash требует, чтобы они разбивали линию на слова.

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