10

他の配列を含む配列をループしようとしていますが、これらの配列はスペースを含む文字列で構成されています。問題は、文字列の間隔を維持できないように見えることです。スペースを持つ文字列は、ifsを\ nに変更する場合、複数のアイテムに分割されます。または、アレイのすべての要素が1アイテムとして表示されます。

#!/bin/sh
low1=("AA  QQ" "BB  LL")
low2=("CC" "DD")
low3=("EE" "FF")
high=(low1 low2 low3)

for high_item in ${high[@]}
do
   eval arrayz=\${$high_item[@]}
   #IFS=$'\n'
   for item in $arrayz
   do
      echo $item
   done
done

出力:

AA
QQ
BB
LL
CC
DD
EE
FF

ご覧のとおり、要素「AA QQ」と「BB LL」が分割されています。

IFSに設定されている行のコメントを外すと\n、次のようになります。

AA QQ BB LL
CC DD
EEFF

「AA QQ」と「BB LL」が連結されました!

とにかく、元の要素と同じようにこれらの要素を保存できますか...出力を次のようにする必要があります。

AA QQ
BBLL
CC
DD
EE
FF
4

2 に答える 2

5

出力は次のようになります。

AA  QQ
BB  LL
CC
DD
EE
FF

すなわち:

${low1[0]}
${low1[1]}
${low2[0]}
${low2[1]}
${low3[0]}
${low3[1]}

これは、次を使用して実行できます。

#!/bin/bash

low1=("AA  QQ" "BB  LL")
low2=("CC" "DD")
low3=("EE" "FF")
high=(low1 low2 low3)

for high_item in ${high[@]}
do
    x="${high_item}[@]" # -> "low1[@]"
    arrays=( "${!x}" )

    #IFS=$'\n'
    for item in "${arrays[@]}"
    do
        echo "$item"
    done
done

また、bashスクリプトには常に使用してください。#!/bin/bash

説明:${!x}間接変数展開です。に含まれる名前の変数の値に評価され$xます。

私たちのニーズのために、配列拡張xの接尾辞も必要です。特に、そうではない[@]ことに注意してください。x=${high_item}[@] x=${high_item[@]}

そして、それを配列のコンテキストで評価する必要があります。そうしないと、期待どおりに機能しません(機能する場合arrays=${!x})。

ああ、そして最後の注意として:IFSここでは何の違いもありません。引用符で囲まれた配列で作業している限り、IFS効果はありません。

于 2012-09-06T13:22:45.267 に答える
4

間接的なパラメーター展開に置き換えるevalと、私が望むものが得られます(ただし、現在の指定された出力とは一致しません。

for high_item in "${high[@]}"
do
    arrayz="$high_item[@]"
    # arrayz is just a string like "low1[@]"
    for item in "${!arrayz}"
    do
        echo $item
    done
done

の要素の空白を保持するために、内側のループで配列展開を引用符で囲む必要があることに注意してくださいlow1

于 2012-09-06T13:22:30.070 に答える