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).
Ответ 2
Я нахожу следующий синтаксис более читабельным.
declare -a <name of array>
Подробнее см. Руководство по Bash для начинающих: 10.2. Переменные массива.
Ответ 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')")
Надеюсь, что это поможет