Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.
Модератор: Bizdelnick
Piterden
Сообщения: 5
ОС: win *nix sym
Сообщение
Piterden » 30.01.2012 19:36
не пойму в чем дело
Код: Выделить всё
# 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
Сообщение
MrClon » 30.01.2012 19:43
Не вижу от куда вообще берётся переменная $Option.
Кстати ты в курсе что $Option и $option это две разные переменные?
Piterden
Сообщения: 5
ОС: win *nix sym
Сообщение
Piterden » 30.01.2012 19:46
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
Сообщение
MrClon » 30.01.2012 19:53
Попробуй заменить #!/bin/sh на #!/bin/bash если небе не принципиально написать именно sh скрипт.
Покажи что выдаёт whereis sh и whereis bash
Какой у тебя дистрибутив?
Bizdelnick
Модератор
Сообщения: 21480
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 30.01.2012 21:02
А можете файл скрипта выложить? Может, там у Вас DOSовские EOLы или ещё какая бяка.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
Piterden
Сообщения: 5
ОС: win *nix sym
Сообщение
Piterden » 30.01.2012 21:26
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
Сообщение
MrClon » 30.01.2012 21:31
uname -a это версия ядра, а не дистрибутив.
Что выдаёт ls -l /bin/sh и ls -l /bin/bash
Ну или вообще ls -l /bin
Piterden
Сообщения: 5
ОС: win *nix sym
Сообщение
Piterden » 30.01.2012 21:38
пожалуйста:
Код:
# 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
Сообщение
MrClon » 30.01.2012 22:23
А ведь Bizdelnick был прав. У тебя там перед # в первой строке какой-то невидимый служебный символ.
Убери его, если не поможет (ошибка «: not found: line 1: #!/bin/sh» пропадёт, а вторая останется) попробуй поменять интерпритатор с sh на ash. Или кури про синтексис case в sh
Piterden
Сообщения: 5
ОС: win *nix sym
Сообщение
Piterden » 30.01.2012 22:35
все, заработало, спасибо.
дело было в банальности: не в первой строке, а вообще во всех стоял перенос строк cr lf , а нужно было просто lf оставить. я в unix-формат через notepad++ преобразовал и все заработало
еще раз THANKS
Bizdelnick
Модератор
Сообщения: 21480
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 30.01.2012 23:08
Piterden писал(а): ↑ 30.01.2012 22:35
через notepad++
На будущее: можно пользоваться dos2unix (или просто
sed 's/\r//' ).
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 30.01.2012 23:16
Bizdelnick писал(а): ↑ 30.01.2012 23:08
или просто sed 's/\r//'
не взлетит, если \r в середине строки есть. надо 's/\r$//', или 's/\r/ /g', потому-что вообще говоря, \r это пробельный символ.
Bizdelnick
Модератор
Сообщения: 21480
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 30.01.2012 23:43
drBatty писал(а): ↑ 30.01.2012 23:16
если \r в середине строки есть
Ни разу такого не видел. И сильно сомневаюсь, что посреди строки он не будет скрипту мешаться.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Сообщение
diesel » 31.01.2012 00:22
Bizdelnick писал(а): ↑ 30.01.2012 23:43
drBatty писал(а): ↑ 30.01.2012 23:16
если \r в середине строки есть
Ни разу такого не видел. И сильно сомневаюсь, что посреди строки он не будет скрипту мешаться.
он sed'у помешает в конце строки удалить символ, если без /g или $
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 31.01.2012 03:28
Bizdelnick писал(а): ↑ 30.01.2012 23:43
Ни разу такого не видел. И сильно сомневаюсь, что посреди строки он не будет скрипту мешаться.
этого я не знаю. смотря где. А то, что вы не видели - не показатель. Он на то и невидимый (:
diesel писал(а): ↑ 31.01.2012 00:22
он sed'у помешает в конце строки удалить символ, если без /g или $
часто не мешает, если в sed-скрипте допускаются пробелы в конце строки. Например такой скрипт удаляет "пустые" строки sed -r '/^\s*$/'. В том числе и полные \r.
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Сообщение
diesel » 31.01.2012 14:25
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
Сообщение
drBatty » 31.01.2012 17:01
diesel писал(а): ↑ 31.01.2012 14:25
Имеется ввиду "\r" в средине строки(что само по себе маловероятно, но все же может случится):
я на эту тему уже сказал
drBatty писал(а): ↑ 30.01.2012 23:16
не взлетит, если \r в середине строки есть. надо 's/\r$//', или 's/\r/ /g', потому-что вообще говоря, \r это пробельный символ.