Мені потрібно перевірити наявність вхідного аргументу. У мене є наступний сценарій
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