Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Помогите со скриптом  (Прочитано 5416 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Alexx_b

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Помогите со скриптом
« : 15 Апрель 2009, 10:00:26 »
Только начал разбираться с написанием скриптов в linux и сразу получил проблему, которую не могу решить.
Пробую выполнить простейший скрипт:
#!/bin/bash
if ["foo"="foo"]; then
echo Equals
fi
на что мне выводиться следующее сообщение:
Цитировать
syntax error end of file unexpected (expecting "then")
почему так?

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Помогите со скриптом
« Ответ #1 : 15 Апрель 2009, 10:03:37 »
arcfi@arcfi-laptop:~$ if [ "foo"="foo" ]; then echo Equals; fi
Equals

ps
Пробелы.

Оффлайн Alexx_b

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Помогите со скриптом
« Ответ #2 : 15 Апрель 2009, 10:07:44 »
так у меня тоже работает, но дело в том, что надо все это из файла запускать, т.е. у меня файл называется 123, я набираю команду sh 123 и получаю это ошибку. В строчку - тоже пробовал писать - не прокатывает :(

plin2s

  • Гость
Re: Помогите со скриптом
« Ответ #3 : 15 Апрель 2009, 10:08:01 »
then помоему на новой строке должен быть

  if  условие

     then  список

[elif  условие

  then  список]

     [else  список]

   fi
ну и на будущее http://www.citforum.ru/programming/shell/index.shtml
« Последнее редактирование: 15 Апрель 2009, 10:11:42 от plin2s »

Оффлайн Alexx_b

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Помогите со скриптом
« Ответ #4 : 15 Апрель 2009, 10:12:21 »
Пробовал я и так:
#!/bin/bash
if [ "foo" = "foo" ];
then
echo Equals;
fi
все равно не прокатывает.
Может у меня какого-нить пакета не хватает?

Пользователь решил продолжить мысль 15 Апрель 2009, 10:14:49:
за ссылку - спасибо!
Но сам я взял данный пример из статьи по BASH программированию, а не сам придумал, вот и спрашиваю почему у меня не работает даже такая несложная штука :(
« Последнее редактирование: 15 Апрель 2009, 10:14:49 от Alexx_b »

plin2s

  • Гость
Re: Помогите со скриптом
« Ответ #5 : 15 Апрель 2009, 10:15:42 »
#!/bin/bash
if [ "foo" = "foo" ]
then echo Equals
fi

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Помогите со скриптом
« Ответ #6 : 15 Апрель 2009, 10:17:33 »
echo -e '#!/bin/bash\n\nif [ "foo"=="foo" ]\nthen\n\techo Equals\nfi' > script-00.sh && chmod +x script-00.sh && ./script-00.sh

Оффлайн Alexx_b

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Помогите со скриптом
« Ответ #7 : 15 Апрель 2009, 10:21:26 »
#!/bin/bash
if [ "foo" = "foo" ]
then echo Equals
fi
Спасибо!
Вот именно так - работает...
Однако, чувствую не просто будет разобраться с BASH, при таком чувствительном отношении к пробелам, переносам строкии ; :(

Пользователь решил продолжить мысль 15 Апрель 2009, 08:25:00:
echo -e '#!/bin/bash

if [ "foo"=="foo" ]
then
echo Equals
fi' > script-00.sh && chmod +x script-00.sh && ./script-00.sh
Спасибо, конечно, но пока это слишком сложно для моего понимания... только начал разбираться с программированием в linux, а использовать то, чего не понимаю, не люблю...

Пользователь решил продолжить мысль 15 Апрель 2009, 10:37:05:
Ещё один вопрос - пытаюсь использовать переменные, пишу так:
#!/bin/bash
FOLDER=/home/user/lfolder/1
if [ $(stat -c %s $FOLDER) = $(stat -c %s $FOLDER) ]
then echo Equals
else echo NON
fi
вылетает ошибка:
Цитировать
stat: cannot stat '/home/user/lfolder/1\r': No such file or directory
Откуда берется \r? И как следует использовать переменную в данном случае?
Причем, если вместо переменной писать реальный путь, то все работает.
« Последнее редактирование: 15 Апрель 2009, 10:37:05 от Alexx_b »

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Re: Помогите со скриптом
« Ответ #8 : 15 Апрель 2009, 11:04:43 »
С переносами всё нормально. Это тоже правильный код:
#!/bin/bash
if [ "foo"="foo" ]; then
echo Equals
fi

>if [ $(stat -c %s $FOLDER) = $(stat -c %s $FOLDER) ]
Это какой-то башизм? В классическом шеле пишут так:
STAT_VALUE=`stat -c %s $FOLDER`
« Последнее редактирование: 15 Апрель 2009, 11:11:23 от Sova777 »
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

Оффлайн Alexx_b

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Помогите со скриптом
« Ответ #9 : 15 Апрель 2009, 11:33:04 »
написал вот так:
#!/bin/bash
FOLDER=$HOME/lfolder/1
ST=`stat -c %s $FOLDER`
if  [ $ST = $ST ]
then echo 1
else echo 2
fi
все равно таже ошибка, т.е. в конец адреса добавляется \r :(

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Re: Помогите со скриптом
« Ответ #10 : 15 Апрель 2009, 11:40:48 »
странно, а так:
#!/bin/bash
FOLDER=$HOME/lfolder/1
ST=`stat -c %s $FOLDER`
if  [ "$ST" = "$ST" ]
then echo 1
else echo 2
fi

\r - виндовый перевод строки. Подумай, может ты редактировал файл в Windows?
« Последнее редактирование: 15 Апрель 2009, 11:45:48 от Sova777 »
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

Оффлайн Alexx_b

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Помогите со скриптом
« Ответ #11 : 15 Апрель 2009, 11:46:32 »
так тоже не прокатывает, т.е. путь подставляется правильно, но добавляется ещё \r в конец и получается вот так:
stat '/home/user/lfolder/1\r'

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Re: Помогите со скриптом
« Ответ #12 : 15 Апрель 2009, 11:51:52 »
Запусти такую комманду:
od -c <имя скрипта>
Что видно?
« Последнее редактирование: 15 Апрель 2009, 11:55:31 от Sova777 »
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

Оффлайн Rosik

  • Активист
  • *
  • Сообщений: 255
  • по жизни Rosik
    • Просмотр профиля
Re: Помогите со скриптом
« Ответ #13 : 15 Апрель 2009, 12:33:23 »
проясню некоторые вопросы с пробелами:

синтаксис оператора if уже приводили, но без пояснений.
код в общем случае выглядит как
if cmd1; then cmd2; fi;здесь cmd1 это некоторая программа, которая делает return 0;  либо return -1; (c++). если программа сделала return 0 то скрипт переходит к cmd2.
Теперь про квадратные скобки. Это ни что иное как альтернатива программе test (читай man test) отсюда и проблема с пробелами.
if [ "foo" = "foo" ]
эквивалентно
if test "foo" = "foo"
Просто программа test хочет видеть 3 аргумента, а когда мы пишем test "boo"="boo" она видит только 1 ( аргументы разделяются пробелами ), и мы получаем ошибку

Со вторым скриптом не знаю, но двойные кавычки " не помешают. (с кавычками там вообще много веселья)

ЗЫ я когда-то читал http://www.opennet.ru/docs/RUS/bash_scripting_guide/ вроде ниче так.

Оффлайн Alexx_b

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Помогите со скриптом
« Ответ #14 : 15 Апрель 2009, 12:57:00 »
Запусти такую комманду:
od -c <имя скрипта>
Что видно?
вот что получается
alexx@serveru:~/lfolder$ od -c 1
0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n   F   O   L
0000020   D   E   R   =   $   H   O   M   E   /   l   f   o   l   d   e
0000040   r   /   1  \r  \n   S   T   =   `   s   t   a   t       -   c
0000060       %   s       $   F   O   L   D   E   R   `  \r  \n   i   f
0000100           [       "   $   S   T   "       =       "   $   S   T
0000120   "       ]  \r  \n   t   h   e   n       e   c   h   o       1
0000140  \r  \n   e   l   s   e       e   c   h   o       2  \r  \n   f
0000160   i
0000161
alexx@serveru:~/lfolder$


Пользователь решил продолжить мысль 15 Апрель 2009, 08:58:28:
Rosik, спасибо за пояснения, стало чуть яснее.
« Последнее редактирование: 15 Апрель 2009, 13:04:30 от Alexx_b »

 

Страница сгенерирована за 0.086 секунд. Запросов: 24.