Bash получает длину расширения косвенной переменной со списком в качестве переменной

Используйте функцию system():

.
awk '{printf("%s ",$1); system("d2h " $2)}' file
3
16.10.2020, 21:56
2 ответа

Для записи, в zsh, где эквивалентом bash's ${!b}является${(P)b}(и где ${#array[@]}также можно записать $#array, как в csh)

$ a=(1 2 3 4) b=a
$ echo ${(P)#b}
4

В bash, если вы действительно хотели использовать ${!b}косвенность, вы всегда могли:

$ a=(1 2 3 4)
$ b='b[(b=${#a[@]}),0]'
$ echo "${!b}"
4

Вы можете использовать тот же трюк, чтобы иметь переменную, которая динамически расширяется до количества элементов в $aс помощью:

$ typeset -n b='x[(x=${#a[@]}),0]'
$ echo "$b"
4
$ a+=(more)
$ echo "$b"
5

(здесь используется xвместо b, поскольку bashжалуется, если nameref ссылается на себя ).

Или вы всегда можете использоватьeval:

$ a=(1 2 3 4) b=a
$ eval 'echo "${#'"$b"'[@]}"'
4
3
18.03.2021, 22:57

С косвенными переменными нужно поступать именно так.

С помощью namerefs (bash 4.3+ )вы можете сделать

a=(1 2 3 4)
declare -n b=a
echo "${#b[@]}"
3
18.03.2021, 22:57

Теги

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