2

2 つの配列を定義したスクリプトがあります。(パラメータとして)渡された配列名に応じて、以下の関数で同じものを処理したいと思います。以前は、使用するまで、変数「ARRAY」に要素を取得することすらできませんでした${!}

問題は、配列の内容 (またはその配列内の要素の数) を印刷しているときに、最初の要素のみを取得していることです。

助言がありますか?

脚本:

#!/bin/bash

APP=$1

process_data() {
    ARRAY="${!1}"
    echo "No of array elements: ${#ARRAY[@]}"
    echo "Array content: ${ARRAY[@]}"
}


ORADATA=(
"oraserver/content:abcDaily/ORAServer/"
"oraserver/w3s-ix86:abcDaily/ORAServer/"
)

SQLDATA=(
"sqlserver/content:abcDaily/SQLServer/"
"sqlserver/w3s-ix86:abcDaily/SQLServer/"
)

process_data ${APP[@]}

指示:

-bash-2.05b$ ./testarray.sh ORADATA

出力:

No of array elements: 1
Array content: oraserver/content:abcDaily/ORAServer/
4

2 に答える 2

2

これが機能する変更されたスクリプトです( dreaded の助けを借りてeval):

#!/bin/bash

APP=$1

process_data() {
   ARRAY=( $(eval echo \${$1[@]}) )
   echo "No of array elements: ${#ARRAY[@]}"
   echo "Array content: ${ARRAY[@]}"
}

ORADATA=(
"oraserver/content:abcDaily/ORAServer/"
"oraserver/w3s-ix86:abcDaily/ORAServer/"
)

SQLDATA=(
"sqlserver/content:abcDaily/SQLServer/"
"sqlserver/w3s-ix86:abcDaily/SQLServer/"
)

process_data ${APP[@]}

出力:

No of array elements: 2
Array content: oraserver/content:abcDaily/ORAServer/ oraserver/w3s-ix86:abcDaily/ORAServer/
于 2012-06-05T14:11:56.230 に答える
1

これは eval のないバージョンです (したがって、配列値内のシェルのメタ文字を適切に処理します):

#!/bin/bash

APP=$1

process_data() {
    ARRAYVAR="$1[@]"   # This just textually appends "[@]" to $1
    ARRAY=("${!ARRAYVAR}")   # Use indirect expansion to get contents of array, store as new array
    echo "No of array elements: ${#ARRAY[@]}"
    echo "Array content: ${ARRAY[@]}"
}


ORADATA=(
"oraserver/content:abcDaily/ORAServer/"
"oraserver/w3s-ix86:abcDaily/ORAServer/"
)

SQLDATA=(
"sqlserver/content:abcDaily/SQLServer/"
"sqlserver/w3s-ix86:abcDaily/SQLServer/"
)

process_data $APP   # Note that APP is not an array, so the [@] bit was irrelevant

例:

$ ./testarray.sh ORADATA
No of array elements: 2
Array content: oraserver/content:abcDaily/ORAServer/ oraserver/w3s-ix86:abcDaily/ORAServer/
于 2012-06-06T03:56:53.173 に答える