Do You Know That? Как раскрывается "${array[@]}" и "${array[*]}"

BASH
Оказывается, в зависимости от режима интерполяции, внутри двойных кавычек массивы раскрываются принципиально по разному:

  • В случае с "${array[*]}" — массив интерполируется в один аргумент (одну строку), представляющий собой результат простой конкатенации всех элементов массива через пробел
  • В случае "${array[@]}" — каждый элемент массива становится отдельным аргументом так, словно каждый элемент взял себе внешние двойные кавычки, что уберегло его от дробления по пробельному символу (точнее, по IFS)

Тестовый пример:


#!/bin/bash
declare -a array=('red green blue' 'artos portos aramis' 'make love not war')
echo '== source array declaration: =='
declare -p array
echo

D='/tmp/array_test'
rm -rf $D; mkdir -p $D
pushd "$(pwd)" &>/dev/null; cd $D

echo '== touch elements/ls (@) =='
touch "${array[@]}"
ls -1
echo

echo '== touch elements/ls (*) =='
rm -f *
touch "${array[*]}"
ls -1
echo

rm -rf $D
popd &>/dev/null

echo '== printf array elements (@) =='
printf '<%s>\n' "${array[@]}"
echo

echo '== printf array elements (*) =='
printf '<%s>\n' "${array[*]}"
echo

echo '== for-loop on array elements (@) =='
declare -i i=0
for el in "${array[@]}"; do
 echo "$((i++))) $el"
done
echo

echo '== for-loop on array elements (*) =='
i=0
for el in "${array[*]}"; do
 echo "$((i++))) $el"
done
echo


Вывод тестового скрипта:

== source array declaration: ==
declare -a array='([0]="red green blue" [1]="artos portos aramis" [2]="make love not war")'

== touch elements/ls (@) ==
artos portos aramis
make love not war
red green blue

== touch elements/ls (*) ==
red green blue artos portos aramis make love not war

== printf array elements (@) ==
<red green blue>
<artos portos aramis>
<make love not war>

== printf array elements (*) ==
<red green blue artos portos aramis make love not war>

== for-loop on array elements (@) ==
0) red green blue
1) artos portos aramis
2) make love not war

== for-loop on array elements (*) ==
0) red green blue artos portos aramis make love not war


Огромное спасибо d_a с linux.org.ru, который раскрыл мне глаза здесь.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.