2016-11-22 2 views
0

У меня есть пустая переменная. Когда яРазличное поведение при удвоении двойных котировок

if [[ -z "$value" ]]; then echo "hello"; fi

выход привет

Однако, когда я убегаю в двойные кавычки, то есть

if [[ -z \"$value\" ]]; then echo "hello"; fi

привет не печатается на экране.

В чем разница между двумя вышеуказанными командами?

+0

Обратная косая черта? Второй передает двойную кавычку, за которой следуют ничто и двойная кавычка в качестве аргумента для проверки на пустоту, а две двойные кавычки не являются пустой строкой. Первый передает пустую строку; кавычки удаляются, а пустая строка - пустая строка. –

+2

Пожалуйста, добавьте тег, чтобы указать, какую оболочку вы используете. Я догадываюсь, но я не хочу этого делать. –

+0

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

ответ

1

Это потому, что в первом выражении переменная расширяется и итоговый оператор равен нулю.

Принимая во внимание, что во втором он расширяется до "". Чтобы увидеть разницу, рассмотрите два выступления эха,

$ echo "$value" 

$ echo \"$value\" 
"" 

Первый - это нуль, где второй нет.

+0

хорошо иллюстрированный –

0

if [[ -z "$value" ]]; then echo "hello"; fi проверяет, не является ли строковое значение в переменной $value. Но if [[ -z \"$value\" ]]; then echo "hello"; fi (при условии, что $value не содержит пробелов) проверяет, не является ли строка, начинающаяся с " и заканчивающаяся ". Но этого никогда не бывает, потому что он всегда содержит как минимум два символа.

1

В Shell есть три вида котировок.

  1. Одинарная кавычка (»«)

    Все специальные символы между этими цитатами теряют особый смысл.

    так echo '$VALUE'

    буквально печать $VALUE, потому что $ теряет свой особый смысл в одинарные кавычки.

  2. двойные кавычки (»«)

    Большинство специальных символов между этими цитатами теряют особый смысл с некоторыми исключениями, как $ среди других.

  3. Назад Цитата ()

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

    Backslash

    Любой символ сразу после обратной косой черты теряет свой особый смысл.

так в вашем случае, когда вы говорите \"$value\" из-за обратной косой черты двойные кавычки потеряет смысл и будет оцениваться как она есть.

например, если у вас есть value=34, тогда \"$value\" будет оценивать до "34" с двойными кавычками. и если значение равно нулю, как в вашем случае, то \"$value\" будет оценивать ""

, так что это не ноль, а строка с двойными кавычками, и именно поэтому сбой нулевой проверки.

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