Мне нужно проверить наличие входного аргумента. У меня есть следующий скрипт
if [ "$1" -gt "-1" ]
then echo hi
fi
я получил
[: : integer expression expected
Как сначала проверить входной аргумент1, чтобы увидеть, существует ли он?
Мне нужно проверить наличие входного аргумента. У меня есть следующий скрипт
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» пустая строка или нет. Если это пустая строка, то тело выполняется.
exit 1
в конце вашего эха внутри блока if, когда для работы скрипта необходим аргумент. Очевидно, но стоит отметить полноту.
programname "" secondarg third
, $#
Проверка однозначно проверяет количество аргументов.
if [ ! -z "$1" ]; then ...
Лучше продемонстрировать этот способ
if [[ $# -eq 0 ]] ; then
echo 'some message'
exit 1
fi
Обычно вам нужно выйти, если у вас слишком мало аргументов.
exit 1
что вы обычно хотите, и использует [[ ]]
тест, который (iirc) обычно более разумен. Так что для людей, слепо копирующих код, это лучший ответ.
В некоторых случаях вам нужно проверить, передал ли пользователь аргумент скрипту, и если нет, вернуться к значению по умолчанию. Как в сценарии ниже:
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
он определен и не равен нулю; возвращает ноль в противном случае.${varname?message}
. Это дополнительная :
опечатка, или это меняет поведение?
: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
Пытаться:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi
$#
и 0
?
else
тоже.
foo*
) и разбиение слов (т. е. разбиение содержимого, если значение содержит пробел). В этом случае нет необходимости цитировать, $#
потому что оба из этих случаев не применяются. Заключение в 0
кавычки также не обязательно, но некоторые люди предпочитают заключать в кавычки значения, так как они действительно являются строками, и это делает его более явным
Другой способ определить, были ли аргументы переданы в скрипт:
((!$#)) && echo No arguments supplied!
Обратите внимание, что (( expr ))
выражение будет оцениваться согласно правилам арифметики оболочки .
Чтобы выйти при отсутствии каких-либо аргументов, можно сказать:
((!$#)) && 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.
exit
что убивает мой процесс Zsh, я использую, return
который не убивает его
((!$#))
вызывать подмену истории?
Только потому, что есть еще одна базовая точка, которую я хочу указать, я добавлю, что вы можете просто проверить, что ваша строка пуста:
if [ "$1" ]; then
echo yes
else
echo no
fi
Аналогично, если вы ожидаете, что arg count, просто проверьте ваш последний:
if [ "$3" ]; then
echo has args correct or not
else
echo fixme
fi
и так далее с любым аргументом или вар
Если вы хотите проверить, существует ли аргумент, вы можете проверить, является ли число аргументов большим или равным вашему целевому номеру аргумента.
Следующий скрипт демонстрирует, как это работает
#!/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».
var=$(printf "%.0f" "$var")
может обрабатывать числа с плавающей точкой, но страдает от ненулевого выхода при задании строки. Если вы не возражаете в AWK, это я использую метод представляется наиболее надежным для обеспечения соблюдения целого числа: var=$(<<<"$var" awk '{printf "%.0f", $0}')
. Если переменная не установлена, по умолчанию используется значение «0». Если var - это число с плавающей точкой, оно округляется до ближайшего целого числа. Отрицательные значения также можно использовать.
валидация одной строки
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
}
[ -z "$1" ] && echo "No argument supplied"
Я предпочитаю однострочники, так как они легче для меня; и это также быстрее проверить выходное значение, по сравнению с использованиемif