Поиск…


замечания

  • shift сдвигает позиционные параметры влево, так что $2 становится $1 , $3 становится $2 и так далее.
  • "$@" - это массив всех позиционных параметров, передаваемых скрипту / функции.
  • "$*" - это строка, состоящая из всех позиционных параметров, переданных скрипту / функции.

Многопараметрический анализ

Чтобы разобрать множество параметров, Предпочитаемый способ сделать это с помощью цикла WHILE, тематическое заявление, и сдвиг.

shift используется для появления первого параметра в серии, что составляет $ 2 , теперь составляет $ 1 . Это полезно для обработки аргументов по одному.

#!/bin/bash

# Load the user defined parameters
while [[ $# > 0 ]]
do
        case "$1" in

                -a|--valueA)
                        valA="$2"
                        shift
                        ;;

                -b|--valueB)
                        valB="$2"
                        shift
                        ;;

                --help|*)
                        echo "Usage:"
                        echo "    --valueA \"value\""
                        echo "    --valueB \"value\""
                        echo "    --help"
                        exit 1
                        ;;
        esac
        shift
done

echo "A: $valA"
echo "B: $valB"

Входы и выходы

$ ./multipleParams.sh --help
Usage:
    --valueA "value"
    --valueB "value"
    --help

$ ./multipleParams.sh
A: 
B:

$ ./multipleParams.sh --valueB 2
A: 
B: 2

$ ./multipleParams.sh --valueB 2 --valueA "hello world"
A: hello world
B: 2

Доступ к параметрам

При выполнении сценария Bash параметры, переданные в скрипт, называются в соответствии с их положением: $1 - это имя первого параметра, $2 - имя второго параметра и т. Д.

Отсутствующий параметр просто оценивает пустую строку. Проверка наличия параметра может быть выполнена следующим образом:

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

Получение всех параметров

$@ и $* - это способы взаимодействия со всеми параметрами скрипта. Обращаясь к странице руководства Bash , мы видим, что:

  • $* : Расширяется до позиционных параметров, начиная с одного. Когда расширение происходит в двойных кавычках, оно расширяется до одного слова со значением каждого параметра, разделенным первым символом специальной переменной IFS.
  • $@ : Расширяется до позиционных параметров, начиная с единицы. Когда расширение происходит в двойных кавычках, каждый параметр расширяется до отдельного слова.

Получение количества параметров

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

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

Пример 1

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

for item in "$@"
do  
    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

Пример 2.

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

for (( i = 1; i <= $#; ++ i ))
do
    item=${@:$i:1}

    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

Анализ аргументов с использованием цикла for

Простой пример, который предоставляет варианты:

Опт Чередующийся Опт подробности
-h --help Показать справку
-v --version Показать информацию о версии
-dr path --doc-root path Опция, которая принимает вторичный параметр (путь)
-i --install Логическая опция (true / false)
-* - Неверная опция
#!/bin/bash
dr=''
install=false

skip=false
for op in "$@";do
    if $skip;then skip=false;continue;fi
    case "$op" in
        -v|--version)
            echo "$ver_info"
            shift
            exit 0
            ;;
        -h|--help)
            echo "$help"
            shift
            exit 0
            ;;
        -dr|--doc-root)
            shift
            if [[ "$1" != "" ]]; then
                dr="${1/%\//}"
                shift
                skip=true
            else
                echo "E: Arg missing for -dr option"
                exit 1
            fi
            ;;
        -i|--install)
            install=true
            shift
            ;;
        -*)
            echo "E: Invalid option: $1"
            shift
            exit 1
            ;;
    esac
done

Сценарий обертки

Скрипт Wrapper - это сценарий, который обертывает другой скрипт или команду, чтобы обеспечить дополнительные функциональные возможности или просто сделать что-то менее утомительное.

Например, фактический egrep в новой системе GNU / Linux заменяется скриптом-оболочкой с именем egrep . Вот как это выглядит:

#!/bin/sh
exec grep -E "$@"

Итак, когда вы запускаете egrep в таких системах, вы фактически запускаете grep -E со всеми перенаправленными аргументами.

В общем случае, если вы хотите запустить пример сценария / команды exmp с другим сценарием mexmp то обертка mexmp сценарий будет выглядеть следующим образом :

#!/bin/sh
exmp "$@" # Add other options before "$@"
# or 
#full/path/to/exmp "$@"

Разделить строку на массив в Bash

Допустим, у нас есть параметр String, и мы хотим разбить его запятой

my_param="foo,bar,bash"

Чтобы разбить эту строку запятой, мы можем использовать;

IFS=',' read -r -a array <<< "$my_param"

Здесь IFS - это специальная переменная, называемая внутренним разделителем полей, которая определяет символ или символы, используемые для разделения шаблона на токены для некоторых операций.

Чтобы получить доступ к отдельному элементу:

echo "${array[0]}"

Чтобы перебрать элементы:

for element in "${array[@]}"
do
    echo "$element"
done

Чтобы получить как индекс, так и значение:

for index in "${!array[@]}"
do
    echo "$index ${array[index]}"
done


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow