Saya ingin menulis skrip yang menggunakan .txt
nama file sebagai argumen, membaca file baris demi baris, dan meneruskan setiap baris ke perintah. Misalnya, menjalankan command --option "LINE 1"
, lalu command --option "LINE 2"
, dll. Output dari perintah ditulis ke file lain. Bagaimana cara saya melakukannya? Saya tidak tahu harus mulai dari mana.
Jawaban yang Diterima:
Gunakan while read
lingkaran:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Cara lainnya adalah mengarahkan ulang output per blok:
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 perintah membaca input, sebaiknya gunakan fd lain untuk input sehingga perintah tidak akan memakannya (di sini dengan asumsi ksh
, zsh
atau bash
untuk -u 3
, gunakan <&3
bukannya portabel):
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"
Mana yang 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 nilai garis dipangkas dari spasi awal dan akhir.