Chci napsat skript, který přebírá .txt
název_souboru jako argument, přečte soubor řádek po řádku a předá každý řádek příkazu. Například spustí command --option "LINE 1"
a poté command --option "LINE 2"
, atd. Výstup příkazu je zapsán do jiného souboru. Jak to mám udělat? Nevím, kde začít.
Přijatá odpověď:
Použijte while read
smyčka:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Dalším je přesměrování výstupu po bloku:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Poslední je otevřít soubor:
exec 4> another_file
while IFS= read -r LINE; do
command --option "$LINE" >&4
echo xyz ## Another optional command that sends output to stdout.
done < file
Pokud jeden z příkazů čte vstup, bylo by dobré použít pro vstup jiný fd, aby jej příkazy nesežraly (zde za předpokladu ksh
, zsh
nebo bash
pro -u 3
, použijte <&3
místo toho přenosně):
while IFS= read -ru 3 LINE; do
...
done 3< file
Nakonec můžete přijmout argumenty:
#!/bin/bash
FILE=$1
ANOTHER_FILE=$2
exec 4> "$ANOTHER_FILE"
while IFS= read -ru 3 LINE; do
command --option "$LINE" >&4
done 3< "$FILE"
Který by mohl běžet jako:
bash script.sh file another_file
Nápad navíc. S bash
, použijte readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Poznámka:IFS=
lze vynechat, pokud vám nevadí, že hodnoty řádků budou oříznuty o mezery na začátku a na konci.