Як перевірити, чи не вказані параметри для команди?


Відповіді:


110

Щоб перевірити, чи не було аргументів, наданих команді, перевірте значення $#змінної,

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.