Проверьте наличие входного аргумента в скрипте оболочки 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