Если Вы не объявляете переменную как ассоциативный массив, то
klang=([string_0]='element_0' [string_1]='element_1' [string_2]='element_2')
взят в качестве нормального присваивания массива (хотя примечание это в bash
и ksh93
, нормальные массивы не являются действительно нормальными массивами, они - более разреженные массивы или ассоциативные массивы с ключами, ограниченными положительными целыми числами).
В bash
, для нормального массива ключи оценены как арифметические выражения. Как арифметическое выражение, string_0
оценивает к содержанию $string_0
, и если это пусто, к 0
. Таким образом, вышеупомянутое, вероятно, совпадет с:
klang=([0]='element_0' [0]='element_1' [0]='element_2')
Так, это совпадает с определением ${klang[0]}
(который совпадает с $klang
) 3 раза.
Это контрастирует с ksh93
массивы (который bash
главным образом скопированный), где a=([x]=y)
синтаксис только поддерживается для ассоциативных массивов и автоматически создал бы ассоциативный массив при использовании.
zsh
ассоциативные массивы (которые предшествуют bash
к десятилетиям), отличаются снова. zsh
нормальные массивы являются нормальными массивами, zsh
не поддерживает поддельное a=([x]=y)
синтаксис. В zsh
, необходимо объявить ассоциативные массивы прежде, чем определить их, и они определяются как:
normal_array=(val1 val2 val3)
typset -A associative_array
associative_array=(key1 val1 key2 val2)
associative_array+=(key3 val3...)
И $associative_array
расходует к непустым значениям как для нормальных массивов (в неопределенном порядке), и "$associative_array[@]}"
ко всем значениям как для нормальных массивов. ${(k)associative_array}
для непустых ключей, "${(k@)associative_arrays}"
для всех ключей, "${(kv@)associative_array}"
для ключей и значений, таким образом, можно распечатать содержание ассоциативного массива с:
printf '%s => %s\n' "${(@kv)associative_array}"
Это также означает, что копирование ассоциативного массива является намного менее громоздким, чем с ksh93
/bash
:
typeset -A B
B=("${(kv@)A}")
в противоположность:
unset B
typeset -A B
for k in "${!A[@]}"; do B[$k]=${A[$k]}; done
Одним из способов переименовать файлы, которые имеют три цифры на четыре цифры, дополнены нулем. Если у вас есть PERL-RENAME
(установлено по умолчанию на Ubuntu), вы можете попробовать:
rename -n 's/-(\d{3}\.)/-0$1/' *.pbm
Как только вы удовлетворены результатом, запустите снова без -N
.
Или см. Другие варианты в прокладывают число в именем файле до фиксированной длины .
GNU sort
и xargs
могут сделать трюк
printf '%s\0' ullman*.pbm | sort -z -k2,2n -t'-' | xargs -0 convert
Сначала проверьте эту работу, перечислив файлы без вызова convert
printf '%s\0' ullman*.pbm | sort -z -k2,2n -t'-' | xargs -0 printf '%s\n'
ullman-000.pbm
ullman-001.pbm
ullman-098.pbm
ullman-099.pbm
ullman-100.pbm
ullman-1000.pbm
...
Whileas
printf '%s\0' ullman*.pbm | xargs -0 printf '%s\n'
ullman-000.pbm
ullman-001.pbm
ullman-098.pbm
ullman-099.pbm
ullman-1000.pbm
..
..