Проверьте наличие входного аргумента в скрипте оболочки Bash - PullRequest
1123 голосов
/ 26 июня 2011

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

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

Я получаю

[: : integer expression expected

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

Ответы [ 9 ]

1959 голосов
/ 26 июня 2011

Это:

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

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

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

if [ -z "$1" ]
  then
    echo "No argument supplied"
fi

Переключатель -z проверит, является ли расширение "$ 1" пустой строкой или нет.Если это пустая строка, то тело выполняется.

291 голосов
/ 13 ноября 2013

лучше продемонстрировать так

if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 1
fi

Обычно вам нужно выйти, если у вас слишком мало аргументов.

90 голосов
/ 31 июля 2014

В некоторых случаях вам нужно проверить, передал ли пользователь аргумент скрипту, и если нет, вернуться к значению по умолчанию.Как в приведенном ниже сценарии:

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определяется и не является нулевым;в противном случае возвращает ноль.
38 голосов
/ 21 октября 2013

Попробуйте:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi
33 голосов
/ 20 июля 2013

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

((!$#)) && 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.
19 голосов
/ 29 декабря 2017

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

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi
8 голосов
/ 03 августа 2018

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

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

Точно так же, если вы ожидаете, что число аргументов будет проверено последним:

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

и т. Д. С любым аргументом или переменным

3 голосов
/ 13 сентября 2017

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

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

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
3 голосов
/ 25 октября 2013

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

Мне бы хотелось, чтобы мои $ vars были

var=$(( var + 0 ))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...