Проверьте наличие входного аргумента в скрипте оболочки Bash

Мне нужно проверить наличие входного аргумента. У меня есть следующий скрипт

if [ "$1" -gt "-1" ]
  then echo hi
fi

я получил

[: : integer expression expected

Как сначала проверить входной аргумент1, чтобы увидеть, существует ли он?

13 ответов

Решение

Это:

if [ $# -eq 0 ]
  then
    echo "No arguments supplied"
fi

$# переменная сообщит вам количество входных аргументов, которые передал скрипт.

Или вы можете проверить, является ли аргумент пустой строкой или нет:

if [ -z "$1" ]
  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: $0 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 @$1 -scale $scale

Здесь, если пользователь не прошел scale в качестве второго параметра я запускаю эмулятор Android с -scale 1 по умолчанию. ${varname:-word} является оператором расширения. Есть и другие операторы расширения:

  • ${varname:=word} который устанавливает неопределенное varname вместо возврата word значение;
  • ${varname:?message} который либо возвращает varname если он определен и не равен нулю или печатает message и прерывает скрипт (как в первом примере);
  • ${varname:+word} который возвращается word только если varname определяется и не является нулевым; возвращает ноль в противном случае.

Пытаться:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi

Только потому, что есть еще одна базовая точка, которую я хочу указать, я добавлю, что вы можете просто проверить, что ваша строка пуста:

if [ "$1" ]; then
  echo yes
else
  echo no
fi

Точно так же, если вы ожидаете, что arg count, просто проверьте ваш последний:

if [ "$3" ]; then
  echo has args correct or not
else
  echo fixme
fi

и так далее с любым аргументом или вар

Другой способ определить, были ли аргументы переданы в скрипт:

((!$#)) && 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.

Я часто использую этот фрагмент для простых сценариев:

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi

Более современный

      #!/usr/bin/env bash

if [[ $# -gt 0 ]]
  then echo hi
  else echo no arguments
fi

Если вы хотите проверить, существует ли аргумент, вы можете проверить, является ли число аргументов большим или равным вашему целевому номеру аргумента.

Следующий скрипт демонстрирует, как это работает

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

Как небольшое напоминание, операторы числовых тестов в Bash работают только с целыми числами (-eq, -lt, -ge, так далее.)

Я хотел бы убедиться, что мои $ Vars являются целыми

var=$(( var + 0 ))

прежде чем проверять их, просто для защиты от ошибки "[: integer arg required".

проверка функции одного лайнера bash

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

}

Просто проверьте правдивость этого аргумента:

      if [ $1 ] ; then
    echo $1
else
    echo "no param"
fi

В моем случае единственное рабочее решение для проверки наличия последних аргументов:

if [[ "$7" == '' ]] ; then
  echo "error"
  exit
fi
Другие вопросы по тегам