Помогите новичку с expr

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
MapwpyTka
проходил мимо

Помогите новичку с expr

Непрочитанное сообщение MapwpyTka » 2007-11-14 18:19:17

Доброе время суток:)
У меня простая ситуация, но мне в ней не разобраться:(
При запуске скрипта следующего содержания:
#!/bin/bash
a=1234zipper43231
b=`expr substr $a 2 6`
echo "substring in string \"$a\", from position 2,\ and length by 6 symbols: \"$b\"."

появляется сообщение об ошибке
expr: syntax error

В чём может быть причина? Каких-либо синтаксических ошибок не вижу :?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Помогите новичку с expr

Непрочитанное сообщение Alex Keda » 2007-11-14 19:51:21

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

ussr$ man expr
EXPR(1)               Справочник основных команд FreeBSD               EXPR(1)

НАЗВАНИЕ
     expr -- вычислить выражение

СИНТАКСИС
     expr [-e] выражение

ОПИСАНИЕ
     Утилита expr вычисляет выражение и пишет результат в стандартный вывод.

     Все операторы и операнды должны передаваться, как отдельные аргументы.
     Некоторые операторы имеют специальное значение для командных интерпрета-
     торов и, следовательно, должны заключаться в кавычки.  Все целочисленные
     операнды интерпретируются как числа с основанием 10.

     Арифметические операции выполняются, используя целочисленную знаковую
     математику.  Если указан флаг -e, арифметика использует тип данных
     intmax_t языка C (самый большой целочисленный тип данных), и expr сможет
     обнаружить арифметическое переполнение и вернуть индикатор ошибки.  Если
     указан числовой операнд, являющийся настолько большим, что происходит
     переполнение при конвертации его в целое число, то он обрабатывается как
     строка.  Если флаг -e не указан, то переполнение в результате арифметиче-
     ских вычислений и синтаксического разбора целочисленных аргументов будет
     происходить без диагностики и в соответствии с правилами стандарта языка
     C, используя тип данных long.

     Операторы перечислены ниже в порядке увеличения приоритета.  Все они
     вычисляются слева направо.  Операторы с одинаковым приоритетом сгруппиро-
     ваны внутри символов `{' и `}'.

     выражение1 | выражение2
             Вернуть вычисленное значение выражения выражение1, если оно не
             является ни пустой строкой, ни нулем.  Иначе возвращается значе-
             ние выражение2.

     выражение1 & выражение2
             Вернуть значение выражения выражение1, если ни одно из выражений
             при вычислении не становится равным пустой строке или нулю.  В
             противном случае, возвращается ноль.

     выражение1 {=, >, >=, <, <=, !=} выражение2
             Вернуть результаты целочисленного сравнения, если оба аргумента
             являются целыми числами.  В противном случае возвращает резуль-
             таты сравнения строк, используя зависящую от региональных
             настроек последовательность сравнения.  Результат каждого сравне-
             ния равен 1, если указанное соотношение справедливо, или 0, если
             соотношение ложно.

     выражение1 {+, -} выражение2
             Вернуть результаты сложения или вычитания целочисленных аргумен-
             тов.

     выражение1 {*, /, %} выражение2
             Вернуть результаты умножения, целочисленного деления, или остатка
             от деления целочисленных аргументов.

     выражение1 : выражение2
             Оператор ``:'' сопоставляет выражение1 с выражение2, которое
             должно быть базовым регулярным выражением.  Регулярное выражение
             привязывается к началу строки подразумевающимся ``^''.

             Если сопоставление проходит удачно и шаблон содержит по крайней
             мере одно подвыражение ``\(...\)'' регулярного выражения, то воз-
             вращается строка, соответствующая ``\1''.  В противном случае
             оператор сопоставления возвращает количество соответствующих
             шаблону символов.  Если сопоставление завершается неудачно и
             шаблон содержит подвыражение регулярного выражения, то возвраща-
             ется пустая строка.  В противном случае возвращается 0.

     Круглые скобки используются для группирования в привычной манере.

     Утилита expr не делает лексического различия между аргументами, которые
     могут быть операторами и аргументами, которые могут являться операндами.
     Операнд, лексически идентичный оператору будет рассматриваться, как син-
     таксическая ошибка.  Смотрите примеры ниже для обходного пути.

     Синтаксис команды expr в общем является исторически сложившимся и неудоб-
     ным.  В новых приложениях вместо expr рекомендуется использовать арифме-
     тику командного интерпретатора.

   Совместимость с предыдущими реализациями
     Если не включена совместимость с FreeBSD 4.x, эта версия expr придержива-
     ется указаний к синтаксису утилит, определенных в POSIX, которые требуют,
     чтобы ведущий аргумент, начинающийся со знака минус рассматривался, как
     опция к программе.  Стандартная синтаксическая структура -- может быть
     использована для предотвращения такой обработки.  Тем не менее, многие из
     ранних версий expr, включая ту, что была в предыдущих версиях FreeBSD, не
     разрешали использовать данный синтаксис.  Смотрите ниже примеры переноси-
     мых способов для гарантирования корректной интерпретации.  Чтобы опреде-
     лить, должен ли быть активирован режим совместимости, используется функ-
     ция check_utility_compat(3) (где в качестве аргумента utility использу-
     ется ``expr'').  Эта возможность предназначена для использования в каче-
     стве вспомогательного средства при переносе и отладке, когда expr исполь-
     зуется в сложных сценариях, которые не могут быть легко переделаны так,
     чтобы избежать использования непереносимых конструкций.  Включение режима
     совместимости также косвенно активирует опцию -e, так как это соответ-
     ствует историческому поведению expr во FreeBSD.  По историческим причи-
     нам, установка переменной окружения EXPR_COMPAT также включает режим сов-
     местимости.

ОКРУЖЕНИЕ
     EXPR_COMPAT  Если переменная определена, включить режим совместимости.

СТАТУС ЗАВЕРШЕНИЯ
     Утилита expr завершается с одним из следующих статусов:
     0       Выражение не является ни пустой строкой, ни нулем.
     1       Выражение является пустой строкой или нулем.
     2       Выражение некорректно.

ПРИМЕРЫ
     ·   В следующем примере (используется синтаксис sh(1)) добавляется еди-
         ница к переменной a:
               a=$(expr $a + 1)

     ·   Эта команда не выполнится, если значение a является отрицательным
         числом.  Чтобы предотвратить обработку отрицательных значений a в
         качестве опций команде expr можно преобразовать выражение так:
               a=$(expr 1 + $a)

     ·   В общем случае, заключайте в скобки возможные отрицательные значения:
               a=$(expr \( $a \) + 1)

     ·   В этом примере выводится имя файла, вычлененного из пути, хранящегося
         в переменной a.  Так как a может содержать путь /, то необходимо
         предотвратить его обработку в качестве оператора деления.  Пара сим-
         волов // разрешает эту неоднозначность.
               expr "//$a" : '.*/\(.*\)'

     В следующих примерах выводится количество символов в переменной a.  И
     снова, если a может начинаться с дефиса, то необходимо предотвратить его
     обработку в качестве опции к expr.

     ·   Если команда expr удовлетворяет стандарту IEEE Std 1003.1-2001
         (``POSIX.1''), то сделать это просто:
               expr -- "$a" : ".*"

     ·   Для переносимости на более старые системы требуется более сложная
         команда:
               expr \( "X$a" : ".*" \) - 1

СМОТРИ ТАКЖЕ
     sh(1), test(1), check_utility_compat(3)

СТАНДАРТЫ
     Утилита expr соответствует стандарту IEEE Std 1003.1-2001 (``POSIX.1''),
     если не активирован режим совместимости.  Флаг -e является расширением
     стандарта.

FreeBSD 6.2                      12 июля 2004                      FreeBSD 6.2
Убей их всех! Бог потом рассортирует...

Гость
проходил мимо

Re: Помогите новичку с expr

Непрочитанное сообщение Гость » 2007-11-15 0:32:29

substr есть в awk'е
awk(1) писал(а): substr(s, m, n)
the n-character substring of s that begins at position m counted
from 1.

MapwpyTka
проходил мимо

Re: Помогите новичку с expr

Непрочитанное сообщение MapwpyTka » 2007-11-15 14:03:24

Спасибо, но хелп уже просмотрен вдоль и поперёк:)
Найдено следующее решение
mm1=${string:4:2}