web-dev-qa-db-ja.com

シェルスクリプト:空の配列を宣言する正しい方法

シェルスクリプトで空の配列を宣言しようとしていますが、エラーが発生しています。

#!/bin/bash

list=$@

newlist=()

for l in $list; do

        newlist+=($l)

done

echo "new"
echo $newlist

実行すると、test.sh: 5: test.sh: Syntax error: "(" unexpected

24
luizfzs

Bashで実行します:

bash test.sh

エラーを見ると、実際にダッシュで実行しているようです:

> dash test.sh
test.sh: 5: test.sh: Syntax error: "(" unexpected

今回のみ、おそらくリンク(/ bin/sh->/bin/dash)を使用しました。

10
konsolebox

次の構文が読みやすいと思います。

declare -a <name of array>

詳細については、 初心者向けBashガイド:10.2。配列変数 を参照してください。

7
shaffooo

BASH 4以降では、空の配列を宣言するために次を使用できます。

declare -a ARRAY_NAME=()

その後、次の方法で新しいアイテムNEW_ITEM1およびNEW_ITEM2を追加できます。

ARRAY_NAME+=(NEW_ITEM1)
ARRAY_NAME+=(NEW_ITEM2)

新しいアイテムを追加するときは括弧()が必要であることに注意してください。これは、新しいアイテムが配列要素として追加されるために必要です。 ()を忘れた場合、NEW_ITEM2は最初の配列要素ARRAY_NAME [0]に追加される文字列になります。

上記の例は次のようになります。

echo ${ARRAY_NAME[@]}
NEW_ITEM1 NEW_ITEM2

echo ${ARRAY_NAME[0]}
NEW_ITEM1

echo ${ARRAY_NAME[1]}
NEW_ITEM2

次に、実行した場合(括弧がないことに注意してください):

ARRAY_NAME+=NEW_ITEM3

これは次のようになります。

echo ${ARRAY_NAME[@]}
NEW_ITEM1NEW_ITEM3 NEW_ITEM2

echo ${ARRAY_NAME[0]}
NEW_ITEM1NEW_ITEM3

echo ${ARRAY_NAME[1]}
NEW_ITEM2

追加操作で私を修正してくれた@LenWに感謝します。

1
TMT

これを試して、ダッシュまたはバッシュに向いているかどうかを確認してください

ls -al /bin/sh

/bin/sh -> /bin/dash、次にこれを入力します。

Sudo rm /bin/sh
Sudo ln -s /bin/bash /bin/sh

次に、もう一度入力します。

ls -al /bin/sh*

このようなことを言う必要があります:

/bin/sh -> /bin/bash

これは、shが適切にBashに向けられ、配列が機能することを意味します。

1
Usul Muhadiv