Переменные оболочки в цикле for

Я столкнулся с той же проблемой сегодня после обновления до 5.0.14 (я на Ubuntu 15.10, использую официальный Virtualbox apt repo)

Я исправил это с помощью:

sudo /usr/lib/virtualbox/vboxdrv.sh setup
6
14.03.2017, 01:34
1 ответ

Переменная nameref для "обычной" переменной то же самое, что символическая ссылка для обычного файла.

$ typeset -n ref=actual; ref=foo; echo "$actual"
foo

Цикл for выполняет тело цикла с переменной цикла ("управляющей переменной"), связанной по очереди с каждым словом в списке.

$ for x in one two three; do echo "$x"; done
one
two
three

Это эквивалентно записи последовательных присваиваний:

x=one; echo "$x"
x=two; echo "$x"
x=three; echo "$x"

Если переменная цикла - имярек, то тело выполняется с имяреком, нацеленным на каждый элемент списка слов по очереди. Это не эквивалентно серии присваиваний, как выше: присваивание ref=value, где ref - имярек, повлияет на переменную, на которую указывает ref, но цикл for изменяет то, на что указывает имярек, а не следует за ссылкой, чтобы изменить переменную, на которую она указывает.

$ original=0; one=1; two=2; three=3
$ typeset -n ref=original
$ echo $ref
0
$ for ref in one two three; do echo "$ref"; done
1
2
3
$ echo original
0

Перенаправление может наблюдаться и при присваивании, если вы присваиваете переменную цикла (что нечасто, но допускается).

$ one=1; two=2; three=3
$ typeset -n ref
$ for ref in one two three; do echo ref=$((ref+10)); done
$ echo "$one $two $three"
11 12 13

Последнее предложение объясняет, что целью ссылки на имя может быть массив. Сам nameref не является массивом, это все еще скалярная переменная, но когда он используется в присваивании или в разыменовании, он действует как тот же тип, что и переменная, на которую он указывает.

$ a=(0 1 2)
$ typeset -n ref=a
$ ref[1]=changed
$ echo "${a[@]}"
0 changed 2
7
27.01.2020, 20:28

Теги

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