Другой порядок при использовании скалярного или массивного присваивания в результате расширения параметра с флагом Oa - PullRequest
4 голосов
/ 31 октября 2019

В zsh, если я сделаю следующее

x=(1 2 3)
y=${(Oa)x}
z=(${(Oa)x})

, то echo $y выведет 1 2 3, но echo $z выведет 3 2 1.

Очевидно, y - скаляри z является массивом, но почему скалярное присвоение y не приводит к присвоению ему «3 2 1»?

1 Ответ

2 голосов
/ 01 ноября 2019

Кажется, что из-за правил замещения '10. Force Joining 'имеет приоритет над '19. Порядок '.

Вот документация zsh:

Правила
Ниже приводится свод правил замены. ..
...
10. Принудительное объединение
Если присутствует флаг (j) или отсутствует флаг (j), но строка должна быть разделена, как указанопо правилу 11. и объединение не произошло в правиле 5. любые слова в значении объединяются с использованием заданной строки или первого символа $ IFS, если его нет. Обратите внимание, что флаг (F) неявно предоставляет строку для объединения таким способом.
...
19. Упорядочивание
Если результат все еще является массивом и одним из (o) или (O) флагов присутствовал, массив переупорядочен.

--- zshparam(1), правила, параметры zsh


y=${(Oa)x} против z=(${(Oa)x})

Первая форма - это скалярное присвоение, а последняя - для присвоения значения массива.

Описание
...
Значение скалярного параметра также может быть задано записью:
name=value

--- zshparam(1), описание, параметры zsh

...

Чтобы присвоить значение массива, введите одно из:
set -A name value ...
name=(value ...)
name=([key]=value ...)

--- zshparam(1), параметры массива, параметры zsh

Итак, первая форма выдает скалярное значение, а второе значение массива:
(echo значение с флагом расширения параметра (q) в подробном видеform.)

x=(1 2 3)
y=${(Oa)x}
echo ${(qqq)y}  ;# look the `y` value in a verbose form with `(qqq)` 
#=> "1 2 3"     ;# forced joining and resulted scalar value
z=(${(Oa)x})
echo ${(qqq)z}
#=> "3" "2" "1" ;# resulted array value

В скалярном присваивании значение раскрывается как одна строка, в которой элементы массивов объединяются

--- zshparam(1), параметры массива, параметры zsh

Это вписывается в правило 10. Если форма не в двойных кавычках.

...