#!/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 говорит что-то, идет не так, как надо - команда, не найденная - но может все еще распечатать ответ?
Вам нужны пробелы вокруг [
и ]
.
#!/bin/bash
if [ "$#" == "4" ];
then echo "$*";
else echo "args-error" >&2;
fi;
В вашей редакции чтобы показать «исходную форму», проблема может заключаться в том, что вам не хватает пробела между [
и "
Обновленный ответ:
Вам нужен пробел после [
, иначе ["$ #"
оценивается, например, как [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
Вы, конечно, должны изменить имя файла на фактическое имя файла вашего скрипта.
попробуйте использовать оператор '=' вместо '=='. А также добавьте один пробел после [
и еще один перед ]
, как показано ниже
if ["$ #" = "4"];
then echo "$ *";
else echo "args-error"> & 2;
fi;
Или даже попробуйте '-eq' вместо '=='
if ["$ #" -eq "4"];
Поскольку в некоторых системах он не принимает оператор '=='