LINUX.ORG.RU

[bash] postcondition

 


0

1

Существует ли subj или его элегантные замены? Есть код

#!/bin/bash

ORD=1
STEP=50
OUT="nonempty"

while [ -n "$OUT" ];
do
    OUT=$(umph -q -s $ORD -m $STEP $1 2>/dev/null | sed 's/&.*$//')
    if [ -n "$OUT" ]; then echo "$OUT"; fi
    ORD=$((ORD+STEP))
done
Хочется написать это красивее без костылей в 5 и 10 строках. Любая конструктивная критика также приветствуется.

нет вроде-бы... только

       while list; do list; done
       until list; do list; done
              The while command continuously executes the do list as long as the last command in list returns  an
              exit  status of zero.  The until command is identical to the while command, except that the test is
              negated; the do list is executed as long as the last command in list returns a non-zero  exit  sta‐
              tus.   The  exit status of the while and until commands is the exit status of the last do list com‐
              mand executed, or zero if none was executed.

в вашем случае можно свернуть grep && sed в одну команду, и её-же использользовать для вывода. (или, если у вас не только echo, то sed умеет возвращать код завершения q77 вернёт 77, потому допустимо её использовать вместо grep -q)

drBatty ★★
()

притворюсь, что понял, о чём речь… ;)

#!/bin/bash

ORD=1
STEP=50

while true; do
    OUT=$(umph -q -s $ORD -m $STEP $1 2>/dev/null | sed 's/&.*$//')
    test -n "$OUT" && echo "$OUT" || break
    ORD=$((ORD+STEP))
done
arsi ★★★★★
()
Ответ на: комментарий от arsi

Спасибо, стало красивее. )

Извиняюсь, наверное надо было добавить описание общего ход работы скрипта с umph. umph возвращает подмножество(ключ -m) из списка строк, если в ключе -s правильный ординал(не out of bounds); иначе ругается в stderr. Скрипт считывает эти подмножества постояно сдвигая ординал, пока не «упрется» в эту самую «ругань». Хотелось чего-то а-ля паскалевский until. Ну или goto/JMP. )

HiddenComplexity
() автор топика

вещества

#!/bin/bash

STEP=50
out()
{
    umph -q -s $1 -m $STEP $2 2>/dev/null | egrep -v '&.*' || exit
    out $(($1+$STEP)) $2
}

out 1 $1 

попробуй так

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

в вашем случае можно свернуть grep && sed в одну команду, и её-же использользовать для вывода.

А можно поподробнее как это сделать? Пробовал добавлять в sed `;/^$/d', но дело не в пустых строках, а в том что в последней итерации while в echo передается пустая строка(как бы условие выхода из цикла). А как вывести в stdout и записать в переменную «одной строкой» я вообще без понятия. :(

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

> Хотелось чего-то а-ля паскалевский until.

http://www.linuxquestions.org/questions/programming-9/bash-do-while-post-test-syntax-738352/

> иначе ругается в stderr.

а какой код возврата в случае ошибки? если ненулевой, тогда ещё можно упростить…

arsi ★★★★★
()
Ответ на: опечатался от lazyklimm

Тоже думал: «неплохо бы рекурсию здесь использовать, но вроде с bash дело имеем: тут так никто не делает». )

Пока желаемый вывод не получен; ищу в чем проблема.

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

>тут так никто не делает

делают, некоторые вещи без рекурсии либо никак либо очень сложно

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

>«||» сработает на «egrep», а не на «umph», как хотелось бы.

в данном случае пофиг, тем более я не знал, что umph еще что-то возвращеает

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

Вроде всё хорошо, только иногда выходит не пройдя все итерации. Вполне возможно вина umph или youtube. Буду искать в чем проблема. ) Решение очень удобное, спасибо.

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

>иногда выходит не пройдя все итерации

видимо код возврата 1 не всегда соответствует невалидному с твоей точки зрения случаю

lazyklimm ★★★★★
()

Взять любимый НАСТОЯЩИЙ скриптовый язык

anonymous
()
Ответ на: комментарий от arsi

( umph -q -s $1 -m $STEP $2 2>/dev/null || exit ) | egrep -v '&.*$'

«||» сработает на «egrep», а не на «umph», как хотелось бы.

а так?

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