Pull to refresh

Comments 12

Я всегда воспринимал этот х как (cast String), чтобы неизвесто что гарантировано было строкой.
А я всегда (ещё со времён .bat файлов DOS, с далёких 80-х годов) воспринимал это именно как экранирующий символ для всяких спецсимволов, с которых могла начинаться переменная и всегда так экранировал переменные в своих .bat файлах. И мне странно что такое очевидное на мой взгляд предназначение 'x' в начале переменной может быть таким спорным и неоднозначным.
Отчасти так и есть, в примере с длиной строки показывается, как оболочка ухитряется интерпретировать "-l" в переменной как опцию [.
Подозреваю, что частично это растет еще вот отсюда

bytamine@bytamine-pc:~$ [ $var == test ] && echo «yes» || echo «no»
bash: [: ==: unary operator expected
no
bytamine@bytamine-pc:~$ [ x$var == xtest ] && echo «yes» || echo «no»
no
bytamine@bytamine-pc:~$ var=test
bytamine@bytamine-pc:~$ [ x$var == xtest ] && echo «yes» || echo «no»
yes
Да, но конкретно эта проблема всегда решалась кавыками. Это же решение прекрасно работает и на современном баше, и на условном ksh из 95-ого (честно, специально проверял как-то) :)

→ [ $var == test ] && echo "yes" || echo "no"
no
→ [ "$var" == test ] && echo "yes" || echo "no"
no
→ var=test
→ [ "$var" == test ] && echo "yes" || echo "no"
yes
У вас равно больше чем нужно :)
> оболочке Борна
Давайте все-таки Bourne shell писать, у нас же не Идентификация Борна тут
«Идентификация Борна» это первая часть относительно современной (с 2000-х годов) пенталогии. А «Оболочка Борна» это приквел, вышедший ещё в 1979 году!
А что делать с «Борн против Оболочки»?

Это они с юникодными строками просто не работали, когда из одного приложения прилетает пустая строка с BOM, и ее надо сравнить с другой пустой строкой без BOM. При конкатенации BOM любезно вырезается башем (главное, чтобы он был собран с поддержкой unicode). И тогда "x${foo}"="x".

Автор перебрал все ошибки различных шелов и сделал абсолютно неверный вывод что техника устарела и не должна применяться. И забыл про то, что ошибки бывают и у скриптописателей. Это техника защищает от случаев когда в бинарном операторе используется переменная, которая не была определена. Особенно когда переменная сорсится из «конфигурационного файла» и может быть просто по ошибке удалена.
Sign up to leave a comment.