質問: bash eval配列変数名 これが私のbashケースです:最初のケースでは、これがvarでmyvaraを「エイリアス化」したいものです。myvara="variablea" varname="a" eval varalias=\$"myvar"$varname echo $varalias 配列変数とそのメンバーのループの2番目のケースは簡単です。myvara=( "variablea1" "variablea2" ) for varitem in ${myvara[@]} do echo $varitem done どういうわけか私は例1のような「エイリアス」手法を使用する必要がありますが、今回は配列変数に使用します。eval varalias=\$"myvar"$varname for varitem in ${varalias[@]} do echo $varitem done しかし、最後のケースでは、myvaraの最初のメンバー、つまりevalが変数の値に評価されるだけが出力されます。evalが配列変数の名前に評価されるようにするには変数の値。
回答: これは、動的に名前が付けられた変数を作成する方法です(bashバージョン<4.3)。# dynamically named array my_variable_name="dyn_arr_names" eval $my_variable_name=\(\) # adding by index to the array eg. dyn_arr_names[0]="bob" eval $my_variable_name[0]="bob" # adding by pushing onto the array eg. dyn_arr_names+=(robert) eval $my_variable_name+=\(robert\) # print value stored at index indirect echo ${!my_variable_name[0]} # print value stored at index eval echo \${$my_variable_name[0]} # get item count eval echo \${#$my_variable_name[@]} 以下は、動的に名前が付けられた配列を管理するために使用できる関数のグループです(bashバージョン<4.3)。# dynamically create an array by name function arr() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable" 1>&2 ; return 1 ; } # the following line can be replaced with 'declare -ag $1=\(\)' # note: for some reason when using 'declare -ag $1' without the parentheses will make 'declare -p' fail eval $1=\(\) } # insert incrementing by incrementing index eg. array+=(data) function arr_insert() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable" 1>&2 ; return 1 ; } declare -p "$1" > /dev/null 2>&1 [[ $? -eq 1 ]] && { echo "bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } eval $1[\$\(\(\${#${1}[@]}\)\)]=\$2 } # update an index by position function arr_set() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable" 1>&2 ; return 1 ; } declare -p "$1" > /dev/null 2>&1 [[ $? -eq 1 ]] && { echo "bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } eval ${1}[${2}]=\${3} } # get the array content ${array[@]} function arr_get() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable" 1>&2 ; return 1 ; } declare -p "$1" > /dev/null 2>&1 [[ $? -eq 1 ]] && { echo "bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } eval echo \${${1}[@]} } # get the value stored at a specific index eg. ${array[0]} function arr_at() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable" 1>&2 ; return 1 ; } declare -p "$1" > /dev/null 2>&1 [[ $? -eq 1 ]] && { echo "bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } [[ ! "$2" =~ ^(0|[-]?[1-9]+[0-9]*)$ ]] && { echo "array index must be a number" 1>&2 ; return 1 ; } local v=$1 local i=$2 local max=$(eval echo \${\#${1}[@]}) # array has items and index is in range if [[ $max -gt 0 && $i -ge 0 && $i -lt $max ]] then eval echo \${$v[$i]} fi } # get the value stored at a specific index eg. ${array[0]} function arr_count() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable " 1>&2 ; return 1 ; } declare -p "$1" > /dev/null 2>&1 [[ $? -eq 1 ]] && { echo "bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } local v=${1} eval echo \${\#${1}[@]} } array_names=(bob jane dick) for name in "${array_names[@]}" do arr dyn_$name done echo "arrays created" declare -a | grep "a dyn_" # insert three items per array for name in "${array_names[@]}" do echo "inserting dyn_$name abc" arr_insert dyn_$name "abc" echo "inserting dyn_$name def" arr_insert dyn_$name "def" echo "inserting dyn_$name ghi" arr_insert dyn_$name "ghi" done for name in "${array_names[@]}" do echo "setting dyn_$name[0]=first" arr_set dyn_$name 0 "first" echo "setting dyn_$name[2]=third" arr_set dyn_$name 2 "third" done declare -a | grep "a dyn_" for name in "${array_names[@]}" do arr_get dyn_$name done for name in "${array_names[@]}" do echo "dumping dyn_$name by index" # print by index for (( i=0 ; i < $(arr_count dyn_$name) ; i++ )) do echo "dyn_$name[$i]: $(arr_at dyn_$name $i)" done done for name in "${array_names[@]}" do echo "dumping dyn_$name" for n in $(arr_get dyn_$name) do echo $n done done 以下は、動的に名前が付けられた配列を管理するために使用できる関数のグループです(bashバージョン> = 4.3)。# dynamically create an array by name function arr() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable" 1>&2 ; return 1 ; } declare -g -a $1=\(\) } # insert incrementing by incrementing index eg. array+=(data) function arr_insert() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable" 1>&2 ; return 1 ; } declare -p "$1" > /dev/null 2>&1 [[ $? -eq 1 ]] && { echo "bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } declare -n r=$1 r[${#r[@]}]=$2 } # update an index by position function arr_set() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable" 1>&2 ; return 1 ; } declare -p "$1" > /dev/null 2>&1 [[ $? -eq 1 ]] && { echo "bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } declare -n r=$1 r[$2]=$3 } # get the array content ${array[@]} function arr_get() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable" 1>&2 ; return 1 ; } declare -p "$1" > /dev/null 2>&1 [[ $? -eq 1 ]] && { echo "bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } declare -n r=$1 echo ${r[@]} } # get the value stored at a specific index eg. ${array[0]} function arr_at() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable" 1>&2 ; return 1 ; } declare -p "$1" > /dev/null 2>&1 [[ $? -eq 1 ]] && { echo "bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } [[ ! "$2" =~ ^(0|[-]?[1-9]+[0-9]*)$ ]] && { echo "array index must be a number" 1>&2 ; return 1 ; } declare -n r=$1 local max=${#r[@]} # array has items and index is in range if [[ $max -gt 0 && $i -ge 0 && $i -lt $max ]] then echo ${r[$2]} fi } # get the value stored at a specific index eg. ${array[0]} function arr_count() { [[ ! "$1" =~ ^[a-za-z_]+[a-za-z0-9_]*$ ]] && { echo "invalid bash variable " 1>&2 ; return 1 ; } declare -p "$1" > /dev/null 2>&1 [[ $? -eq 1 ]] && { echo "bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } declare -n r=$1 echo ${#r[@]} } array_names=(bob jane dick) for name in "${array_names[@]}" do arr dyn_$name done echo "arrays created" declare -a | grep "a dyn_" # insert three items per array for name in "${array_names[@]}" do echo "inserting dyn_$name abc" arr_insert dyn_$name "abc" echo "inserting dyn_$name def" arr_insert dyn_$name "def" echo "inserting dyn_$name ghi" arr_insert dyn_$name "ghi" done for name in "${array_names[@]}" do echo "setting dyn_$name[0]=first" arr_set dyn_$name 0 "first" echo "setting dyn_$name[2]=third" arr_set dyn_$name 2 "third" done declare -a | grep 'a dyn_' for name in "${array_names[@]}" do arr_get dyn_$name done for name in "${array_names[@]}" do echo "dumping dyn_$name by index" # print by index for (( i=0 ; i < $(arr_count dyn_$name) ; i++ )) do echo "dyn_$name[$i]: $(arr_at dyn_$name $i)" done done for name in "${array_names[@]}" do echo "dumping dyn_$name" for n in $(arr_get dyn_$name) do echo $n done done これらの例の詳細については、 getting bashed by dynamic arrays by ludvik jerabek をご覧ください。