Найти количество элементов в массиве, на которые ссылается динамически созданное имя

Предполагая GNU date (1) :

mv sample.xml A"$(date +%Y%m%d.%H%M)_$(date -d 'now +3 minutes' +%H%M)"
2
02.06.2017, 01:39
2 ответа

В bash-4.3 или выше вы можете использовать namerefs:

a0=(a b c)
i=0
typeset -n Name="a$i"
echo "${#Name[@]}"

или всегда использовать eval . В любом случае, не думайте, что использование bash namerefs безопаснее, чем eval. Как и для eval, вам все равно нужно убедиться, что содержимое $Name является допустимым именем переменной оболочки. Такие значения, как x[`evil-command>&2`0], по-прежнему будут вызывать выполнение evil-command при расширении $Name или . ${#Имя}. То же самое относится к ${!var}.

С помощью ksh93 вместо этого вы можете использовать многомерные массивы:

a[0]=(a b c)
i=0
echo "${#a[i][@]}"

zsh имеет более последовательные способы объединения своих операторов расширения:

a0=(a b c)
i=0
name=a$i
echo ${(P)#name}

(P для расширение косвенного параметра).

4
27.01.2020, 21:53

Вы можете использовать eval явно, но не злоупотребляйте этим:

eval "len=\${#$Name[@]}"
2
27.01.2020, 21:53

Теги

Похожие вопросы