Cygwin колотят синтаксическую ошибку - но скрипт, запущенный отлично в Ubuntu

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

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

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

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

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

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

Отредактированный: хорошо, исходная форма похожа на это, просто найденное с сервера:

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

Console жалуется:

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

Я также задаюсь вопросом, каким образом это, stderr говорит что-то, идет не так, как надо - команда, не найденная - но может все еще распечатать ответ?

5
задан Michael Mao 25 March 2010 в 23:10
поделиться

4 ответа

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

#!/bin/bash
if [ "$#" == "4" ];
    then echo "$*";
    else echo "args-error" >&2;
fi;
7
ответ дан 18 December 2019 в 13:12
поделиться

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

2
ответ дан 18 December 2019 в 13:12
поделиться

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

Вам нужен пробел после [, иначе ["$ #" оценивается, например, как [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

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

4
ответ дан 18 December 2019 в 13:12
поделиться

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

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

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

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

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

1
ответ дан 18 December 2019 в 13:12
поделиться