shift — доступ к множеству аргументов

We use cookies. Read the Privacy and Cookie Policy

Но как быть, если программе передается большое число аргументов, как в следующем примере:

[me@linuxbox ~]$ posit-param *

Number of arguments: 82

$0 = /home/me/bin/posit-param

$1 = addresses.ldif

$2 = bin

$3 = bookmarks.html

$4 = debian-500-i386-netinst.iso

$5 = debian-500-i386-netinst.jigdo

$6 = debian-500-i386-netinst.template

$7 = debian-cd_info.tar.gz

$8 = Desktop

$9 = dirlist-bin.txt

В системе, где выполнялся этот пример, механизм подстановки развернул символ * в 82 аргумента. Как обработать такое количество? Командная оболочка предусматривает решение и для подобных случаев, правда, следует отметить, что изяществом оно не отличается. Команда shift выполняет «сдвиг» параметров к началу списка. Фактически, используя shift, можно обойтись единственной переменной-параметром (помимо $0, которая никогда не изменяется).

#!/bin/bash

# posit-param2: сценарий вывода всех аргументов

count=1

while [[ $# -gt 0 ]]; do

echo "Argument $count = $1"

count=$((count + 1))

shift

done

Каждый раз, когда выполняется команда shift, значение $2 перемещается в $1, значение $3 перемещается в $2 и т.д. Значение $# при этом уменьшается на 1.

В программе posit-param2 мы создали цикл, проверяющий число оставшихся аргументов и продолжающийся до тех пор, пока оно не уменьшится до нуля. Цикл выводит текущий аргумент, в каждой итерации увеличивает счетчик обработанных аргументов count и, наконец, выполняет shift, чтобы загрузить в $1 следующий аргумент. Вот как работает эта программа:

[me@linuxbox ~]$ posit-param2 a b c d

Argument 1 = a

Argument 2 = b

Argument 3 = c

Argument 4 = d