Чи є в Bash, якщо [-z "$ 1"] і якщо ["$ 1" = ""] однакові?


28

У сценарії оболонки Баша, яка різниця (якщо така є) між наступними двома твердженнями?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

Я виявив, що я пишу другий у деяких сценаріях, але потім прочитав тут, що за допомогою -zдосягається те саме.

Якщо з використанням другої є проблеми, чи варто ігнорувати, що перший виглядає трохи краще?


3
Для детального порівняння дивіться мою відповідь на "Переповнення стека". Також дивіться це і це .
Призупинено до подальшого повідомлення.

приємні посилання, з приємними відповідями :)
Йохан

Відповіді:


36

[ "$1" = "" ]і [ -z "$1" ]є рівноцінними в баш та інших сумісних з POSIX оболонках. (Зверніть увагу, що на кожній стороні дужок повинно бути пробіл, якщо немає символів, що не містять слова, наприклад ;.)

[- вбудована оболонка, як і будь-яка інша; насправді це також може бути написано test(єдиною різницею між ними є те, що [потрібен ]аргумент як останній). Так що, якщо ви біжите [ "$1" = "" ]з $1розширенням до -z, оператор тесту бачить три аргументи: -z, =і порожній рядок. Деякі старі оболонки Борна іноді кидали помилки синтаксичного аналізу, коли операнд виглядав таким чином оператором, навіть якщо в повному виразі не було двозначності. Я не знаю, чи яка-небудь версія насправді мала проблеми з цим виразом, але більш складні вирази можуть їх відкинути. Можливо, також були версії, які мали проблеми з порожніми словами; вони також не підтримали [ -z "$1" ]б. Поширена оболонка ідіома[ x"$1" = x"" ]. Це дозволяє уникнути ризику розбору операндів як операторів, оскільки жоден оператор не починається з літери.

У КШ, баш і Zsh, ви можете використовувати синтаксис подвійний кронштейн, [[ -z $1 ]]. Цей новіший синтаксис (це вже з кінця 1980-х, а не з середини 1970-х) виключає ризик розбору операндів як операторів, використовуючи спеціальну синтаксичну конструкцію, а не звичайну вбудовану. Оператори повинні відображатися буквально, без котирувань у подвійних дужках, і вам не потрібно подвоювати цитати змінних розширень.


Виправлено помилку друку з пропущеним пробілом поруч із дужкою.
Йоган
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.