LINUX.ORG.RU

Мети дворы.

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

Нет, какраз самый правильный вариант. Ибо есди через пайп — цикл будет запущен в сабшелле и могут возникнуть лулзы

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

Я полагаю, ТСу не просто надо вывести «1» для каждого *.err файла содержащего CSQ. Какое-либо использование переменных из цикла за его пределами может сделать лулзы.

Вот например: https://ideone.com/8LV8ew

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

Просто у вас ним один поставщик.

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

Мы все оценили насколько ты крут

Эх вот этот славянский обычай асоциировать человека (и себя) с тем, что он делает и обижаться за критику своих дел.

но суслика тут нет.

Там же ясно написано

нужно распарсить кучу файлов по маске,

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

Там же ясно написано

Там ясно написано, что все операции находятся внутри цикла. Нет там переменных за пределами цикла. Поэтому говорить о том, что делать через пайп нельзя, так как потом ТС начнёт добавлять переменные и использовать их после цикла, неверно в корне. В данном конкретном случае всё прекрасно работает, и никаких «лулзов» ТС не получит. Всё остальное - это попытка на пустом месте показать свои знания, и обозвать всех дураками.

Если смотреть дальше, то код с грепом будет более читабельный, так как операция задаётся в начале, и не нужно будет пролистывать код до конца, чтоб понять что же там грепается.

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

Там ясно написано, что все операции находятся внутри цикла.

Врать и выкручиваться не надо. Нет «там» такой ясности. Если, конечно, вы не псевдоним wolverin.

Если смотреть дальше, то код с грепом будет более читабельный

Возможно. Иначе было б предложено:

for f in *.err; do
  while read -r l; do if [[ "$l" =~ "CSQ" ]]; then echo "$f: $l"; fi; done < "$f"
done

Но если действительно это кусок кода, то скрипт продолжится далее и потому может пригодиться значения переменных после цикла. И предыдущий скрипт может легко расширен до более сложных условий задачи, чем grep благодаря программированию.

А если ещё во встроенной системе, где нет bash, а есть ash, то тоже самое с grep на самом деле правильнее писать так:

while read -r LINE
do
    echo "$LINE"
done << EOF
$(grep CSQ *.err)
EOF

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

Писать на C++.

Зачем, если всё там только будет на C и скриптах? А скрипты тем и хороши, что могут быть самогенерирующиеся от конфига, заданного пользователем.

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

ого, просвятили )

KennyMinigun

да мне просто кучу файлов отпарсить надо, создав sql запрос, который за циклом просто выполняю, но по вашему совету на всякий случай поменяю на православный вариант )

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

На самом деле код

command1 |
  while read line; do
    command2;
  done
значительно проще читать. Если бы не невидимость переменных шелла внутри цикла снаружи я лично всем бы советовал так писать.

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

Без спецолимпиады аесли нельзя же. «АЕСЛИ этот код будут запускать на pdp11 блока управления межзвёздного зонда? А???»

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

Там написано: «пробую». Смысл скрипта, печатающего единицы?

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