Я рекомендую использовать такой формат:
foo() {
# Limit scope of variables
local 'opt1' 'opt2' 'opt3' 'operands'
# Default values
opt1='default1'
opt2='default2'
opt3='false'
operands=()
# Arguments handling
while (( ${#} > 0 )); do
case "${1}" in
( '--opt1='* ) opt1="${1#*=}" ;; # Handles --opt1
( '--opt2='* ) opt2="${1#*=}" ;; # Handles --opt2
( '--opt3='* ) opt3="${1#*=}" ;; # Handles --opt3
( '--' ) operands+=( "${@:2}" ); break ;; # End of options
( '-'?* ) ;; # Discard non-valid options
( * ) operands+=( "${1}" ) # Handles operands
esac
shift
done
...
}
Таким образом, функция будет более надежной и читабельной:
$ foo
Options:
opt1: [default1]
opt2: [default2]
opt3: [false]
$ foo --opt1='value1' --opt2='value2' --opt3='true' 'foo' 'bar' 'baz'
Options:
opt1: [value1]
opt2: [value2]
opt3: [true]
Operands:
1: [foo]
2: [bar]
3: [baz]
Плюсы:
Минусы:
Технически ARMv8 состоит из 64-битной -архитектуры, называемой Aarch64, и 32-битной -архитектуры, называемой Aarch32. Некоторые чипы ARMv8 имеют только 32-битную архитектуру -. Но на практике «ARMv8» обычно используется для обозначения Aarch64. Aarch32 обратно совместим с ARMv7 и добавляет к нему очень мало расширений. Так что я полагаю, что нет особой потребности в оптимизированных для ARMv8 32 -битных двоичных файлах.
Единственная функция Aarch32, отсутствующая в ARMv7, которую я могу назвать без исследований, — это криптографическое ускорение (для AES, SHA -1, SHA -2 и GCM ), но это наблюдение. предвзятость с моей стороны, и, насколько я помню, есть несколько других незначительных расширений (, может быть, какие-то новые SIMD-инструкции? ). Кроме того, в Aarch32 всегда присутствуют некоторые дополнительные функции ARMv7, такие как регистры с плавающей запятой -/ SIMD.
На практике armhf
двоичные файлы (для ARMv7 с плавающей запятой и SIMD )хорошо работают для Aarch32.
Если вы хотите анализировать существующие двоичные файлы, вам потребуются инструменты, поддерживающие любые функции, используемые этими двоичными файлами. На практике, большинство из 32 -бинарных файлов, которые вы найдете, используют только инструкции из набора, предназначенного для armhf.
Между прочим, существует еще одно широко распространенное использование неточной терминологии, которая не имеет значения, если вы рассматриваете дистрибутивы Unix, но может появиться при просмотре названий архитектур в таких инструментах, как флаги компилятора. Полные названия ARMv7 и ARMv8 — «ARMv7 -A» и «ARMv8 -A». Суффикс «-A» указывает на «высокие -конечные» процессоры с MMU. В контексте Unix это единственные релевантные процессоры Arm, поскольку остальные не имеют MMU.Но есть два других класса архитектур Arm, которые не имеют MMU (, но могут иметь MPU ):R (, микроконтроллер реального времени -)и M (). У них разные характеристики; например, ARMv8 -M — это всего лишь 32-разрядная -битная архитектура.