Как читать из файла или стандартного ввода в Bash? - PullRequest
210 голосов
/ 08 августа 2011

В Perl следующий код будет считываться из файла, указанного в аргументах командной строки или из стандартного ввода:

while (<>) {
   print($_);
}

Это очень удобно. Я просто хочу знать, как проще всего читать из файла или стандартного ввода в bash.

Ответы [ 14 ]

1 голос
/ 08 октября 2015

Код ${1:-/dev/stdin} просто поймет первый аргумент, так как насчет этого?

ARGS='$*'
if [ -z "$*" ]; then
  ARGS='-'
fi
eval "cat -- $ARGS" | while read line
do
   echo "$line"
done
0 голосов
/ 28 сентября 2018

Я объединил все вышеприведенные ответы и создал функцию оболочки, которая бы соответствовала моим потребностям.Это с терминала cygwin моих 2-х компьютеров с Windows10, где у меня была общая папка между ними.Мне нужно уметь справиться со следующим:

  • cat file.cpp | tx
  • tx < file.cpp
  • tx file.cpp

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

Вот, окончательный сценарий для моих нужд:

tx ()
{
  if [ $# -eq 0 ]; then
    local TMP=/tmp/tx.$(date +'%H%M%S')
    while IFS= read -r line; do
        echo "$line"
    done < /dev/stdin > $TMP
    cp $TMP //$OTHER/stargate/$(date +'%a')/
    rm -f $TMP
  else
    [ -r $1 ] && cp $1 //$OTHER/stargate/$(date +'%a')/ || echo "cannot read file"
  fi
}

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

0 голосов
/ 30 марта 2015

Следующее работает со стандартом sh (протестировано с dash на Debian) и вполне читабельно, но это дело вкуса:

if [ -n "$1" ]; then
    cat "$1"
else
    cat
fi | commands_and_transformations

Подробности: если первый параметр не пуст, то cat этот файл, в противном случае cat стандартный ввод. Затем выходные данные всего оператора if обрабатываются с помощью commands_and_transformations.

0 голосов
/ 06 сентября 2014

Как насчет

for line in `cat`; do
    something($line);
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...