sh + shスクリプトで配列を使用して配列のすべての値を印刷する方法

sh + shスクリプトで配列を使用して配列のすべての値を印刷する方法

使いたいソート私のシェンスクリプト。

私の目標は、値を含む配列を作成し、a b c配列のすべての値を印刷することです。

各配列を正常に印刷しましたが、配列のすべての値を印刷できませんでした。

以下の例:

arrに各値を設定します。:

n=1
eval arr$n=a
n=2
eval arr$n=b
n=3
eval arr$n=c

arr の各値を印刷します。:

n=1
eval echo \$arr$n
a
n=2
eval echo \$arr$n
b
n=3
eval echo \$arr$n
c

今、すべての値を印刷したいと思います。$arr代わりに、a b c次のようになります。

n="*"
eval echo \$arr$n
{*}*

値はでなければなりませんa b c

ベストアンサー1

少し遅れましたが、shここでは理想的な回答が見つかりませんので回答いたします。サブスクリプションが必要ない場合はsh有効です。する配列をサポートします。スペースで区切られた文字列としてのみサポートされます。内容全体を印刷、「プッシュ」、または繰り返すことができます。

以下はいくつかのサンプルコードです。

NAMES=""
NAMES="${NAMES} MYNAME"
NAMES="${NAMES} YOURNAME"
NAMES="${NAMES} THEIRNAME"

echo 'One at a time...'
for NAME in ${NAMES}; do
    echo ${NAME};
done

echo 'All together now!'
echo ${NAMES}

任意の出力:

One at a time...
MYNAME
YOURNAME
THEIRNAME
All together now!
MYNAME YOURNAME THEIRNAME

私は下付き文字をサポートしていないと言っていますが、いくつかのcut魔法と適切な区切り文字でスペースを使用すると、確かにエミュレートできます。上記の例の下部にこれを追加すると:

echo 'Get the second one'
echo ${NAMES} | cut -d' ' -f2

echo 'Add one more...'
NAMES="${NAMES} TOM"

echo 'Grab the third one'
echo ${NAMES} | cut -d' ' -f3

これを実行すると、次のような結果が得られます。

Get the second one
YOURNAME
Add one more...
Grab the third one
THEIRNAME

これがまさに私たちが期待したものです!

ただし、スペースを含む文字列は問題を引き起こし、下付き文字を完全に破棄する可能性があります。

したがって、より良い表現は、配列が明確ではなく、sh空白のある文字列配列を処理するのが難しいということです。これを行う必要がない場合(たとえば、デプロイしたいホスト名の配列など)、これはshまだ良いツールです。

おすすめ記事