Gunakan while read
loop:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Lain adalah untuk mengarahkan output dengan blokir:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Terakhir adalah membuka file:
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
Jika salah satu dari perintah membaca masukan, itu akan menjadi ide yang baik untuk menggunakan fd lain untuk input sehingga perintah tidak akan memakannya (di sini dengan asumsi ksh
, zsh
atau bash
untuk -u 3
, penggunaan <&3
bukan portable):
while IFS= read -ru 3 LINE; do
...
done 3< file
Akhirnya untuk menerima argumen, Anda dapat melakukan:
#!/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"
Yang mana bisa dijalankan sebagai:
bash script.sh file another_file
Ide ekstra. Dengan bash
, gunakan readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Catatan: IFS=
dapat dihilangkan jika Anda tidak keberatan memiliki nilai garis yang dipangkas dari spasi awal dan akhir.
<file xargs -L 1 -I{} command --option {} other args
Menjaga dengan tepat pertanyaan:
sumber
Jawaban terbaik yang saya temukan adalah:
EDIT:
... empat tahun kemudian ...
setelah beberapa suara turun dan beberapa pengalaman lagi saya akan merekomendasikan sekarang yang berikut ini
sumber
do "$cmd" "$i";
) kecuali Anda memiliki alasan untuk tidak; jika file berisi kata*
sebagai kata tersendiri, kode Anda akan berjalan$cmd *
, yang, tentu saja, akan menjalankan perintah dengan daftar file di direktori saat ini.zsh
,`cat`
sudah akan memperluas*
(tanda kutip$i
masih bisa memperluas beberapa wildcard (babak kedua) jika perluasan`cat`
memperkenalkan beberapa). Bagaimanapun, pendekatan itu memang salah.KELUARAN
sumber
Ambil semua baris file dan berikan sebagai argumen untuk satu perintah, yaitu
Jika Anda membutuhkan
--option
bendera untuk mendahului setiap baris, ubah perintah kedua menjadi:sumber
'
,"
,<
,>
,;
, dll (3) ini menciptakan sebuah file sementara yang tidak perlu. (4) Hal-hal seperti ini umumnya dilakukan dengan "dokumen di sini". (5)ed
Perintah Anda canggung; dua perintah pertama dapat dikurangi menjadi%s/^/ /
dan%j
.