Чтение онлайн

ЖАНРЫ

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

for arg in "$*" # Работает некорректно, если "$*" не ограничена кавычками.

do

echo "Аргумент #$index = $arg"

let "index+=1"

done # $* воспринимает все аргументы как одну строку.

echo "Полный список аргументов выглядит как одна строка."

echo

index=1

echo "Список

аргументов в переменной \"\$@\":"

for arg in "$@"

do

echo "Аргумент #$index = $arg"

let "index+=1"

done # $@ воспринимает аргументы как отдельные строки (слова).

echo "Список аргументов выглядит как набор различных строк (слов)."

echo

exit 0

После команды shift (сдвиг), первый аргумент, в переменной $@, теряется, а остальные сдвигаются на одну позицию "вниз" (или "влево", если хотите).

#!/bin/bash

# Вызовите сценарий в таком виде: ./scriptname 1 2 3 4 5

echo "$@" # 1 2 3 4 5

shift

echo "$@" # 2 3 4 5

shift

echo "$@" # 3 4 5

# Каждая из команд "shift" приводит к потере аргумента $1,

# но остальные аргументы остаются в "$@".

Специальная переменная $@ может быть использована для выбора типа ввода в сценария. Команда cat "$@" позволяет выполнять ввод как со стандартного устройства ввода stdin, так и из файла, имя которого передается сценарию из командной строки. См. Пример 12-17 и Пример 12-18.

Переменные $* и $@, в отдельных случаях, могут содержать противоречивую информацию! Это зависит от содержимого переменной $IFS.

Пример 9-7. Противоречия в переменных $* и $@

#!/bin/bash

# Демонстрация противоречивости содержимого внутренних переменных "$*" и "$@",

#+ которая проявляется при изменении порядка заключения параметров в кавычки.

# Демонстрация противоречивости, проявляющейся при изменении

#+ содержимого переменной IFS.

set -- "Первый один" "второй" "третий:один" "" "Пятый: :один"

# Установка аргументов $1, $2, и т.д.

echo

echo 'IFS по-умолчанию, переменная "$*"'

c=0

for i in "$*" #

в кавычках

do echo "$((c+=1)): [$i]" # Эта строка остается без изменений во всех циклах.

# Вывод аргументов.

done

echo ---

echo 'IFS по-умолчанию, переменная $*'

c=0

for i in $* # без кавычек

do echo "$((c+=1)): [$i]"

done

echo ---

echo 'IFS по-умолчанию, переменная "$@"'

c=0

for i in "$@"

do echo "$((c+=1)): [$i]"

done

echo ---

echo 'IFS по-умолчанию, переменная $@'

c=0

for i in $@

do echo "$((c+=1)): [$i]"

done

echo ---

IFS=:

echo 'IFS=":", переменная "$*"'

c=0

for i in "$*"

do echo "$((c+=1)): [$i]"

done

echo ---

echo 'IFS=":", переменная $*'

c=0

for i in $*

do echo "$((c+=1)): [$i]"

done

echo ---

var=$*

echo 'IFS=":", переменная "$var" (var=$*)'

c=0

for i in "$var"

do echo "$((c+=1)): [$i]"

done

echo ---

echo 'IFS=":", переменная $var (var=$*)'

c=0

for i in $var

do echo "$((c+=1)): [$i]"

done

echo ---

var="$*"

echo 'IFS=":", переменная $var (var="$*")'

c=0

for i in $var

do echo "$((c+=1)): [$i]"

done

echo ---

echo 'IFS=":", переменная "$var" (var="$*")'

Поделиться с друзьями: