2014-09-22 2 views
2

У меня есть сценарий здесь включает в себя этот фрагмент:Почему этот скрипт bash добавляет письмо перед сравнением?

read -p ">" DEPLOY_CONFIRM 
if [ "xy" != "x$DEPLOY_CONFIRM" ] ; then 
    .. snip .. 
fi 

является добавление х перед выполнением сравнения важно? Я предполагаю, что это защищает пользователя от ввода чего-то, что начинается с забавного персонажа.

ответ

4

Префикс каждой переменной и литерала с известным постоянным литералом x был выполнен в старых сценариях оболочки при использовании некорректированной переменной для повторной проверки ошибки, например unary operator expected.

Пока вы используете цитируемые переменные, вам не нужен этот префикс x.

Таким образом, можно очень хорошо использовать это в BASH:

read -p ">" DEPLOY_CONFIRM 
if [[ "$DEPLOY_CONFIRM" == [Yy] ]]; then 
    .. snip .. 
fi 

Для создания этого использования ошибки сниппет так:

unset s 
[ "y" = $s ] && echo "matched" 
-bash: [: y: unary operator expected 

А потом увидеть улучшение поведения с префиксом с x:

[ "xy" = x$s ] && echo "matched" 
+1

Я думаю * действительно * старые снаряды имели ошибка (функция?), Где даже в кавычках пустая строка была удалена, так что даже '[«у»=«$ s»]' потерпит неудачу, если '$ S 'были пустыми, следовательно, символ охраны, чтобы ни одна строка не была пуста. – chepner

0

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

[ "y" = "$s" ] && echo "matched"