Bourne shell: игнорирование определенных типов stdin

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

Прямо сейчас, чтобы запустить программу: printf "1 \ n3 \ n5 \ n" | sh prog

В настоящее время программа игнорирует нецелый ввод (например, float), но мне также нужно игнорировать что-то вроде «4 10» на одной строке и «5 текста» и т. Д.

#! /bin/sh sum=0; cnt=0 while read line do case "$line" in *[.]* ) #------I think here is where the regex needs to be edited printf "\n0" continue ;; [0-9]* ) sum=`expr "$sum" + "$line"` cnt=`expr "$cnt" + 1` printf "\n%s" `expr $sum / $cnt` ;; esac done 

Я почти уверен, что это всего лишь вопрос об изменении регулярного выражения в строке, на которую я указал, чтобы она переходила к выводу 0 и продолжалась с двумя нежелательными типами ввода, описанными выше, но у меня возникают проблемы с этим.

Спасибо!

One Solution collect form web for “Bourne shell: игнорирование определенных типов stdin”

Ты можешь сделать…

 while read line do line=${line%%[!0-9]*} [ -n "$line" ] || continue : work w/ digits at line's head done 

Альтернативно – и, возможно, быстрее – вы можете сделать:

 tr -cs 0-9\\n \ | while IFS=\ read num na do ${num:+":"} continue : work w/ first seq of digits on line done 

Или если вы хотите полностью игнорировать любую строку, содержащую ничего, кроме пробелов, вкладок или чисел, или даже любую строку, содержащую два элемента, разделенных пробелом …

 b=${IFS%?} grep "^[$b]*[0-9]\{1,\}[$b]*$" | while read num; do : stuff with "$num"; done 

В case вы можете сделать это так:

 while read num do case ${num:--} in *[!0-9]*) continue;;esac : something w/ $num done 
  • Присоединитесь к интерактивному сеансу процесса, запущенного из rc.local
  • что подразумевается под подключением STDOUT и STDIN?
  • Как перенаправление файлов bash на стандарт отличается от shell (`sh`) в Linux?
  • Почему cc (компилятор C) и подобные утилиты по умолчанию не используют стандартные потоки?
  • Как я могу подключить путь к pushd?
  • Декодирование «prog> file 2> & 1"
  • Определите, когда скрипт python ожидает ввода вручную
  • Как программы с программным обеспечением с оболочкой уравновешивают скорость вывода / ввода?
  • Ввод трубы в нано
  • Кошка никогда не читает с терминала?
  • Как использовать stdin с тройником или другими типами труб или перенаправление выходов?
  • Linux и Unix - лучшая ОС в мире.