Синтаксическая ошибка Cygwin bash - но скрипт отлично работает в Ubuntu - PullRequest
5 голосов
/ 26 марта 2010
#!/bin/bash
if test "$#" == "4"; then echo "$*"; else echo "args-error" >&2; fi;

Этот небольшой фрагмент кода очень беспокоит меня, когда я пытался запустить его на Ubuntu и Cygwin.

Ubuntu работает под управлением bash версии 4.0+, тогда как Cygwin работает с 3.2.49; Но я считаю, что столкновение версий не должно быть причиной этого, этот код хорошо работает под Fedora 10, которая также использует версию 3 bash. +

Так что в основном мне интересно, есть ли способ закодировать мой скрипт раз и навсегда, чтобы не было этой ужасной проблемы позже.

Большое спасибо заранее.

Отредактировано: на данный момент у меня нет Cygwin вручную, но из моей памяти он говорит, что что-то вроде не может разрешить неопределенный токен "fi" что-то в этом роде.

Отредактировано: ну, оригинальная форма такая, только что найденная с сервера:

#!/bin/bash
if ["$#" == "4"];
    then echo "$*";
    else echo "args-error" >&2;
fi;

Консоль жалуется:

$ ./test.sh 1 2 3
./test.sh: line 2: [3: command not found
args-error

Мне также интересно, почему stderr говорит, что что-то идет не так - команда не найдена - но все еще может распечатать ответ?

Ответы [ 4 ]

7 голосов
/ 26 марта 2010

Вам нужны пробелы вокруг [ и ].

#!/bin/bash
if [ "$#" == "4" ];
    then echo "$*";
    else echo "args-error" >&2;
fi;
4 голосов
/ 26 марта 2010

Обновленный ответ:

Вам нужен пробел после [, иначе ["$#" оценивается, например, [3, который не существует. Попробуйте это:

if [ "$#" == "4" ];
    then echo "$*";
    else echo "args-error" >&2;
fi;

Это работает для меня. Я полагаю, что вы получаете сообщение об ошибке, подобное этому:

test.sh: line 2: $'\r': command not found
test.sh: line 3: $'\r': command not found

Это может произойти, потому что вы отредактировали файл, используя окончания строк в стиле Windows, но Bash ожидает окончания строк в стиле Unix. Чтобы исправить файл, попробуйте выполнить эту команду:

dos2unix test.sh

Вам, конечно, нужно изменить имя файла на фактическое имя файла вашего сценария.

2 голосов
/ 26 марта 2010

При редактировании для отображения «оригинальной формы» проблема может заключаться в том, что вам не хватает пробела между [ и "

1 голос
/ 26 марта 2010

попробуйте использовать оператор '=' вместо '=='. А также добавьте один пробел после [ и еще один перед ] следующим

if ["$ #" = "4"];
затем эхо "$ *";
else echo "args-error"> & 2;
Fi;

Или даже попробуйте '-eq' вместо '=='

if ["$ #" -eq "4"];

Потому что в некоторых системах он не принимает оператор '=='

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...