This shows you the differences between two versions of the page.
declare [2017/08/04 13:52] |
declare [2022/04/16 12:22] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | |||
+ | * http://lists.gnu.org/archive/html/bug-bash/2014-05/msg00032.html | ||
+ | * http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-018 | ||
+ | |||
+ | # deb http://download.opensuse.org/repositories/home:/rzrfreefr/Debian_7.0/ / | ||
+ | sudo apt-get install bash=0.0.20140411-0~rzr20140515 | ||
+ | |||
+ | |||
+ | ===== SOURCE ===== | ||
+ | |||
+ | <code bash bash_test.sh> | ||
+ | #!/bin/bash | ||
+ | |||
+ | generate_file_to_be_sourced() | ||
+ | { | ||
+ | local file_to_be_sourced | ||
+ | file_to_be_sourced="$(mktemp)" | ||
+ | cat << "EOF" > "${file_to_be_sourced}" | ||
+ | declare -a tmp='([0]="1" [1]="2")' | ||
+ | EOF | ||
+ | echo "${file_to_be_sourced}" | ||
+ | } | ||
+ | |||
+ | foo() | ||
+ | { | ||
+ | source "${g_file_to_be_sourced}" | ||
+ | |||
+ | if declare -p tmp &> /dev/null && [ "${#tmp[@]}" = "2" ] | ||
+ | then | ||
+ | echo "test #2: OK" | ||
+ | else | ||
+ | echo "test #2: NOK" | ||
+ | fi | ||
+ | unset tmp | ||
+ | } | ||
+ | |||
+ | echo "bash version: ${BASH_VERSION}" | ||
+ | echo | ||
+ | |||
+ | declare -r g_file_to_be_sourced="$(generate_file_to_be_sourced)" | ||
+ | echo "content of file to be sourced:" | ||
+ | cat "${g_file_to_be_sourced}" | ||
+ | echo | ||
+ | |||
+ | source "${g_file_to_be_sourced}" | ||
+ | |||
+ | if declare -p tmp &> /dev/null && [ "${#tmp[@]}" = "2" ] | ||
+ | then | ||
+ | echo "test #1: OK" | ||
+ | else | ||
+ | echo "test #1: NOK" | ||
+ | fi | ||
+ | unset tmp | ||
+ | |||
+ | foo | ||
+ | |||
+ | rm "${g_file_to_be_sourced}" | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ==== OK ==== | ||
+ | |||
+ | <code> | ||
+ | bash -x /tmp/t.sh | ||
+ | + echo 'bash version: 4.2.37(1)-release' | ||
+ | bash version: 4.2.37(1)-release | ||
+ | + echo | ||
+ | |||
+ | ++ generate_file_to_be_sourced | ||
+ | ++ local file_to_be_sourced | ||
+ | +++ mktemp | ||
+ | ++ file_to_be_sourced=/tmp/tmp.LtpCQJkxug | ||
+ | ++ cat | ||
+ | ++ echo /tmp/tmp.LtpCQJkxug | ||
+ | + declare -r g_file_to_be_sourced=/tmp/tmp.LtpCQJkxug | ||
+ | + echo 'content of file to be sourced:' | ||
+ | content of file to be sourced: | ||
+ | + cat /tmp/tmp.LtpCQJkxug | ||
+ | declare -a tmp='([0]="1" [1]="2")' | ||
+ | + echo | ||
+ | |||
+ | + source /tmp/tmp.LtpCQJkxug | ||
+ | ++ declare -a 'tmp=([0]="1" [1]="2")' | ||
+ | + declare -p tmp | ||
+ | + '[' 2 = 2 ']' | ||
+ | + echo 'test #1: OK' | ||
+ | test #1: OK | ||
+ | + unset tmp | ||
+ | + foo | ||
+ | + source /tmp/tmp.LtpCQJkxug | ||
+ | ++ declare -a 'tmp=([0]="1" [1]="2")' | ||
+ | + declare -p tmp | ||
+ | + '[' 2 = 2 ']' | ||
+ | + echo 'test #2: OK' | ||
+ | test #2: OK | ||
+ | + unset tmp | ||
+ | + rm /tmp/tmp.LtpCQJkxug | ||
+ | </code> | ||
+ | |||
+ | ==== KO ==== | ||
+ | |||
+ | <code> | ||
+ | bash -x t.bash | ||
+ | + echo 'bash version: 4.3.11(1)-release' | ||
+ | bash version: 4.3.11(1)-release | ||
+ | + echo | ||
+ | |||
+ | ++ generate_file_to_be_sourced | ||
+ | ++ local file_to_be_sourced | ||
+ | +++ mktemp | ||
+ | ++ file_to_be_sourced=/tmp/tmp.IUBziKiNg4 | ||
+ | ++ cat | ||
+ | ++ echo /tmp/tmp.IUBziKiNg4 | ||
+ | + declare -r g_file_to_be_sourced=/tmp/tmp.IUBziKiNg4 | ||
+ | + echo 'content of file to be sourced:' | ||
+ | content of file to be sourced: | ||
+ | + cat /tmp/tmp.IUBziKiNg4 | ||
+ | declare -a tmp='([0]="1" [1]="2")' | ||
+ | + echo | ||
+ | |||
+ | + source /tmp/tmp.IUBziKiNg4 | ||
+ | ++ declare -a 'tmp=([0]="1" [1]="2")' | ||
+ | + declare -p tmp | ||
+ | + '[' 2 = 2 ']' | ||
+ | + echo 'test #1: OK' | ||
+ | test #1: OK | ||
+ | + unset tmp | ||
+ | + foo | ||
+ | + source /tmp/tmp.IUBziKiNg4 | ||
+ | ++ declare -a 'tmp=([0]="1" [1]="2")' | ||
+ | + declare -p tmp | ||
+ | + echo 'test #2: NOK' | ||
+ | test #2: NOK | ||
+ | + unset tmp | ||
+ | + rm /tmp/tmp.IUBziKiNg4 | ||
+ | </code> | ||
+ | |||
+ | * http://ss64.com/bash/declare.html | ||
+ | |||
+ | ==== ARRAYS ==== | ||
+ | |||
+ | |||
+ | <code bash> | ||
+ | initialize_struct_framework() | ||
+ | { | ||
+ | g_struct_container=() | ||
+ | |||
+ | generic_struct_builder() | ||
+ | { | ||
+ | local p_struct_name="$1" | ||
+ | local p_builder_name="$2" | ||
+ | declare -A "${p_struct_name}" || error_handler || return | ||
+ | eval "${p_struct_name}"'[builder]="${p_builder_name}"' || error_handler || return | ||
+ | shift 2 || error_handler || return | ||
+ | while [ "0" -lt "$#" ] | ||
+ | do | ||
+ | local p_key_name="$1" | ||
+ | local p_key_value="$2" | ||
+ | shift 2 || error_handler || return | ||
+ | eval "${p_struct_name}"'["${p_key_name}"]="${p_key_value}"' || error_handler || return | ||
+ | done | ||
+ | g_struct_container+=("$(declare -p "${p_struct_name}")") || error_handler || return | ||
+ | } | ||
+ | |||
+ | filesystem_item_struct_builder() | ||
+ | { | ||
+ | local p_struct_name="$1" | ||
+ | local name_field_key="name" | ||
+ | local p_name_field_value="$2" | ||
+ | local child_set_field_key="child_set" | ||
+ | local p_child_set_field_value="$3" | ||
+ | local type_field_key="type" | ||
+ | local p_type_field_value="$4" | ||
+ | generic_struct_builder \ | ||
+ | "${p_struct_name}" \ | ||
+ | "${FUNCNAME}" \ | ||
+ | "${name_field_key}" "${p_name_field_value}" \ | ||
+ | "${child_set_field_key}" "${p_child_set_field_value}" \ | ||
+ | "${type_field_key}" "${p_type_field_value}" || error_handler || return | ||
+ | } | ||
+ | } | ||
+ | |||
+ | add_item() | ||
+ | { | ||
+ | local p_item="$1" | ||
+ | filesystem_item_struct_builder "struct" "${p_item}" "" "" | ||
+ | local struct_index="$((${#g_struct_container[@]}-1))" | ||
+ | struct[child_set]+="${struct_index} " | ||
+ | eval "${g_struct_container[struct_index]}" | ||
+ | if [ -d "${p_item}" ] | ||
+ | then | ||
+ | struct[type]="directory" | ||
+ | cd "${p_item}" | ||
+ | local item | ||
+ | for item in * | ||
+ | do | ||
+ | add_item "${item}" | ||
+ | done | ||
+ | cd .. | ||
+ | else | ||
+ | struct[type]="file" | ||
+ | fi | ||
+ | g_struct_container[struct_index]="$(declare -p struct)" | ||
+ | } | ||
+ | |||
+ | display_rec() | ||
+ | { | ||
+ | local p_path="$1" | ||
+ | [ "${p_path}" != "" ] && p_path+="/" | ||
+ | echo "${p_path}${struct[name]}" | ||
+ | p_path+="${struct[name]}" | ||
+ | local struct_index | ||
+ | for struct_index in ${struct[child_set]} | ||
+ | do | ||
+ | eval "${g_struct_container[struct_index]}" | ||
+ | display_rec "${p_path}" | ||
+ | done | ||
+ | } | ||
+ | |||
+ | display() | ||
+ | { | ||
+ | eval "${g_struct_container}" | ||
+ | display_rec "" | ||
+ | } | ||
+ | |||
+ | initialize_struct_framework | ||
+ | add_item "." | ||
+ | display | ||
+ | declare -p g_struct_container | ||
+ | </code> | ||
+ | |||
+ | ===== MORE ===== | ||
+ | |||
+ | @TaG: BasH BuG |