LINUX.ORG.RU

Ответ на: комментарий от vodz

я хотел именно одним действием что бы было.

мне нужно чтото типа

gcc${_pkgver:0:3}

и
gcc${_pkgver/./}

в одном флаконе

safocl ★★
() автор топика
Ответ на: комментарий от safocl

я хотел именно одним действием что бы было.

Ну мало ли чего вы хотите. Сделайте функцией:

pkgver=4.3.3

major_minor() { local ver; ver=${1%.*}; echo "${ver%.*}${ver#*.}"; }
echo gcc$(major_minor $pkgver)

gcc43

vodz ★★★★★
()
Ответ на: комментарий от safocl

тем, кто в баше пытается всё сделать «одним действием», коллеги потом отрывают руки

vodz всё очень правильно написал

alpha ★★★★★
()
Ответ на: комментарий от safocl

я понял больше никак не сделать

Зря. Костылей всегда можно нагородить бессчетное множество.

Но главное — нормальный-то способ так никто не привел!

$ ver='4.3.3'
$ IFS='.' read major minor patch <<< "$ver"
$ echo "$major.$minor"
4.3
Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от safocl

а в функции разве правильно вместо return писать echo?

Нет. Равно как неправильно вместо echo писать return. Между ними нет вообще ничего общего.

А насколько разумно возвращать что-то из функции через стандартный вывод, что требует вызова ее в подоболочке — то вопрос иной. Здесь определенно неразумно.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Но главное — нормальный-то способ так никто не привел!

Ваш вариант гораздо затратнее при формировании как раз через return.

Здесь определенно неразумно.

Бгг. Не разумно хотеть получать одним действием не в виде переменной во многих местах. Если завести переменную, то ясен пень, return был бы лучше.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Ваш вариант гораздо затратнее при формировании как раз через return.

?

Не разумно хотеть получать одним действием не в виде переменной во многих местах.

А это вообще не распарсил.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Ну так не спешили бы отвечать, а парсили...

Если сделать переменную gcc_ver и получать через мою функцию major_minor, то лучше всего сделать через return. Тогда будет работать только bash, в отличии от echo/read, то есть через систему: fork+write+read, что по определению многокрактно затратнее.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Ну так не спешили бы отвечать, а парсили...

А вы не спешили бы отправлять, а перечитали, что́ написали.

Если сделать переменную gcc_ver и получать через мою функцию major_minor, то лучше всего сделать через return.

Поподробнее, пожалуйста.

в отличии от echo/read, то есть через систему: fork+write+read

А вот здесь максимально подробно, будьте добры.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)

Так как с массивом еще не предлагали:

pkgver=4.3.3
pkgver=(${pkgver//./ })
echo "${pkgver[0]}${pkgver[1]}"

RiD
()
Ответ на: комментарий от Zmicier

Поподробнее, пожалуйста.

Да вы издеваетесь?!

ТСу хочется сделать аргументы в командах скрипта: cmd gcc${pkgver\что-то} ...

Вряд ли это возможно сделать online-преобразование. Потому, если уж делать дополнительные телодвижения в скрипте, то наиболее оптимально делать самими средствами интерпретатора, без насилование системы новым процессом и вводом-выводом. Конкретно для моего скрипта это преобразуется в:

pkgver=4.3.3

major_minor() { local ver; ver=${1%.*}; return "${ver%.*}${ver#*.}"; }
major_minor $pkgver
gcc_ver=$?
Далее уже юзать как

echo $gcc_ver

gcc43

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Да вы издеваетесь?!

Нет.

Вряд ли это возможно сделать online-преобразование.

Не распарсил.

оптимально делать самими средствами интерпретатора, без насилование системы новым процессом и вводом-выводом

Безусловно. Тогда как вы зачем-то предложили обратное, то есть «насиловать».

return "${ver%.*}${ver#*.}"

Ну надо же! Не верил, что вы держите на уме эту глупость.

$ major_minor "4.10.0"
$ echo $?
154
Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Не распарсил.

inline

предложили обратное,

Первый вариант? Это специально для удовлетворения ТЗ - получать значение внутри вызова команды скрипта.

Ну надо же!

Есть такая проблема. Но тут вообще не понятно, что должно быть. Собственно точки эту проблему и решают, когда 5.0 больше, чем 4.10.

vodz ★★★★★
()
Ответ на: В топку echo! от RiD

В топку echo!

Не, с массивом было лучше. Не надо fork+IO для использования полученного результата. Ведь вывод - это только тест, а не основная задача.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Я преследовал цель изловчиться написать в одну строчку без злоупотреблений с ';', с самого начала не покидало ощущение, что printf справится, но хак с '%.0s' пришел на ум только сейчас.)

RiD
()
Ответ на: В топку echo! от RiD

вот ентот вариант думаю лучшее решение...

safocl ★★
() автор топика
Ответ на: комментарий от RiD

у printf есть волшебная -v опция.

1) Однострочник cломается, так как появляется отдельная строка записи в переменную. Но тогда и через массив получится и понятнее и скорее всего оптимальнее

2) Это уже, ясен пень, может быть только в виде встроенного волшебства. Вон, в соседней теме %q у человека не нашлось...

vodz ★★★★★
()
Ответ на: комментарий от safocl

и проблема с двухзначными числами осталась

Так это вам и надо менять условие задачи, прежде чем ответа ждать, ибо проблема в самой задаче, когда 4.10 (410) > 5.0 (50)

vodz ★★★★★
()
Ответ на: комментарий от vodz

сама задача енто убрать последнее значение и убрать все точки...

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от safocl

похоже чо самое простое решение

Афигеть. Постыдились бы вердикт выносить, раз сами не знаете. Спросить сначала не пробовали? Где же оно самое простое? Да awk по размеру, тормознутости и потребляемым ресурсам сравним с sh-ами. А у вас уже и так работает скрипт на sh-е.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Спросить сначала не пробовали? Где же оно самое простое?

ну а у кого мне спросить чо для меня кажется самым простым, если не у самого себя?

енто решение как я понял не осуществимо одной командой средствами sh/bash, по ентому и делаю разумный вывод чо с awk самое действенное и простое решение, при чем оно отлично реагирует на многозначные числа.

я изначально предполагал, что возможное решение есть в варианте модернизации ${pkgver/.*.}, тут выводятся первое и последнее значение между точками, я не смог найти ответа что бы отобразить первое и второе значения.

safocl ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.