Я хотел бы, чтобы мой сценарий Bash выводил сообщение об ошибке, если требуемый счетчик аргументов не выполняется.
Я попробовал следующий код:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
По неизвестной причине я получил следующую ошибку:
test: line 4: [2: command not found
Что я делаю неправильно?
test
. Это название стандартной команды Unix, вы бы не хотели ее скрывать.test
нормально, если его нет в PATH?Ответы:
Как и любая другая простая команда,
[ ... ]
илиtest
требует пробелов между ее аргументами.Или
Предложения
В Bash предпочтительнее использовать
[[ ]]
вместо этого, так как он не выполняет разбиение слов и расширение пути к своим переменным, в кавычках нет необходимости, если они не являются частью выражения.Он также имеет некоторые другие функции, такие как группировка условий без кавычек, сопоставление с образцом (расширенное сопоставление с шаблоном
extglob
) и сопоставление с регулярным выражением.В следующем примере проверяется, допустимы ли аргументы. Это позволяет один аргумент или два.
Для чистых арифметических выражений, с помощью
(( ))
некоторых все еще может быть лучше, но они все еще возможны[[ ]]
с его арифметическими операторами нравятся-eq
,-ne
,-lt
,-le
,-gt
, или-ge
путь размещения выражения в виде одной строки аргумента:Это должно быть полезно, если вам нужно будет сочетать его с другими функциями
[[ ]]
.Выход из скрипта
Также логично заставить скрипт завершать работу, когда ему передаются недопустимые параметры. Это уже было предложено в комментариях по ekangas , но кто - то редактировал этот ответ , чтобы иметь его
-1
в качестве возвращаемого значения, так что я мог бы также сделать это правильно.-1
хотя принятый Bash в качестве аргумента,exit
явно не задокументирован и не может быть использован в качестве общего предложения.64
также является наиболее формальным значением, так как оно определено вsysexits.h
с#define EX_USAGE 64 /* command line usage error */
. Большинство инструментов вродеls
также возвращают2
неверные аргументы. Я также использовал для возврата2
в своих сценариях, но в последнее время я больше не заботился, а просто использовал1
во всех ошибках. Но давайте просто разместим2
здесь, поскольку это наиболее распространенный и, вероятно, не зависит от ОС.Ссылки
источник
[
это просто другая команда, то есть попыткаwhich [
.[
это встроенное, а[[
ключевое слово. В некоторых старых оболочках[
даже не встроено. Такие команды, как,[
естественно, сосуществуют как внешние команды в большинстве систем, но внутренние команды имеют приоритет над командной оболочкой, если вы не используетеcommand
илиexec
. Проверьте документацию оболочки о том, как они оценивают. Обратите внимание на их разницу и то, как они могут вести себя по-разному в каждой оболочке.Это может быть хорошей идеей использовать арифметические выражения, если вы имеете дело с числами.
источник
[ ... ]
Когда это просто отлично справляется с работой и не требует никаких причудливых операций?$(( ))
не причудливы и должны быть реализованы всеми оболочками POSIX. Однако(( ))
синтаксис (без$
) не является его частью. Если вы по какой-то причине ограничены, то, конечно, вы можете использовать[ ]
вместо этого, но имейте в виду, что тогда вы также не должны использовать[[ ]]
. Я надеюсь, что вы понимаете подводные камни[ ]
и причины, по которым эти функции существуют. Но это был вопрос Bash, поэтому мы даем ответы Bash ( «Как правило, [[используется для строк и файлов. Если вы хотите сравнить числа, используйте выражение ArithmeticExpression» ).On []:! =, =, == ... - операторы сравнения строк, а -eq, -gt ... - арифметические двоичные операторы .
Я хотел бы использовать:
Или:
источник
==
на самом деле не документировано, что случается работать с GNUtest
. Это также случается работать с FreeBSDtest
, но может не работать на обувtest
. Только стандартное сравнение=
(просто FYI).dash
:dash -c '[ 1 == 1 ]'
. POSIX только указывает=
, а не==
.Если вы заинтересованы в освобождении от обязательств только в том случае, если отсутствует конкретный аргумент, подстановка параметров хороша :
источник
Простой один лайнер, который работает, может быть сделан, используя:
Это разбивается на:
Думает отметить:
источник
exit 1
это применимо только к контексту подоболочки, делая его просто синонимом( usage; false )
. Я не поклонник такого упрощения, когда дело доходит до разбора опций, но вы можете использовать{ usage && exit 1; }
вместо этого. Или, возможно, просто{ usage; exit 1; }
.{...}
является распространенным синтаксисом и доступен большинству, если не всем оболочкамsh
, даже тем старым оболочкам, которые не соответствуют стандартам POSIX.Проверьте это bash шпаргалку, это может помочь много.
Чтобы проверить длину передаваемых аргументов, вы используете
"$#"
Чтобы использовать массив переданных аргументов, вы используете
"$@"
Пример проверки длины и итерации:
Это помогло мне, но мне не хватало нескольких вещей для меня и моей ситуации. Надеюсь, это кому-нибудь поможет.
источник
Если вы хотите быть в безопасности, я рекомендую использовать getopts.
Вот небольшой пример:
подробности см. здесь, например, http://wiki.bash-hackers.org/howto/getopts_tutorial
источник
Здесь простые строки, чтобы проверить, задан ли только один параметр, иначе выйдите из скрипта:
источник
Вы должны добавить пробелы между условиями теста:
Надеюсь, это поможет.
источник