В прошлом существовала OpenSolaris , версия Solaris с открытым исходным кодом от Sun Microsystems. После того, как Oracle купила Sun, они прекратили разработку OpenSolaris, поэтому энтузиасты разделили его на OpenIndiana и позже illumos . Вы можете проверить их
Однако, если вам не нужен исходный код, последняя официальная версия Solaris 11 по-прежнему бесплатна для «разработки, тестирования, прототипирования и демонстрации ваших приложений» как ] согласно лицензии . Oracle также предоставляет готовые -готовые виртуальные машины для использования
Не знаю, почему вы используете ассоциативные массивы вместо простых массивов, когда ваши ключи представляют собой последовательные десятичные числа, начинающиеся с единицы, но если я правильно понимаю, что вы хотите, вы можете:
for key in "${(nok@)arrCollection}"; do
print -r - "Assoc $key: $arrCollection[$key]"
printf ' "%s" => "%s"\n' "${(@kvP)arrCollection[$key]}"
done
Что на вашем образце должно давать что-то вроде:
Assoc 1: arrOne
"3" => "Third"
"4" => "Fourth"
"1" => "First"
"2" => "Second"
Assoc 2: arrTwo
"3" => "Red"
"4" => "Green"
"5" => "Blue"
"1" => "Purple"
"2" => "Orange"
Assoc 3: arrThree
"3" => "Planet"
"4" => "Sun"
"5" => "Moon"
"6" => "Star"
"1" => "First"
"2" => "Red"
Или также сортировать членов каждой ассоциации по числам по ключам:
for key in "${(nok@)arrCollection}"; do
print -r - "Assoc $key: $arrCollection[$key]"
for assoc_key in "${(@knoP)arrCollection[$key]}"; do
printf ' "%s" => "%s"\n' "$assoc_key" "${${(P)arrCollection[$key]}[$assoc_key]}"
done
done
Что даст:
Assoc 1: arrOne
"1" => "First"
"2" => "Second"
"3" => "Third"
"4" => "Fourth"
Assoc 2: arrTwo
"1" => "Purple"
"2" => "Orange"
"3" => "Red"
"4" => "Green"
"5" => "Blue"
Assoc 3: arrThree
"1" => "First"
"2" => "Red"
"3" => "Planet"
"4" => "Sun"
"5" => "Moon"
"6" => "Star"
Ключи выше сортируются с использованиемo
(порядка )иn
(числового)флага раскрытия параметров . При этом элементы сравниваются с использованием порядка сортировки локали, за исключением частей, состоящих из последовательностей десятичных цифр¹. Последовательность десятичных цифр интерпретируется как десятичное целое число и сравнивается численно.
Это похоже на то, что реализация GNU sort
делает с опцией -V
/ --version-sort
.
Таким образом, foo2-3
будет стоять перед foo10-3
и перед foo2-10
, например, но это нельзя использовать для чисел, отличных от целых положительных десятичных чисел.(-2
также будет стоять перед -10
и 2.3
перед2.10
).
Для сортировки с использованием других произвольных критериев, несмотря на то, что существуют запутанные способы сделать это встроенным способом в zsh,может быть проще прибегнуть к sort
, если вы можете гарантировать, что элементы не содержат символов NL или NUL и не пусты.
Например, с GNUsort
:
for key in ${(0)"$(print -rNC1 -- ${(k)arrCollection} | sort -zg)"}
Для численного перебора не -пустых ключей, но на этот раз с поддержкой всех видов числовых представлений (, включая 0x20, 1e -1, бесконечность, -20, 0x3.fp5... ).
Выше используются записи с разделителями NUL для передачи списка в sort
и разделения его вывода, поэтому предполагается, что ключи не содержат символов NUL. Чтобы вместо этого использовать символы NL/LF, удалите -N
, -z
и измените (0)
на (f)
.
¹ и NUL-символы, которые должны обрабатываться отдельно, так как стандартный API сравнения их подавляет.