Shell Script: правильный способ объявить пустой массив

Я пытаюсь объявить пустой массив в Shell Script, но я испытываю ошибку.

#!/bin/bash

[email protected]

newlist=()

for l in $list; do

        newlist+=($l)

done

echo "new"
echo $newlist

Когда я его выполню, я получаю test.sh: 5: test.sh: Syntax error: "(" unexpected

Ответы

Ответ 1

Запустите его с помощью bash:

bash test.sh

И, увидев ошибку, кажется, вы на самом деле запускаете ее с тире:

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

Только на этот раз вы, вероятно, использовали ссылку на него (/bin/sh → /bin/dash).

Ответ 3

Попробуйте это, чтобы убедиться, что вы ориентированы на тире или bash

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, и ваши массивы будут работать.

Ответ 4

В BASH 4+ вы можете использовать следующее для объявления пустого массива:

declare -a ARRAY_NAME=()

Затем вы можете добавлять новые элементы NEW_ITEM1 & NEW_ITEM2 от:

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

Обратите внимание, что скобки() необходимы при добавлении новых элементов. Это необходимо для добавления новых элементов в качестве элемента Array. Если вы пропустили(), 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 за исправление при добавлении.

Ответ 5

Если массив пуст, просто выполните следующее:

NEWLIST=

Вы можете проверить это с помощью:

if [ $NEWLIST ] ; then
   # do something
fi

объявление без пустого массива выглядит следующим образом:

NEWLIST=('1' '2' '3')

Чтобы заполнить массив во время процесса:

ARRAY=("$(find . -name '*.mp3')")

Надеюсь, что это поможет