Другое

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

Узнайте, как проверять количество аргументов в скриптах Bash с правильным синтаксисом. Исправьте распространенные ошибки, такие как 'command not found', и реализуйте надежную проверку аргументов с помощью нашего полного руководства.

Как проверить количество аргументов, переданных в Bash-скрипт, и проверить их количество?

Я хочу, чтобы мой Bash-скрипт выводил сообщение об ошибке, если требуемое количество аргументов не соблюдается.

Я попробовал следующий код:

bash
#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

По какой-то неизвестной причине я получил следующую ошибку:

test: line 4: [2: command not found

Что я делаю неправильно с проверкой количества аргументов в Bash?


Понимание проблемы

Сообщение об ошибке test: line 4: [2: command not found указывает на то, что bash пытается интерпретировать [2 как команду, а не как тестовое выражение. Это происходит потому, что ваш синтаксис if [$# -ne 1]; не содержит необходимых пробелов.

Согласно Unix & Linux Stack Exchange, “После открывающей скобки и перед закрывающей должен стоять символ пробела”. Оболочка bash разбирает [ как команду test, и без правильного расположения пробелов она неправильно интерпретирует выражение.

Ваша проблемная строка:

bash
if [$# -ne 1];  # ❌ Отсутствуют пробелы

Должна быть:

bash
if [ $# -ne 1 ];  # ✅ Правильное расположение пробелов

Правильный синтаксис для проверки количества аргументов

Специальная переменная $# содержит количество аргументов, переданных вашему bash-скрипту, не включая имя самого скрипта. Вот правильные способы проверки количества аргументов:

Базовое сравнение

bash
#!/bin/bash
echo "Имя скрипта: $0"
echo "Количество аргументов: $#"

# Правильный синтаксис с необходимыми пробелами
if [ $# -ne 1 ]; then
    echo "недопустимое количество параметров"
    exit 1
fi

echo "Предоставлено правильное количество аргументов"

Распространенные операторы сравнения

  • -eq : равно
  • -ne : не равно
  • -lt : меньше чем
  • -le : меньше или равно
  • -gt : больше чем
  • -ge : больше или равно

Сообщения об использовании с расширением параметров

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

bash
#!/bin/bash
if [ $# -ne 1 ]; then
    echo "Использование: $0 <аргумент>"
    exit 1
fi

echo "Предоставленный аргумент: $1"

Распространенные ошибки и решения

1. Отсутствие пробелов в тестовых выражениях

❌ Неправильно:

bash
if [$# -ne 1];  # Отсутствуют пробелы

✅ Правильно:

bash
if [ $# -ne 1 ];  # Правильное расположение пробелов

2. Отсутствие двойных кавычек вокруг переменных

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

❌ Неправильно:

bash
if [$# -ne 1];  # Нет кавычек вокруг $#

✅ Правильно:

bash
if [ "$#" -ne 1 ];  # Кавычки вокруг переменных

3. Смешивание типов скобок

❌ Неправильно:

bash
if [$# -ne 1];  # Одинарные скобки

✅ Лучше:

bash
if [ "$#" -ne 1 ];  # Одинарные скобки с правильным расположением пробелов

✅ Альтернатива:

bash
if [[ $# -ne 1 ]];  # Двойные скобки (больше возможностей)

4. Обработка пустых аргументов

Согласно Baeldung on Linux, всегда следует учитывать граничные случаи:

bash
#!/bin/bash
if [ $# -lt 1 ]; then
    echo "Аргументы не предоставлены"
    exit 1
fi

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

1. Всегда завершайте работу с кодом ошибки

bash
#!/bin/bash
if [ $# -ne 1 ]; then
    echo "Использование: $0 <аргумент>" >&2
    exit 1
fi

2. Проверяйте типы аргументов

bash
#!/bin/bash
if [ $# -ne 1 ]; then
    echo "Использование: $0 <число>" >&2
    exit 1
fi

# Проверяем, что это число
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
    echo "Ошибка: Аргумент должен быть числом" >&2
    exit 1
fi

3. Используйте Getopts для сложных скриптов

Для скриптов с несколькими опциями используйте getopts:

bash
#!/bin/bash

while getopts ":h" opt; do
    case ${opt} in
        h )
            echo "Использование: $0 [-h]"
            exit 0
            ;;
        \? )
            echo "Недопустимая опция: -$OPTARG" 1>&2
            exit 1
            ;;
    esac
done

# Проверяем оставшиеся аргументы
if [ $# -ne 1 ]; then
    echo "Использование: $0 <аргумент>" >&2
    exit 1
fi

Полные рабочие примеры

Пример 1: Простая проверка аргументов

bash
#!/bin/bash
echo "Имя скрипта: $0"
echo "Предоставленные аргументы: $#"

# Проверяем ровно один аргумент
if [ "$#" -ne 1 ]; then
    echo "Ошибка: Требуется ровно один аргумент" >&2
    echo "Использование: $0 <аргумент>" >&2
    exit 1
fi

echo "Обработка аргумента: $1"

Пример 2: Проверка диапазона

bash
#!/bin/bash
echo "Имя скрипта: $0"
echo "Предоставленные аргументы: $#"

# Проверяем от 1 до 3 аргументов
if [ "$#" -lt 1 ] || [ "$#" -gt 3 ]; then
    echo "Ошибка: Недопустимое количество аргументов" >&2
    echo "Использование: $0 [арг1] [арг2] [арг3]" >&2
    exit 1
fi

echo "Аргументы: $@"

Пример 3: Расширенная проверка

bash
#!/bin/bash

# Функция для отображения справки
usage() {
    echo "Использование: $0 <опции>" >&2
    echo "  -f <файл>    Указать входной файл" >&2
    echo "  -v           Включить подробный режим" >&2
    echo "  -h           Показать эту справку" >&2
    exit 1
}

# Обработка опций
file=""
verbose=false

while getopts ":f:vh" opt; do
    case ${opt} in
        f )
            file=$OPTARG
            ;;
        v )
            verbose=true
            ;;
        h )
            usage
            ;;
        \? )
            echo "Недопустимая опция: -$OPTARG" 1>&2
            usage
            ;;
        : )
            echo "Ошибка: -$OPTARG требует аргумент" 1>&2
            usage
            ;;
    esac
done
shift $((OPTIND -1))

# Проверка обязательных аргументов
if [ -z "$file" ]; then
    echo "Ошибка: опция -f обязательна" >&2
    usage
fi

echo "Файл: $file"
echo "Подробный режим: $verbose"

Заключение

  1. Всегда используйте правильное расположение пробелов в тестовых выражениях bash: if [ $# -ne 1 ]; а не if [$# -ne 1];
  2. Заключайте переменные в кавычки для обработки граничных случаев: [ "$#" -ne 1 ]
  3. Используйте информативные сообщения об ошибках и завершайте работу с ненулевыми кодами выхода
  4. Рассмотрите возможность использования getopts для скриптов с несколькими опциями
  5. Проверяйте типы аргументов и диапазоны, где это уместно

Главный вывод заключается в том, что синтаксис bash очень чувствителен к пробелам, особенно в тестовых выражениях. Всегда убедитесь, что вокруг открывающих и закрывающих скобок есть пробелы, а также между элементами ваших тестовых условий.

Источники

  1. Check number of arguments passed to a Bash script - Stack Overflow
  2. How to Check the Number of Arguments in Shell Scripting - LabEx
  3. Bash script -ne comparison giving “command not found” error - Unix & Linux Stack Exchange
  4. How To Script Error Free Bash If Statement? - Shell Tips
  5. How to Check the Existence of Input Argument in a Bash Script - Baeldung on Linux
Авторы
Проверено модерацией
Модерация