Вопрос по скрипту bash (case выдает ошибку)

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
Piterden
Сообщения: 5
ОС: win *nix sym

Вопрос по скрипту bash

Сообщение Piterden »

не пойму в чем дело

Код: Выделить всё

# uname -a
Linux (none) 2.6.25 #2 PREEMPT Tue Dec 7 17:44:00 CST 2010 armv6l unknown

скрипт такой:

Код:

#!/bin/sh # # ftprun E_BADARGS=65 FTP_IFACE="eth0" FTP_IP='ip addr list $FTP_IFACE | grep " inet " | head -n 1 | cut -d " " -f 6 | cut -d / -f 1' FTP_PORT=21 FTPD_ARG="-r" FTP_PATH="/" if [ $# -lt 1 ] # Проверка наличия аргументов командной строки. then echo "Порядок использования: `basename $0` -iIpwh shared_path" exit $E_BADARGS fi while getopts ":i:I:p:P:whs" Option do # echo $OPTIND case $Option in i ) FTP_IP=$OPTARG;; I ) FTP_IFACE=$OPTARG;; p ) FTP_PORT=$OPTARG;; P ) if [ ! -d $OPTARG ] then echo "Указан неверный путь!" else FTP_PATH=$OPTARG fi;; w ) FTPD_ARG="-w";; h | * ) echo "ftprun - утилита для запуска простого сервера ftp" echo "Порядок использования: `basename $0` -iIpwh shared_path" echo " -I интерфейс. По умолчанию eth0." echo " -i ip-адрес." echo " -p порт. По умолчанию 21." echo " -P путь. По умолчанию \"/\"." echo " -w режим записи. По умолчанию - только чтение" echo " -s остановка сервера" echo " -h эта справка";; s ) echo "" ;; esac done shift $(($OPTIND - 1)) # Переход к очередному параметру командной строки. tcpsvd -E $FTP_IP $FTP_PORT ftpd $FTPD_ARG / & exit 0

выдает сволочь

Код: Выделить всё

# ./ftprun.sh
: not found: line 1:    #!/bin/sh
./ftprun.sh: line 18: syntax error: word unexpected (expecting "in")

другие скрипты с такой же первой строкой работают.
18 строка это где case.
в чем проблема скрипта?
Спасибо сказали:
MrClon
Сообщения: 838
ОС: Ubuntu 10.04, Debian 7 и 6

Re: Вопрос по скрипту bash

Сообщение MrClon »

Не вижу от куда вообще берётся переменная $Option.

Кстати ты в курсе что $Option и $option это две разные переменные?
Спасибо сказали:
Аватара пользователя
Piterden
Сообщения: 5
ОС: win *nix sym

Re: Вопрос по скрипту bash

Сообщение Piterden »

MrClon писал(а):
30.01.2012 19:43
Не вижу от куда вообще берётся переменная $Option.

Кстати ты в курсе что $Option и $option это две разные переменные?

Из учебника )))
Spoiler
while getopts ":abcde:fg" Option
# Начальное объявление цикла анализа опций.
# a, b, c, d, e, f, g -- это возможные опции (ключи).
# Символ : после опции 'e' указывает на то, что с данной опцией может идти
# дополнительный аргумент.
do
case $Option in
a ) # Действия, предусмотренные опцией 'a'.
b ) # Действия, предусмотренные опцией 'b'.
...
e) # Действия, предусмотренные опцией 'e', а так же необходимо обработать $OPTARG,
# в которой находится дополнительный аргумент этой опции.
...
g ) # Действия, предусмотренные опцией 'g'.
esac
done
shift $(($OPTIND - 1))
# Перейти к следующей опции.


про две разные переменные в курсе
Спасибо сказали:
MrClon
Сообщения: 838
ОС: Ubuntu 10.04, Debian 7 и 6

Re: Вопрос по скрипту bash

Сообщение MrClon »

Попробуй заменить #!/bin/sh на #!/bin/bash если небе не принципиально написать именно sh скрипт.
Покажи что выдаёт whereis sh и whereis bash
Какой у тебя дистрибутив?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21480
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Вопрос по скрипту bash

Сообщение Bizdelnick »

А можете файл скрипта выложить? Может, там у Вас DOSовские EOLы или ещё какая бяка.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Piterden
Сообщения: 5
ОС: win *nix sym

Re: Вопрос по скрипту bash

Сообщение Piterden »

MrClon писал(а):
30.01.2012 19:53
Какой у тебя дистрибутив?

писал же

Код: Выделить всё

# uname -a
Linux (none) 2.6.25 #2 PREEMPT Tue Dec 7 17:44:00 CST 2010 armv6l unknown

это урезанный линь на роутере

вот файл скрипта:


а команды whereis нету на нем (((, но другие скрипты с #!/bin/sh и #!/bin/ash работают
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
MrClon
Сообщения: 838
ОС: Ubuntu 10.04, Debian 7 и 6

Re: Вопрос по скрипту bash

Сообщение MrClon »

uname -a это версия ядра, а не дистрибутив.

Что выдаёт ls -l /bin/sh и ls -l /bin/bash
Ну или вообще ls -l /bin
Спасибо сказали:
Аватара пользователя
Piterden
Сообщения: 5
ОС: win *nix sym

Re: Вопрос по скрипту bash

Сообщение Piterden »

пожалуйста:

Код:

# ls -l /bin/sh lrwxrwxrwx 1 root root 12 Jan 1 1970 /bin/sh -> /bin/busybox # ls -l /bin/bash ls: /bin/bash: No such file or directory # ls -l /bin/ash lrwxrwxrwx 1 root root 12 Jan 1 1970 /bin/ash -> /bin/busybox # ls -l /bin -rwxr-xr-x 1 root root 233520 Jan 1 1970 adbd lrwxrwxrwx 1 root root 12 Jan 1 1970 addgroup -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 adduser -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 ash -> /bin/busybox -rwxr-xr-x 1 root root 106088 Jan 1 1970 at_server -rwxr-xr-x 1 root root 26010 Jan 1 1970 athtestcmd lrwxrwxrwx 1 root root 12 Jan 1 1970 bbconfig -> /bin/busybox -rwxr-xr-x 1 root root 15809 Jan 1 1970 bmiloader -rwsr-xr-x 1 root root 498800 Jan 1 1970 busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 cat -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 chgrp -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 chmod -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 chown -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 cp -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 cpio -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 date -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 dd -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 delgroup -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 deluser -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 df -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 dmesg -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 dumpkmap -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 echo -> /bin/busybox -rwxr-xr-x 1 root root 16700 Jan 1 1970 eeprom.AR6002 lrwxrwxrwx 1 root root 12 Jan 1 1970 egrep -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 false -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 fgrep -> /bin/busybox -rwxr-xr-x 1 root root 3224 Jan 1 1970 get_network_time lrwxrwxrwx 1 root root 12 Jan 1 1970 getopt -> /bin/busybox -rwxr-xr-x 1 root root 375756 Jan 1 1970 goahead lrwxrwxrwx 1 root root 12 Jan 1 1970 grep -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 gunzip -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 gzip -> /bin/busybox -rwxr-xr-x 1 root root 861628 Jan 1 1970 hostapd -rwxr-xr-x 1 root root 17724 Jan 1 1970 hostapd_cli -rwxr-xr-x 1 root root 3360 Jan 1 1970 hostapd_wps lrwxrwxrwx 1 root root 12 Jan 1 1970 hostname -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 ip -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 ipcalc -> /bin/busybox -rwxr-xr-x 1 root root 85907 Jan 1 1970 iperf -rwxr-xr-x 1 root root 26844 Jan 1 1970 iwconfig lrwxrwxrwx 1 root root 12 Jan 1 1970 kill -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 ln -> /bin/busybox -rwxr-xr-x 1 root root 1397 Jan 1 1970 load_ap.sh -rwxr-xr-x 1 root root 1105 Jan 1 1970 load_tcmd.sh lrwxrwxrwx 1 root root 12 Jan 1 1970 login -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 ls -> /bin/busybox -rwxr-xr-x 1 root root 88460 Jan 1 1970 main_control -rwxr-xr-x 1 root root 34532 Jan 1 1970 mdm_information -rwxr-xr-x 1 root root 68796 Jan 1 1970 miniupnpd lrwxrwxrwx 1 root root 12 Jan 1 1970 mkdir -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 mknod -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 mktemp -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 more -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 mount -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 mv -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 netstat -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 nice -> /bin/busybox -rwxr-xr-x 1 root root 40748 Jan 1 1970 nvio_get_item -rwxr-xr-x 1 root root 40752 Jan 1 1970 nvio_write_item lrwxrwxrwx 1 root root 12 Jan 1 1970 pidof -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 ping -> /bin/busybox -rwxr-xr-x 1 root root 59172 Jan 1 1970 ppp_dial_netc -rwxr-xr-x 1 root root 5776 Jan 1 1970 ppp_dial_test lrwxrwxrwx 1 root root 12 Jan 1 1970 ps -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 pwd -> /bin/busybox -rwxr-xr-x 1 root root 69842 Jan 1 1970 qmi_ctrl -rwxr-xr-x 1 root root 48112 Jan 1 1970 report_data_information lrwxrwxrwx 1 root root 12 Jan 1 1970 rm -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 rmdir -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 run-parts -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 sed -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 sh -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 sleep -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 stty -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 su -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 sync -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 tar -> /bin/busybox -rwxr-xr-x 1 root root 5680 Jan 1 1970 timer_wakeup lrwxrwxrwx 1 root root 12 Jan 1 1970 touch -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 true -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 umount -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 uname -> /bin/busybox -rwxr-xr-x 1 root root 9664 Jan 1 1970 usb_composition_2.sh lrwxrwxrwx 1 root root 12 Jan 1 1970 usleep -> /bin/busybox lrwxrwxrwx 1 root root 12 Jan 1 1970 vi -> /bin/busybox -rwxr-xr-x 1 root root 3228 Jan 1 1970 wakeUp_mainControl -rwxr-xr-x 1 root root 46904 Jan 1 1970 wifi_control -rwxr-xr-x 1 root root 112401 Jan 1 1970 wmiconfig -rwxr-xr-x 1 root root 272820 Jan 1 1970 wms_sms lrwxrwxrwx 1 root root 12 Jan 1 1970 zcat -> /bin/busybox -rwxr-xr-x 1 root root 12555 Jan 1 1970 zte_driver_soket_ctl -rwxr-xr-x 1 root root 42387 Jan 1 1970 zte_getwlanmac -rwxr-xr-x 1 root root 27904 Jan 1 1970 zte_scsi_99_nv_7999 -rwxr-xr-x 1 root root 8961 Jan 1 1970 zte_switch -rwxr-xr-x 1 root root 27883 Jan 1 1970 zte_wr_nv_7999

а какой командой дистрибутив узнать?
Спасибо сказали:
MrClon
Сообщения: 838
ОС: Ubuntu 10.04, Debian 7 и 6

Re: Вопрос по скрипту bash

Сообщение MrClon »

А ведь Bizdelnick был прав. У тебя там перед # в первой строке какой-то невидимый служебный символ.
Убери его, если не поможет (ошибка «: not found: line 1: #!/bin/sh» пропадёт, а вторая останется) попробуй поменять интерпритатор с sh на ash. Или кури про синтексис case в sh
Спасибо сказали:
Аватара пользователя
Piterden
Сообщения: 5
ОС: win *nix sym

Re: Вопрос по скрипту bash

Сообщение Piterden »

все, заработало, спасибо.
дело было в банальности: не в первой строке, а вообще во всех стоял перенос строк cr lf, а нужно было просто lf оставить. я в unix-формат через notepad++ преобразовал и все заработало
еще раз THANKS
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21480
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Вопрос по скрипту bash

Сообщение Bizdelnick »

Piterden писал(а):
30.01.2012 22:35
через notepad++

На будущее: можно пользоваться dos2unix (или просто sed 's/\r//').
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопрос по скрипту bash

Сообщение drBatty »

Bizdelnick писал(а):
30.01.2012 23:08
или просто sed 's/\r//'

не взлетит, если \r в середине строки есть. надо 's/\r$//', или 's/\r/ /g', потому-что вообще говоря, \r это пробельный символ.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21480
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Вопрос по скрипту bash

Сообщение Bizdelnick »

drBatty писал(а):
30.01.2012 23:16
если \r в середине строки есть

Ни разу такого не видел. И сильно сомневаюсь, что посреди строки он не будет скрипту мешаться.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Вопрос по скрипту bash

Сообщение diesel »

Bizdelnick писал(а):
30.01.2012 23:43
drBatty писал(а):
30.01.2012 23:16
если \r в середине строки есть

Ни разу такого не видел. И сильно сомневаюсь, что посреди строки он не будет скрипту мешаться.

он sed'у помешает в конце строки удалить символ, если без /g или $
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопрос по скрипту bash

Сообщение drBatty »

Bizdelnick писал(а):
30.01.2012 23:43
Ни разу такого не видел. И сильно сомневаюсь, что посреди строки он не будет скрипту мешаться.

этого я не знаю. смотря где. А то, что вы не видели - не показатель. Он на то и невидимый (:
diesel писал(а):
31.01.2012 00:22
он sed'у помешает в конце строки удалить символ, если без /g или $

часто не мешает, если в sed-скрипте допускаются пробелы в конце строки. Например такой скрипт удаляет "пустые" строки sed -r '/^\s*$/'. В том числе и полные \r.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Вопрос по скрипту bash

Сообщение diesel »

drBatty писал(а):
31.01.2012 03:28
этого я не знаю. смотря где. А то, что вы не видели - не показатель. Он на то и невидимый (:
diesel писал(а):
31.01.2012 00:22
он sed'у помешает в конце строки удалить символ, если без /g или $

часто не мешает, если в sed-скрипте допускаются пробелы в конце строки. Например такой скрипт удаляет "пустые" строки sed -r '/^\s*$/'. В том числе и полные \r.

Имеется ввиду "\r" в средине строки(что само по себе маловероятно, но все же может случится):


Код: Выделить всё

$ echo -ne "string1\rstring2\r\n" | od -abc
0000000   s   t   r   i   n   g   1  cr   s   t   r   i   n   g   2  cr
        163 164 162 151 156 147 061 015 163 164 162 151 156 147 062 015
          s   t   r   i   n   g   1  \r   s   t   r   i   n   g   2  \r
0000020  nl
        012
         \n
0000021
$ echo -ne "string1\rstring2\r\n" | sed 's/\r//' |od -abc
0000000   s   t   r   i   n   g   1   s   t   r   i   n   g   2  cr  nl
        163 164 162 151 156 147 061 163 164 162 151 156 147 062 015 012
          s   t   r   i   n   g   1   s   t   r   i   n   g   2  \r  \n
0000020
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопрос по скрипту bash

Сообщение drBatty »

diesel писал(а):
31.01.2012 14:25
Имеется ввиду "\r" в средине строки(что само по себе маловероятно, но все же может случится):

я на эту тему уже сказал
drBatty писал(а):
30.01.2012 23:16
не взлетит, если \r в середине строки есть. надо 's/\r$//', или 's/\r/ /g', потому-что вообще говоря, \r это пробельный символ.

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: