6

bashスクリプトを作成していますが、問題が発生しました。だから私はこれを手に入れたとしましょう

function create_some_array(){
  for i in 0 1 2 3 .. 10
  do
    a[i]=$i
  done
}

create_some_array
echo ${a[*]}

これを機能させる方法はありますか?私はかなり多くのことを検索しましたが、何もうまくいきませんでした。グローバル変数を作成することはa[]機能するはずですが、コードで実際に機能するものを見つけることができません。関数からメインプログラムに配列を返す方法はありますか?

前もって感謝します

4

5 に答える 5

3

配列に空白がある場合、これは期待どおりに機能しません。

function create_some_array() {
    local -a a=()
    for i in $(seq $1 $2); do
        a[i]="$i $[$i*$i]"
    done
    echo ${a[@]}
}

さらに悪いことに、外部の "a" から配列インデックスを取得しようとすると、スカラーであることが判明します。

echo ${!a[@]}

配列として代入しても役に立たない可能性があるため、エコー行によって引用が自然に削除され、引用を回避するために評価順序を操作することはできません:

function create_some_array() {
...
    echo "${a[@]}"
}

a=($(create_some_array 0 10))
echo ${!a[@]}

それでも、printf も役に立たないようです。

function create_some_array() {
...
    printf " \"%s\"" "${a[@]}"
}

一方では正しい出力を生成するようです:

$ create_some_array 0 3; echo
 "0 0" "1 1" "2 4" "3 9"

しかし、割り当ては他のものでは機能しません:

$ b=($(create_some_array 0 3))
$ echo ${!b[@]}
0 1 2 3 4 5 6 7

したがって、私の最後のトリックは、次のように割り当てを行うことでした。

$ eval b=("$(create_some_array 0 3)")
$ echo -e "${!b[@]}\n${b[3]}"
0 1 2 3
3 9

タター!

PS: printf "%q " "${a[@]}" も正常に動作します...

于 2016-11-23T16:04:35.243 に答える
3

これは説明どおりに正常に機能します。実際のコードで機能しない最も可能性の高い理由は、たまたまサブシェルで実行したためです。

cat textfile | create_some_array
echo ${a[*]}

パイプラインの各要素はサブシェルで実行されるため、機能しません。

myvalue=$(create_some_array)
echo ${a[*]}

コマンド展開はサブシェルで行われるため、機能しません。

于 2013-02-12T18:29:23.250 に答える
2

関数に対してローカルな配列を作成し、それを返すことができます。

function create_some_array(){
    local -a a=()
    for i in $(seq $1 $2); do
        a[i]=$i
    done
    echo ${a[@]}
}

declare -a a=()

a=$(create_some_array 0 10)

for i in ${a[@]}; do
   echo "i = " $i
done
于 2014-06-07T19:34:15.233 に答える