В языках программирования функции могут возвращать "сложные" объекты. Массивы, хэши-словари. Есть что-то похожее для Shell (Bash, или иное)?Я пробежался поиском - не увидел как сделать так, что код можно быстро будет понять через полчаса после написания. :)
Я так понимаю, что правильный ответ - Perl, с выключенными "предохранителями". Там можно всё нужное, да. Именно. Но вопрос таки про Bash или иной распространённый Shell.
Может быть есть какой-то известный, распространённый стиль/стратегия, которые позволяют обойтись?
Есть вот такой код (Bash 4):
#!/bin/bashset -x
set -e
declare -r fileTmpA="/tmp/$( basename "${0}" )_A"
declare -r fileTmpB="/tmp/$( basename "${0}" )_B"
trap "rm '${fileTmpA}' '${fileTmpB}'" EXIT HUP INT TERM
################################################
declare -A dictionary_A
declare -A dictionary_B
echo -ne "0000\n1111\n" > "${fileTmpA}"
echo -ne "2222\n3333\n" > "${fileTmpB}"
while read value ; do
key="$( echo "${value}" | md5sum | cut --delim=' ' --field 1 )"
dictionary_A["${key}"]="${value}"
done <<< "$( cat "${fileTmpA}" )"
while read value ; do
key="$( echo "${value}" | md5sum | cut --delim=' ' --field 1 )"
dictionary_B["${key}"]="${value}"
done <<< "$( cat "${fileTmpB}" )"
################################################
set +x
echo "________________________________________________"
for key in "${!dictionary_A[@]}" "${!dictionary_B[@]}" ; do
echo "Have key: ${key}"
done
А теперь фейковый вариант.
Bash так не умеет,
но это пример того,
какой примерно инструмент хотелось бы.
Хочется использовать какой-то код типа такого:
#!/bin/bashset -x
set -e
declare -r fileTmpA="/tmp/$( basename "${0}" )_A"
declare -r fileTmpB="/tmp/$( basename "${0}" )_B"
trap "rm '${fileTmpA}' '${fileTmpB}'" EXIT HUP INT TERM
################################################
function fillDictFromFile {
local -r fileName
local -A dictionary
while read string ; do
key="$( echo "${string}" | md5sum | cut --delim=' ' --field 1 )"
dictionary["${key}"]="${value}"
done <<< "$( cat "${fileName}" )"
return dictionary
}
echo -ne "0000\n1111\n" > "${fileTmpA}"
echo -ne "2222\n3333\n" > "${fileTmpB}"
declare -A dictionary_A="$( fillDictFromFile "${fileTmpA}" )"
declare -A dictionary_B="$( fillDictFromFile "${fileTmpB}" )"
################################################
set +x
echo "________________________________________________"
for key in "${!dictionary_A[@]}" "${!dictionary_B[@]}" ; do
echo "Have key: ${key}"
done
Как делают? Perl, C и т.д. :) :) - да, я знаю их и др. А вот есть ли что-то для Shell?