Мені потрібно перевірити наявність вхідного аргументу. У мене є наступний сценарій
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
визначено і не є нульовим; повертає null в іншому випадку.${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 ))
змушує вираз оцінюватись за правилами арифметики 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.
exit
вбиває мій процес zsh, я використовую той, return
що не вбиває його
((!$#))
викликати заміну історії?
Тільки тому, що є більше базової точки, на яку слід зазначити, я додам, що ви можете просто протестувати рядок - нуль
if [ "$1" ]; then
echo yes
else
echo no
fi
Так само якщо ви очікуєте, що кількість аргументів просто перевіряйте останню:
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 потрібно".
var=$(printf "%.0f" "$var")
може обробляти поплавці, але страждає від ненульового виходу, коли дається рядок. Якщо ви не заперечуєте в AWK, це я використовую метод є найбільш надійним для забезпечення дотримання цілого числа: var=$(<<<"$var" awk '{printf "%.0f", $0}')
. Якщо var не встановлено, він за замовчуванням встановлений на "0". Якщо var - float, він округляється до найближчого цілого числа. Негативні значення також чудово використовувати.
валідація функції однієї вкладиші
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