GNU/Linux >> Znalost Linux >  >> Linux

Čtěte řádek po řádku v bash skriptu

xargs je nejflexibilnější řešení pro rozdělení výstupu na argumenty příkazu.

Je také velmi dobře čitelný a snadno použitelný díky jednoduché parametrizaci.

Formát je xargs -n $NUMLINES mycommand .

Například do echo každý jednotlivý řádek v souboru /tmp/tmp.txt udělali byste:

cat /tmp/tmp.txt | xargs -n 1 echo

Nebo na diff každý postupný pár souborů uvedený jako řádky v souboru s výše uvedeným názvem byste udělali:

cat /tmp/tmp.txt | xargs -n 2 diff

-n 2 pokyn xargs konzumovat a předat jako samostatné argumenty dva řádky toho, co jste do něj vložili najednou.

xargs si můžete přizpůsobit k rozdělení podle oddělovačů kromě konce řádku/nového řádku.

Použijte man xargs a google, abyste se dozvěděli více o síle tohoto všestranného nástroje.


Nejlepší způsob, jak toho dosáhnout, je přesměrovat soubor do smyčky:

# Basic idea. Keep reading for improvements.
FILE=test

while read CMD; do
    echo "$CMD"
done < "$FILE"

Přesměrování s < "$FILE" má oproti cat "$FILE" | while ... několik výhod . Vyhne se zbytečnému používání kočky a ušetří zbytečný dětský proces. Vyhne se také běžnému úskalí, kdy smyčka běží v podskořápce. V Bash jsou příkazy v | potrubí běží v podskořápkách, což znamená, že přiřazení proměnných se po skončení smyčky ztratí. Přesměrování pomocí < nemá tento problém, takže můžete použít $CMD za smyčkou nebo upravit jiné proměnné uvnitř smyčky. Také se opět vyhne zbytečným podřízeným procesům.

Je možné provést některá další vylepšení:

  • Přidejte IFS= takže read neořízne úvodní a koncové mezery z každého řádku.
  • Přidejte -r na read aby se zabránilo interpretaci zpětných lomítek jako únikových sekvencí.
  • malá písmena CMD a FILE . Bashova konvence je, že pouze proměnné prostředí a vnitřního prostředí jsou velká písmena.
  • Použijte printf místo echo což je bezpečnější, pokud $cmd je řetězec jako -n , což je echo bude interpretováno jako vlajka.
file=test

while IFS= read -r cmd; do
    printf '%s\n' "$cmd"
done < "$file"

To, co máte, je text "cat test" do smyčky.

Vy jen chcete:

cat test | \
while read CMD; do
    echo $CMD
done

Linux
  1. Jak zopakovat nový řádek ve skriptech Bash Shell

  2. Bash Script - Jak číst uživatelský vstup

  3. Linux bash:Přiřazení více proměnných

  1. Je možné, aby skript bash shell interagoval s jiným programem příkazového řádku?

  2. spuštění php skriptu (funkce php) v linux bash

  3. Simulace stisknutí klávesy ENTER ve skriptu bash

  1. Předat argumenty příkazového řádku skriptu Bash?

  2. Tiskový výstup příkazu cat ve smyčce skriptu bash

  3. Co dělá tento bash skript? [Pokus o hackování]