Мне нужно проверить наличие входного аргумента. У меня есть следующий скрипт
if [ "$1" -gt "-1" ]
then echo hi
fi
я получил
[: : integer expression expected
Как сначала проверить входной аргумент1, чтобы увидеть, существует ли он?
Это:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
$#
Переменное покажет вам количество входных аргументов был принят сценарий.
Или вы можете проверить, является ли аргумент пустой строкой или нет:
if [ -z "$1" ]
then
echo "No argument supplied"
fi
-z
Коммутатор будет проверять , если расширение «$ 1» пустая строка или нет. Если это пустая строка, то тело выполняется.
[ -z "$1" ] && echo "No argument supplied"
Я предпочитаю однострочники, так как они легче для меня; и это также быстрее проверить выходное значение, по сравнению с использованиемif
exit 1
в конце вашего эха внутри блока if, когда для работы скрипта необходим аргумент. Очевидно, но стоит отметить полноту.programname "" secondarg third
,$#
Проверка однозначно проверяет количество аргументов.if [ ! -z "$1" ]; then ...
Лучше продемонстрировать этот способ
Обычно вам нужно выйти, если у вас слишком мало аргументов.
источник
exit 1
что вы обычно хотите, и использует[[ ]]
тест, который (iirc) обычно более разумен. Так что для людей, слепо копирующих код, это лучший ответ.В некоторых случаях вам нужно проверить, передал ли пользователь аргумент скрипту, и если нет, вернуться к значению по умолчанию. Как в сценарии ниже:
Здесь, если пользователь не передал
scale
второй параметр, я запускаю эмулятор Android-scale 1
по умолчанию.${varname:-word}
является оператором расширения. Есть и другие операторы расширения:${varname:=word}
который устанавливает неопределенное значениеvarname
вместо возвратаword
значения;${varname:?message}
который либо возвращает значение,varname
если оно определено и не равно нулю, либо печатаетmessage
и прерывает скрипт (как в первом примере);${varname:+word}
который возвращаетword
только еслиvarname
он определен и не равен нулю; возвращает ноль в противном случае.источник
${varname?message}
. Это дополнительная:
опечатка, или это меняет поведение?: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
Пытаться:
источник
$#
и0
?else
тоже.foo*
) и разбиение слов (т. е. разбиение содержимого, если значение содержит пробел). В этом случае нет необходимости цитировать,$#
потому что оба из этих случаев не применяются. Заключение в0
кавычки также не обязательно, но некоторые люди предпочитают заключать в кавычки значения, так как они действительно являются строками, и это делает его более явнымДругой способ определить, были ли аргументы переданы в скрипт:
Обратите внимание, что
(( expr ))
выражение будет оцениваться согласно правилам арифметики оболочки .Чтобы выйти при отсутствии каких-либо аргументов, можно сказать:
Другой (аналогичный) способ сказать выше было бы:
help let
говорит:источник
exit
что убивает мой процесс Zsh, я использую,return
который не убивает его((!$#))
вызывать подмену истории?Я часто использую этот фрагмент для простых сценариев:
источник
Только потому, что есть еще одна базовая точка, которую я хочу указать, я добавлю, что вы можете просто проверить, что ваша строка пуста:
Аналогично, если вы ожидаете, что arg count, просто проверьте ваш последний:
и так далее с любым аргументом или вар
источник
Если вы хотите проверить, существует ли аргумент, вы можете проверить, является ли число аргументов большим или равным вашему целевому номеру аргумента.
Следующий скрипт демонстрирует, как это работает
test.sh
производит следующий вывод
источник
В качестве небольшого напоминания, числовые операторы тестирования в Bash работают только с целыми числами (
-eq
,-lt
,-ge
и т.д.)Я хотел бы убедиться, что мои $ Vars являются целыми
прежде чем проверять их, просто для защиты от ошибки «[: integer arg required».
источник
var=$(printf "%.0f" "$var")
может обрабатывать числа с плавающей точкой, но страдает от ненулевого выхода при задании строки. Если вы не возражаете в AWK, это я использую метод представляется наиболее надежным для обеспечения соблюдения целого числа:var=$(<<<"$var" awk '{printf "%.0f", $0}')
. Если переменная не установлена, по умолчанию используется значение «0». Если var - это число с плавающей точкой, оно округляется до ближайшего целого числа. Отрицательные значения также можно использовать.валидация одной строки
добавить имя функции и использование
добавить проверку, чтобы проверить, является ли целое число
чтобы добавить дополнительную проверку, например, чтобы проверить, является ли переданный аргумент целым числом, измените один вкладыш проверки для вызова функции проверки:
затем создайте функцию проверки, которая проверяет аргумент, возвращая 0 в случае успеха, 1 в случае неудачи и функцию die, которая прерывает скрипт в случае неудачи
Еще проще - просто используйте
set -u
set -u
гарантирует, что каждая ссылочная переменная установлена при ее использовании, поэтому просто установите ее и забудьтеисточник