Pytanie Napisz skrypt bash, który czyta z potoku


Chciałbym zrobić coś takiego:

cat file.txt | ./myscript.sh

plik.txt

http://google.com
http://amazon.com
...

Jak mogę odczytać dane w myscript.sh?


10
2018-02-11 12:32


pochodzenie




Odpowiedzi:


Możesz to zrobić za pomocą while loop (przetwarzaj linia po linii), jest to zwykły sposób na tego typu rzeczy:

#!/bin/bash

while read a; do
    # something with "$a"
done

Aby uzyskać więcej informacji, zobacz http://mywiki.wooledge.org/BashFAQ/001


Jeśli zamiast tego chcesz slurp cały plik w zmiennej, spróbuj to zrobić:

#!/bin/bash

var="$(cat)"
echo "$var"

lub

#!/bin/bash

var="$(</dev/stdin)"
echo "$var"

10
2018-02-11 12:37



Jeśli twój skrypt zawiera po prostu fragment potoku, np. Polecenie sed można (po określeniu interpretera #!/bin/bash) po prostu cat to: cat|sed 's/abc/def/g' - valid


Możesz oszukać read do akceptowania z takiej rury:

echo "hello world" | { read test; echo test=$test; }

lub nawet napisać taką funkcję:

read_from_pipe() { read "$@" <&0; }

2
2018-02-11 12:36



To nie jest "oszukiwanie" read. Problem nie polega na czytaniu z potoku, tylko na zmiennej read zestawy znajdują się w podpowłoce, która znika po zakończeniu instalacji. - chepner


Możesz użyć czegoś takiego:

while read line; do
  echo $line;
done

Czytaj dalej tutaj: Skrypt Bash, odczytaj wartości ze stdin pipe


2
2018-02-11 12:37



Nie ma potrzeby < file - Gilles Quenot
Dzięki, masz rację. Poprawiłem to. - ConcurrentHashMap