Bash
Скрипты с параметрами
Поиск…
замечания
-
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