2013-09-20 4 views
17

Я пытаюсь объявить пустой массив в 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

+0

Ошибка Код ошибки: –

+3

Вы действительно руководите вашим скриптом как 'bash'? Похоже, скрипт запускается с помощью 'sh', и в этом случае массивы не поддерживаются. – chepner

+1

Кроме того, присвоение '$ @' другому параметру теряет преимущества '$ @', а именно, что белое пространство внутри одного аргумента командной строки сохраняется. Ditch 'list' и используйте' for l in "$ @"; do' напрямую. – chepner

ответ

10

запустить его с Баш:

bash test.sh 

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

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

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

+1

Спасибо! Выполнено 'bash script.sh'. Но ... почему даже с '#!/Bin/bash' он выполняется на тире? Я набрал «export», и мой SHELL установлен в bash. – luizfzs

+1

Возможно, из-за 'sh'. Вы можете видеть, где он указывает на 'ls -l/bin/sh' или' readlink $ (which sh) '. Кстати, самый быстрый способ объявить переменную массива 'newlist' на основе ваших аргументов -' newlist = ("$ @") '.Обратите внимание, что если args - '' ab "" c "" d ", без кавычек (' $ @ '), он будет разделен на 4 аргумента при расширении (' "a" "b" "c") из-за разбиения слова тогда как с '" $ @ "' значения остаются как есть с пространством. – konsolebox

+1

'#!' Работает только в том случае, если вы запустили его как команду, выполнив исполняемый файл ('chmod + x test.sh'), а затем просто набрав имя файла без какого-либо * sh перед ним:'./test.sh'. Если вы явно вводите имя оболочки, например 'sh' или' bash', как команду для запуска, то это команда, которая запускается; и в оболочку строка '#!' - это просто комментарий. –

0

Если массив пуст просто сделать это:

NEWLIST= 

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

if [ $NEWLIST ] ; then 
    # do something 
fi 

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

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

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

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

Надеется, что это помогает

+2

'NEWLIST' имеет длину 1 в этом примере. Попробуйте повторить «$ {# NEWLIST [@]}», чтобы увидеть это. – qntm

+0

ofc, thats normal, но, как показывает мой пример, «if» будет работать так, как должен, и не показывать ничего внутри. Таким образом, реальный тест, если он существует, а не для проверки длины, который будет фактически 3 в моем примере. Tetst it и dont downvote что-то, что работает правильно – nouseforname

+4

Пустой массив - это номер с длиной 0. 'NEWLIST' не пустой массив, потому что он имеет длину 1. Извините, но вы не ответили на вопрос правильно. Ваш оператор 'if' не проверяет это правильно. – qntm

1

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

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 правильно ориентирован на Баш и ваши массивы будут работать.

Смежные вопросы