Комментарии 5
Ещё один человек не знает, что переменные в bash нужно окружать кавычками. Сравните
a=( a "" b )
for e in ${a[@]} ; do
echo \"$e\"
done
с
a=( a "" b )
for e in "${a[@]}" ; do
echo \"$e\"
done
. Ну и кроме того, в bash в массиве можно хранить только строки. И вообще это единственный скалярный тип: сравните вывод
i=11-1
declare -i i
declare -p i
у bash и zsh (или ksh, кстати). В bash нет никаких скалярных типов, кроме строки, а declare не приводит к исполнению арифметических выражений уже имеющихся в переменной, поэтому это выведет declare -i i="11-1"
— если бы переменная была бы типизирована, то такое было бы в принципе невозможно (впрочем, они могли бы притворится, что типизированные переменные у них есть, а реально всё равно хранить строки). В zsh же есть типы и строку поместить в целочисленную переменную не получится, поэтому declare не может не сконвертировать i
в число, поэтому код выведет typeset -i i=10
. (В ksh — declare -i i=10
.)
#!/bin/bash
function print_animals() {
local local_animals
eval "declare -A local_animals="${1#*=}
for sound in "${!local_animals[@]}" ; do
echo "$sound - ${local_animals[$sound]}"
done
}
declare -A animals
animals["moo"]="cow"
animals["woof"]="dog"
print_animals "$(declare -p animals)"
кмк, если у вас появились хэши и массивы в баше, то пара переходить на python/ruby
Как-то сложно Вы пишете. Я ничего не понял. Не смотря на свои знания.
У вас же ничего этого не нужно, и пример на Python вполне может выглядеть как:
import os
all_threads = [1, 2, 4, 8, 16, 32, 64, 128]
all_runtimes = [os.popen('./pipeline --threads %s' % t).read() for t in all_threads]
Работа с массивами в bash