Sử dụng while read
vòng lặp:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Một cách khác là chuyển hướng đầu ra theo khối:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Cuối cùng là mở tệp:
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
Nếu một trong các lệnh đọc đầu vào, đó là một ý tưởng tốt để sử dụng một fd khác cho đầu vào để các lệnh sẽ không ăn nó (ở đây giả sử ksh
, zsh
hoặc bash
cho -u 3
, sử dụng <&3
thay vì có thể di chuyển):
while IFS= read -ru 3 LINE; do
...
done 3< file
Cuối cùng để chấp nhận đối số, bạn có thể làm:
#!/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"
Cái nào có thể chạy như:
bash script.sh file another_file
Thêm ý tưởng. Với bash
, sử dụng readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Lưu ý: IFS=
có thể được bỏ qua nếu bạn không nhớ có các giá trị dòng được cắt bớt các khoảng trắng ở đầu và cuối.
<file xargs -L 1 -I{} command --option {} other args