синтаксическая ошибка в сценарии bash if.. elif

Я пытаюсь создать свой первый скрипт для использования операторов «если» в bash. Он объединяет 2 сценария, над которыми я работал, чтобы создать несколько копий файла, один с именами, добавленными в числовом виде, другой с помощью A-Z.

Я пробовал много изменений, но я абсолютно не могу заставить это работать без сообщения об ошибке

./cpmany.sh: строка 18: синтаксическая ошибка рядом с неожиданным токеном elif' ./cpmany.sh: line 18:elif [$alpha="A"]; тогда'

Вот мой оригинальный нерабочий код:

#!/bin/bash
set -x
echo "input file source"
read INPUT
echo  "Alphabetical or Numerical"
read alpha
if [ $alpha=="N" ]; then
echo "start of range"
read x
echo "end of range"
read y
    for ((i=x; i<=y; i++)); do cp "$INPUT" "$INPUT$i";
elif [ $alpha=="A" ]; then
    for i in {a..z}
    do
    echo "$i"
    cp "$INPUT" "$INPUT$i";
else
    echo "error in selection";
fi
exit 0

Вот мой текущий код с добавленными "done" и пробелами в if [ $alpha = "N" ]

#!/bin/bash
echo "input file source"
read INPUT
echo  "Alphabetical or Numerical"
read alpha


if [ $alpha = "N" ]; then
echo "start of range"
read x
echo "end of range"
read y

    for ((i=x; i<=y; i++)); do cp "$INPUT" "$INPUT$i";
done
elif [ $alpha = "A" ]; then
    for i in {a..z};
    do
    echo "$i"
    cp "$INPUT" "$INPUT$i"; done
else
    echo "error in selection";
fi
done
exit 0

person Tom Bennett    schedule 01.11.2013    source источник
comment
Вам также нужно поставить пробелы вокруг = в условиях тестирования, например: [ "$alpha" = "N" ].   -  person chepner    schedule 01.11.2013


Ответы (1)


Вы забыли закрыть цикл for с помощью done.

person Alexander L. Belikoff    schedule 01.11.2013
comment
Я добавил done в строку после fi, все равно получаю ту же ошибку - person Tom Bennett; 01.11.2013
comment
Добавил второй в строку перед elif, и теперь он выдает эту ошибку: ›./cpmany.sh: строка 23: синтаксическая ошибка рядом с неожиданным токеном else' > ./cpmany.sh: line 23: else' - person Tom Bennett; 01.11.2013
comment
Это мой код теперь, когда я закрыл циклы с помощью done #!/bin/bash set -x echo "input file source" read INPUT echo "Alphabetical or Numerical" read alpha if [ $alpha="N" ]; then echo "start of range" read x echo "end of range" read y for ((i=x; i<=y; i++)); do cp "$INPUT" "$INPUT$i"; done elif [ $alpha="A" ]; then for i in {a..z} do echo "$i" cp "$INPUT" "$INPUT$i"; else echo "error in selection"; fi done exit 0 - person Tom Bennett; 01.11.2013
comment
Во втором цикле for отсутствует точка с запятой перед do и отсутствует done - person Alexander L. Belikoff; 01.11.2013
comment
изменить, если [$alpha=N]; затем, если [ $alpha = N ]; тогда - person michael501; 01.11.2013
comment
@ user2921342: Пожалуйста, не размещайте многострочные блоки кода в комментариях; как видите, они плохо форматируются. Вы можете обновить вопрос. - person Keith Thompson; 01.11.2013
comment
@KeithThompson, приношу свои извинения, я обновил свой код в исходном сообщении. Сейчас это работает, но выдает следующую ошибку: ›./cpmany.sh: строка 24: синтаксическая ошибка рядом с неожиданным токеном done' >./cpmany.sh: line 24: done' - person Tom Bennett; 01.11.2013
comment
@ user2921342: Пожалуйста, не обновляйте код таким образом, чтобы решить проблему, о которой вы спрашивали, и сделать существующие ответы недействительными. Вместо этого вы можете добавить новую версию кода, если хотите продолжить. - person Keith Thompson; 01.11.2013
comment
@KeithThompson Я добавил исходный код обратно в вопрос - person Tom Bennett; 02.11.2013