Intereting Posts

строка и числовое сравнение в bash в тестовых утверждениях?

Я не уверен в этом сравнении, я делаю:

if [ "$exit_status" -eq 0 ];then #some statements fi 

это правильный способ сравнения чисел или кавычек, чтобы переменная exit_status была сравнима с 0. Я не знаю, может ли это сбой в некотором сценарии.

[ "$exit_status" -eq 0 ] верен, если $ exit_status содержит только цифры, и вы можете просто удалить кавычки (если IFS не содержит цифр).

Если x пуст или не задан, [ "$x" -eq 6 ] приводит к ошибке, но [[ "$x" -eq 6 ]] не выполняет:

 $ x=; [ "$x" -eq 6 ] -bash: [: : integer expression expected $ unset x; [ "$x" -eq 6 ] -bash: [: : integer expression expected $ x=; [[ "$x" -eq 6 ]] $ unset x; [[ "$x" -eq 6 ]] $ 

Арифметические операторы пропускают пробелы:

 $ [ '6 ' -eq $'\n\t6' ]; echo $? 0 

Внутри [[операнды арифметических операторов являются арифметическими выражениями, поэтому, например, [[ 4 -eq 2+2 ]] истинно. Числа, начинающиеся с 0, рассматриваются как восьмеричные числа:

 $ [[ 010 -eq 8 ]]; echo $? 0 $ [ 010 -eq 8 ]; echo $? 1 

Я часто использую = / == даже для сравнения целых чисел. = и == эквивалентны в bash внутри обоих [[и [. == и [[не определены POSIX.

Разделение слов и расширение имени пути не выполняются внутри [[. [[ $x = $y ]] рассматривает y как шаблон, но [[ $x = "$y" ]] обрабатывает y буквально:

 $ x=44; y='4*' $ [[ $x = $y ]]; echo $? 0 $ [[ $x = "$y" ]]; echo $? 1 

Да, это правильно.

Котировки в оболочках для разных целей, чем на других языках. См. Этот ответ для получения более подробной информации.

В оболочке кавычки используются, чтобы предотвратить оболочку для обработки некоторых символов специально и для предотвращения некоторых операций, которые оболочка в противном случае выполняла бы при некоторых типах расширения (например, в случае расширения переменной).

Как правило, в этом случае вы хотите, чтобы "$exit_status" был добавлен к одному аргументу в [ команду, которая является содержимым этого varaible, поэтому вам нужны кавычки.

Однако цитаты не очень полезны. Если значение параметра – это число, то кавычки ничего не меняют, и если это не так, то в противном случае произойдет сбой. Хорошо, не в каждом случае:

 exit_status="a = a -o 0"; [ "$exit_status" -eq 0 ] # returns false exit_status="a = a -o 0"; [ $exit_status -eq 0 ] # returns true 

Это связано с тем, что [ является встроенным bash, но тем не менее простой командой, тогда как [[ является составной командой, которая меняет синтаксический анализ командной строки).