BASH: позиционные и специальные аргументы

Автор: | 15/06/2014
 

terminalВ 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]