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

75

Как проверить, $*пусто ли? Другими словами, как проверить, не было ли аргументов команды?

а на самом деле
источник

Ответы:

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 лет назад ....
Джефф Шаллер