Это работает в командной строке (bash, dash):
[ -z "" ] && echo A || echo B
A
Тем не менее, я пытаюсь написать сценарий оболочки POSIX , он начинается так:
#!/bin/sh
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
readonly raw_input_string=${1}
[ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1
И я не знаю почему, но я не понимаю :
Данный аргумент пуст.
если я назову скрипт так:
./test_empty_argument ""
Это почему?
shell-script
arguments
LinuxSecurityFreak
источник
источник
if [ X”” = X”$var” ] ; then echo isempty ; fi
[ "" = "$var" ]
будет работать нормально; цитируемая пустая строка не будет удалена из списка аргументов[
. Но и в этом нет необходимости, потому что[ -z "$var" ]
тоже работает просто отлично.Ответы:
Обратите внимание, что ваша линия
это так же, как
(
;
в большинстве случаев без кавычек можно заменить символ новой строки)Это означает, что
exit 1
оператор всегда выполняется независимо от того, сколько аргументов было передано в сценарий. Это, в свою очередь, означает, что сообщениеThe given argument is empty.
никогда не будет напечатано.Чтобы выполнить более одного оператора после теста с использованием «синтаксиса короткого замыкания», сгруппируйте операторы в
{ ...; }
. Альтернативой является использование правильногоif
выражения (которое, IMHO, выглядит более чистым в скрипте):У вас та же проблема со вторым тестом.
относительно
Это будет работать для данного примера, но общий
бы не быть таким же , как
Вместо этого это больше похоже на
или
То есть, если тест или первая команда не пройдены, выполняется вторая команда, что означает, что она потенциально может выполнить все три задействованных оператора.
источник
Эта:
не является:
Но вместо этого есть:
Ваш сценарий завершается независимо от того, сколько аргументов вы ему передали.
источник
Один из способов сделать его более читабельным - это определить
die
функцию (а-ляperl
), например:Вы можете добавить больше звонков и свистков, таких как цвета, префикс, номер строки ... при необходимости.
источник
die
функцию с несколькими аргументами? (Если да, можете ли вы привести пример?) Я использую почти идентичнуюdie
функцию, но использую"$*"
вместо этого, что может быть больше, чем вы собираетесь?"$@"
том, что он позволяет многострочным сообщениям без необходимости добавлять буквенные переводы строк."$*"
для объединения аргументов с пробелами также означает, что вам нужно установить$IFS
SPC, чтобы он работал во всех контекстах, включая те, где$IFS
он был изменен. В качестве альтернативы сksh
/zsh
, вы можете использоватьprint -r -- "$@"
илиecho -E - "$@"
вzsh
.die
функции -типа. Я спрашиваю: на практике вы когда-нибудь видели, чтобы кто-нибудь писалdie "unable to blah:" "some error"
, чтобы получить сообщение об ошибке в 2 строки?die() { IFS=" "; printf >&2 "%s\n" "$*"; exit 1; }
. Вы когда-нибудь лично использовали такуюdie
функцию, чтобыprintf
генерировать многострочное сообщение об ошибке, передавая несколько аргументов? Или вы передаете только один аргумент, чтобыdie
он добавлял только один символ новой строки в свой вывод?Я часто видел это как тест для пустой строки:
источник
-a
,-o
,(
и ,)
как derectives сказать ,test
чтобы объединить несколько операций в одном вызове избегать; см. маркеры OB в pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html )./bin/sh
и непосредственный предшественник Heirloom Bourne) также не имела ее.