Проверьте наличие входного аргумента в скрипте оболочки Bash
мне нужно проверить наличие входного аргумента. У меня есть следующий скрипт
if [ "" -gt "-1" ]
then echo hi
fi
Я
[: : integer expression expected
Как сначала проверить входной аргумент 1, чтобы узнать, существует ли он?
9 ответов
это:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
на $#
переменная сообщит вам количество входных аргументов, переданных скриптом.
или вы можете проверить, является ли аргумент пустой строкой или нет:
if [ -z "" ]
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: 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 @ -scale $scale
здесь, если пользователь не прошел scale
в качестве 2-го параметра, я запускаю эмулятор Android с -scale 1
по умолчанию. ${varname:-word}
- это оператор расширения. Там другие операторы расширения также:
-
${varname:=word}
, который наборы неопределенность возвращениеword
значение; -
${varname:?message}
который либо возвращаетvarname
если он определен и не равен null или печатаетmessage
и прерывает скрипт (как в первом примере); -
${varname:+word}
возвращаетword
только еслиvarname
определяется и не является null; возвращает null в противном случае.
попробуй:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi
другой способ определить, были ли аргументы переданы скрипту:
((!$#)) && 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.
Я часто использую этот фрагмент кода для простой скрипт:
#!/bin/bash
if [ -z "" ]; then
echo -e "\nPlease call ' <argument>' to run this command!\n"
exit 1
fi
в качестве небольшого напоминания числовые тестовые операторы в Bash работают только с целыми числами (-eq
, -lt
, -ge
, etc.)
мне нравится, чтобы мои $vars были ints by
var=$(( var + 0 ))
прежде чем я проверю их, просто чтобы защитить от ошибки "[: integer arg required".
Если вы хотите проверить, существует ли аргумент, вы можете проверить, если # аргументов больше или равно номеру целевого аргумента.
следующий скрипт демонстрирует, как это работает
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
только потому, что есть более базовая точка, чтобы указать, я добавлю, что вы можете просто проверить свою строку null:
if [ "" ]; then
echo yes
else
echo no
fi
аналогично, если вы ожидаете ARG count просто проверьте свой последний:
if [ "" ]; then
echo has args correct or not
else
echo fixme
fi
и так далее с любым arg или var