В BASH shell имеется три типа аргументов — позиционные, специальные и переменные.
Тут мы рассмотрим первые два.
Содержание
Позиционные параметры
Позиционные аргументы — это аргументы командой строки (или функции в скрипте), доступ к которые осуществляется по номеру.
Рассмотрим такой пример:
#!/usr/bin/env bash echo $1 $2 $3
И пример его выполнения:
[simterm]
$ ./param1 one two three one two three
[/simterm]
Немного усложним его:
#!/usr/bin/env bash printf "This is %s, this one is %s, and last one is %s argument.n" $1 $2 $3
[simterm]
$ ./param1 first second third This is first, this one is second, and last one is third argument.
[/simterm]
Или вариант с функцией:
#!/usr/bin/env bash params () { printf "This is %s, and %s.n" "$1" "$2" } params one two
И его вызов:
[simterm]
$ ./param2 This is one, and two.
[/simterm]
Если параметров много, и после 9-го указать $10
— интерпретатор обработает его как $1
:
#!/usr/bin/env bash printf "This is %s, this one is %s, and last one is %s argument.n" $10 $2 $3
[simterm]
$ ./param1 first second third This is first0, this one is second, and last one is third argument.
[/simterm]
В таком случае — их можно заключить в фигурные скобки:
#!/usr/bin/env bash list="$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11}" for i in $list; do echo "This is number $i;" done
И выполнение:
[simterm]
$ ./param1 1 2 3 4 5 6 7 8 9 10 11 This is number 1; This is number 2; This is number 3; This is number 4; This is number 5; This is number 6; This is number 7; This is number 8; This is number 9; This is number 10; This is number 11;
[/simterm]
Тут для упрощения кода мы использовали цикл — BASH: описание циклов for, while, until и примеры использования.
Специальные аргументы
$*
— все аргументы;$@
— все аргументы;$#
— количество аргументов;$0
— имя скрипта;$$
— PID процесса;$!
— PID последнего процесса в background-е;$?
— результат выполнения выражения или скрипта (0 — если удачно, 1 — если ошибка);$_
— последний аргумент.
Продемонстрируем их все в одном скрипте:
#!/usr/bin/env bash list="$@" echo "$*", "$@", "$0", "$$", "$!", "$?", "$_" for i in $list; do echo "This is number $i;" done
И его выполнение:
[simterm]
$ ./param1 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 8 9 10 11, 1 2 3 4 5 6 7 8 9 10 11, ./param1, 14007, , 0, This is number 1; This is number 2; This is number 3; This is number 4; This is number 5; This is number 6; This is number 7; This is number 8; This is number 9; This is number 10; This is number 11;
[/simterm]