Проверьте наличие входного аргумента в скрипте оболочки Bash
Мне нужно проверить наличие входного аргумента. У меня есть следующий скрипт
if [ "$1" -gt "-1" ]
then echo hi
fi
я получил
[: : integer expression expected
Как сначала проверить входной аргумент1, чтобы увидеть, существует ли он?
13 ответов
Это:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
$#
переменная сообщит вам количество входных аргументов, которые передал скрипт.
Или вы можете проверить, является ли аргумент пустой строкой или нет:
if [ -z "$1" ]
then
echo "No argument supplied"
fi
-z
switch проверит, является ли расширение $1 пустой строкой или нет. Если это пустая строка, то тело выполняется.
Лучше продемонстрировать этот способ
if [[ $# -eq 0 ]] ; then
echo 'some message'
exit 1
fi
Обычно вам нужно выйти, если у вас слишком мало аргументов.
Если вам интересно только определить, отсутствует ли конкретный аргумент, подстановка параметров хороша:
#!/bin/bash
# usage-message.sh
: ${1?"Usage: $0 ARGUMENT"}
# Script exits here if command-line parameter absent,
#+ with following error message.
# usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
В некоторых случаях вам нужно проверить, передал ли пользователь аргумент скрипту, и если нет, вернуться к значению по умолчанию. Как в сценарии ниже:
scale=${2:-1}
emulator @$1 -scale $scale
Здесь, если пользователь не прошел scale
в качестве второго параметра я запускаю эмулятор Android с -scale 1
по умолчанию. ${varname:-word}
является оператором расширения. Есть и другие операторы расширения:
${varname:=word}
который устанавливает неопределенноеvarname
вместо возвратаword
значение;${varname:?message}
который либо возвращаетvarname
если он определен и не равен нулю или печатаетmessage
и прерывает скрипт (как в первом примере);${varname:+word}
который возвращаетсяword
только еслиvarname
определяется и не является нулевым; возвращает ноль в противном случае.
Пытаться:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi
Только потому, что есть еще одна базовая точка, которую я хочу указать, я добавлю, что вы можете просто проверить, что ваша строка пуста:
if [ "$1" ]; then
echo yes
else
echo no
fi
Точно так же, если вы ожидаете, что arg count, просто проверьте ваш последний:
if [ "$3" ]; then
echo has args correct or not
else
echo fixme
fi
и так далее с любым аргументом или вар
Другой способ определить, были ли аргументы переданы в скрипт:
((!$#)) && echo No arguments supplied!
Обратите внимание, что (( expr ))
заставляет выражение быть оцененным согласно правилам Арифметики Shell.
Чтобы выйти при отсутствии каких-либо аргументов, можно сказать:
((!$#)) && echo No arguments supplied! && exit 1
Другой (аналогичный) способ сказать выше было бы:
let $# || echo No arguments supplied
let $# || { echo No arguments supplied; exit 1; } # Exit if no arguments!
help let
говорит:
let: let arg [arg ...]
Evaluate arithmetic expressions. ... Exit Status: If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
Я часто использую этот фрагмент для простых сценариев:
#!/bin/bash
if [ -z "$1" ]; then
echo -e "\nPlease call '$0 <argument>' to run this command!\n"
exit 1
fi
Более современный
#!/usr/bin/env bash
if [[ $# -gt 0 ]]
then echo hi
else echo no arguments
fi
Если вы хотите проверить, существует ли аргумент, вы можете проверить, является ли число аргументов большим или равным вашему целевому номеру аргумента.
Следующий скрипт демонстрирует, как это работает
test.sh
#!/usr/bin/env bash
if [ $# -ge 3 ]
then
echo script has at least 3 arguments
fi
производит следующий вывод
$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments
Как небольшое напоминание, операторы числовых тестов в Bash работают только с целыми числами (-eq
, -lt
, -ge
, так далее.)
Я хотел бы убедиться, что мои $ Vars являются целыми
var=$(( var + 0 ))
прежде чем проверять их, просто для защиты от ошибки "[: integer arg required".
проверка функции одного лайнера bash
myFunction() {
: ${1?"forgot to supply an argument"}
if [ "$1" -gt "-1" ]; then
echo hi
fi
}
добавить имя функции и использование
myFunction() {
: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage: ${FUNCNAME[0]} some_integer"}
if [ "$1" -gt "-1" ]; then
echo hi
fi
}
добавить проверку, чтобы проверить, целое ли число
чтобы добавить дополнительную проверку, например, чтобы проверить, является ли переданный аргумент целым числом, измените строку проверки, чтобы вызвать функцию проверки:
: ${1?"forgot to supply an argument ${FUNCNAME[0]}() Usage: ${FUNCNAME[0]} some_integer"} && validateIntegers $1 || die "Must supply an integer!"
затем создайте функцию проверки, которая проверяет аргумент, возвращая 0 в случае успеха, 1 в случае ошибки и функцию die, которая прерывает скрипт в случае ошибки.
validateIntegers() {
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
return 1 # failure
fi
return 0 #success
}
die() { echo "$*" 1>&2 ; exit 1; }
Еще проще - просто используйте set -u
set -u
гарантирует, что каждая ссылочная переменная установлена при ее использовании, поэтому просто установите ее и забудьте
myFunction() {
set -u
if [ "$1" -gt "-1" ]; then
echo hi
fi
}
Просто проверьте правдивость этого аргумента:
if [ $1 ] ; then
echo $1
else
echo "no param"
fi
В моем случае единственное рабочее решение для проверки наличия последних аргументов:
if [[ "$7" == '' ]] ; then
echo "error"
exit
fi