Как проверить, нет ли в команде параметров?


Ответы:


112

Чтобы проверить, не было ли аргументов, предоставленных команде, проверьте значение $#переменной затем,

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi

Если вы хотите использовать $*( не предпочтительно ), то,

if [ "$*" == "" ]; then
    echo "No arguments provided"
    exit 1
fi

Некоторое объяснение:

Второй подход не является предпочтительным, потому что в позиционном расширении параметров *расширяется до позиционных параметров, начиная с одного. Когда раскрытие происходит в двойных кавычках, оно расширяется до одного слова со значением каждого параметра, разделенного первым символом специальной переменной IFS. Это означает, что строка построена. Так что есть дополнительные накладные расходы.

С другой стороны #расширяется количество позиционных параметров.

Пример:

$ command param1 param2

Вот,

Значение $#равно 2, а значением $*является строка «param1 param2» (без кавычек), если IFS не установлен. Потому что, если IFS не установлен, параметры разделяются пробелами

Для более подробной информации man bashи прочитайте тему под названием Специальные параметры


5
Или if ! (($#)); ..., или if (($# == 0)); ..., или if [ $# -eq 0 ]; ..., или ! (($#)) && ..., или(($#)) || ...
nicerobot

7
[ $# -eq 0 ]это самая распространенная форма IME. Есть крайний случай, когда "$#"может быть пустым: если есть единственный аргумент, который является пустым, или если есть несколько пустых аргументов и $IFSон пуст.
Жиль "ТАК - перестань быть злым"

1
"$*"Выражение будет также оценить, ""если только один ""был принят параметр. Но большую часть времени вам, вероятно, все равно будет все равно.
Манатворк

Я считаю, что это должно быть = вместо == ... в настоящее время я получаю неожиданную ошибку оператора, и изменение на = устраняет проблему.
ну на самом деле

@Charlotte Это означает, что вы не используете bash. Вы используете shдля выполнения сценария. AFAIK ==действует только в bash.
Сачин Дивекарь

14

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

#!/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

-4

это один из способов узнать, что у вас нет никаких аргументов

NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
    {do something}
fi

5
Это, кажется, запутанный способ сделать то, что было написано в принятом ответе 5 лет назад ....
Джефф Шаллер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.