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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Команда bash не выполняется в shell. Чем заменить?  (Прочитано 4654 раз)

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

Оффлайн assistent

  • Автор темы
  • Активист
  • *
  • Сообщений: 682
    • Просмотр профиля
    • Caйт плеера foobnix
Имеется фрагмент кода в bash-скрипте:
IFC=`ifconfig | grep eth`
echo ${IFC:0:4}
т.е. выдираются первые четыре символа из вывода предыдущей команды

Так вот, этот скрипт корректно выполняется в bash, но если выполнить его в shell, тот не может понять выражение ${IFC:0:4}, выдает ошибку Bad substitution
Подскажите, как записать в shell, чтобы получить тот же эффект, что и в bash
« Последнее редактирование: 15 Июня 2010, 08:41:16 от Владимир Николаевич »
Foobnix - наше всё.

Axa-Ru

  • Гость
Не знаю, поможет-ли?

expr substr 01234567890 3 5

А вот это должно помочь:

$ IFC=`ifconfig | grep eth`
$ echo "${IFC:0:4}"
« Последнее редактирование: 13 Июня 2010, 13:13:25 от Axa-Ru »

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
не выполняется в shell
Не знаю такого интерпретатора. Знаю sh,  ash, dash, bash, zsh и т.д. Конкретнее пожалуйста, что за интерпретатор используется?

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
ТС, вам нужен mac или ip?

Оффлайн Мангуст

  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
IFC=`ifconfig | grep eth`
echo $IFC | cut -с1-4

Это не "чистый" шелл, конечно, но на наличие cut всегда можно расчитывать, хотя (по крайней мере пока) работает только с байтами (т.е. применимо только к ASCII).

===

Хотя cut нету в /bin, expr тоже, а sed есть (чем, интересно руководствуются?). Тогда так

ifconfig | sed -ne '/^eth/s/^\(....\).*/\1/p'
В принципе вроде работает, позволяет два дела сразу сделать, и заодно выловит все интерфейсы с eth, а не только первый. (Да, awk тоже нет в /bin)
« Последнее редактирование: 13 Июня 2010, 20:09:12 от Мангуст »

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Первые 4 символа это как раз "etc0", так что думаю автору просто необходимо узнать число в имени интерфейса. Вот вам средствами awk:
ifconfig | grep eth | awk '{print $1}'
На выходе как раз будет то что вам нужно.
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
думаю автору просто необходимо узнать число в имени интерфейса
Ну, если так, тогда...
ifconfig | awk '/eth/{print $1}'

Оффлайн assistent

  • Автор темы
  • Активист
  • *
  • Сообщений: 682
    • Просмотр профиля
    • Caйт плеера foobnix
Спасибо всем за попытку помочь. Я конечно понимаю, что проблемы как таковой нет, если использовать такие инструменты, как sed или awk, но хотелось бы узнать, как можно решить вопрос средствами самого sh (мне это нужно для изучения особенностей интерпретатора, а не для решения конкретной прикладной задачи). Наверняка такое решение есть, не верится, что sh не может такой простой вещи, с которой запросто справляется его младший собрат.

To Axa-Ru: вариант взятия в кавычки $ echo "${IFC:0:4}" не прокатил.
« Последнее редактирование: 13 Июня 2010, 22:10:01 от assistent »
Foobnix - наше всё.

Axa-Ru

  • Гость
Тогда актуален вопрос - какой шелл?
Какая ошибка?

Потому как у меня все прокатывает.
« Последнее редактирование: 14 Июня 2010, 00:05:27 от Axa-Ru »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Тогда актуален вопрос - какой шелл?
+1

arcfi@arcfi-laptop:~$ bash
arcfi@arcfi-laptop:~$ IFC=`ifconfig | grep eth` ; echo ${IFC:0:4}
eth0
arcfi@arcfi-laptop:~$ exit
arcfi@arcfi-laptop:~$ sh
$ IFC=`ifconfig | grep eth` ; echo ${IFC:0:4}
sh: Bad substitution
$

ps
(Нажмите, чтобы показать/скрыть)

Оффлайн Мангуст

  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Если для того, чтобы изучать shell программирование, то точно надо понять какие shell есть. Есть bash, zsh, ksh, dash, ash из busybox, ash из BSD-шних систем, sh из Соляриса (С-shells - csh и tcsh во внимание не берем, как и wish, rc и другие экзотические шелл). Все эти оболочки являются клонами первой юниксовской шелл, которая называлась просто sh и была написана Стивеном Борном, поэтому их называют производными bourne shell.

Под shell программированием понимают или переносимое, или программирование POSIX shell. Первое подразумевает под собой написание кода, которое будет выполняться в любой bourne shell. Это довольно сложное дело, к примеру нельзя пользоваться [  (а уж тем более [[ ) в if, только test. Есть очень хорошая книга, можно найти в Инете, - Beginning portable shell programming. Несмотря на название, книга точно не для новичков.

Posix shell - эта оболочка, которая описана в стандарте POSIX. Современные реализации ash (в свое время просто переписанной bourne shell с открытым кодом), как правило, включают в себя возможности, описанные в POSIX. dash - это специально для Дебиана переписанная ash с целью наиболее точного соответствия POSIX. По сравнению с bash, zsh, ksh - она очень ограниченна - можно, к примеру, использовать ((1+1)) и $(some_command), но не [[ test ]] или массивы, и еще огромного количества возможностей, в том числе и строковых функций на переменных, включая ${var:0:4}.

Так заканчиваю. В переносимой или POSIX шелл, поставленную задачу, выполнить, как минимум очень сложно. Навскидку - при переносимом программировании - нельзя, а в POSIX - уродливо. Но шелл программирование - это прежде всего использование командных утилит. С самого начала шелл разрабатывалась для клея - склеивания разных комманд между собой. Нельзя "научиться shell", не зная и не умея применять как простые утилитки, так и "столпы" - find, grep, sed (awk по вкусу, я perl предпочитаю).

Axa-Ru

  • Гость
Дай команду
echo $0Что на выходе?
« Последнее редактирование: 14 Июня 2010, 08:11:44 от Axa-Ru »

Оффлайн Мангуст

  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Дай команду
echo $0Что на выходе?

Что даст? Если речь идет о программировании, то скорее всего о скрипте, в котором, как и "учили" записано первой строчкой
#!/bin/sh
По умолчанию в Ubuntu sh - это символическая ссылка на /bin/dash, который не понимает ${var:x:у} (это, кажется, расширение Корн шелл - ksh, которое потом заимствовали bash и zsh).

Axa-Ru

  • Гость
Не фантазируйте. Набрать команду в консоли и посмотреть быстрее чем писать пост.

А вообще команда возвращает имя запущенного процесса.

Если эта команда дается из шелла, то возвращается имя шелла.

[off]
Мой знакомый (зовут его Саша) преподавал математику в Горном институте и работал вместе с академиком Арбатовым, тем, что развил теорию графов.
Однажды они читают кандитатские диссертации и Арбатов говорит, перелистывая страницу.
- Любопытно, он наверно скоро кого то убъет.
Проходит 2 месяца и недоделанный кандидат режет свою жену.
Саша спрашивает у Арбатова - "Как вы угадали?"
- Вы знаете шизофреники отличаются от нормальных людей тем, что у них с логикой все в порядке. Но первый посыл - ошибочный.
[/off]
« Последнее редактирование: 14 Июня 2010, 11:49:22 от Axa-Ru »

Оффлайн Мангуст

  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
sh
И дальше что? Определить в какой реально оболочке вы находитесь в *nix сложнее. Обязательно надо смотреть
ls -l /bin/shМожно пробовать (для современных оболочек):
set | grep _VERSIONА универсального способа нет.

Пользователь решил продолжить мысль 14 Июня 2010, 11:51:53:
Мда...  :(
« Последнее редактирование: 14 Июня 2010, 11:51:53 от Мангуст »

 

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