[英]Read line by line in bash script
我想要執行以下操作,逐行讀取文件並使用每行的值作為參數
FILE="cat test"
echo "$FILE" | \
while read CMD; do
echo $CMD
done
但當我做echo $ CMD時,它只返回cat:S
FILE=test
while read CMD; do
echo "$CMD"
done < "$FILE"
使用< "$FILE"
重定向比cat "$FILE" | while ...
具有一些優勢 cat "$FILE" | while ...
它避免了無用的貓 ,節省了不必要的子進程。 它還避免了循環在子shell中運行的常見缺陷。 在bash中,命令在|
管道在子殼中運行,這意味着在循環結束后變量分配將丟失。 使用<
重定向沒有那個問題,所以你可以在循環后使用$CMD
或修改循環內的其他變量。 它還可以避免不必要的子進程。
可以進行一些額外的改進:
IFS=
以便read
不會修剪每行的前導和尾隨空格。 -r
以讀取以防止反斜杠被解釋為轉義序列。 CMD
和FILE
。 bash約定只是環境和內部shell變量是大寫的。 $cmd
是一個像-n
這樣的字符串,那么使用printf
代替echo
更安全, echo
會將其解釋為一個標志。 file=test
while IFS= read -r cmd; do
printf '%s\n' "$cmd"
done < "$file"
你所擁有的是將文本"cat test"
傳遞到循環中。
你只想要:
cat test | \
while read CMD; do
echo $CMD
done
xargs
是將輸出拆分為命令參數的最靈活的解決方案。
由於其簡單的參數化,它也非常易讀且易於使用。
格式為xargs -n $NUMLINES mycommand
。
例如,要echo
文件/tmp/tmp.txt
中的每一行,您需要執行以下操作:
cat /tmp/tmp.txt | xargs -n 1 echo
或diff
每對連續列為你會做上述名稱的文件行的文件:
cat /tmp/tmp.txt | xargs -n 2 diff
-n 2
指示xargs
使用並作為單獨的參數傳遞兩行你一次傳入它的內容。
除了回車符/換行符之外,您還可以定制xargs
以拆分分隔符。
使用man xargs
和google可以了解有關此多功能實用程序功能的更多信息。
你的意思是:
cat test | \
while read CMD; do
echo $CMD
done
如果要將文件的每一行用作應用程序的命令行參數,可以使用xargs命令。
xargs -a <params_file> <command>
一個params文件:
a
b
c
d
和文件tr.py:
import sys
print sys.argv
執行
xargs -a params ./tr.py
給出結果:
['./tr.py', 'a', 'b', 'c', 'd']
while read CMD; do
echo $CMD
done << EOF
data line 1
data line 2
..
EOF
腳本的正確版本如下;
FILE="cat test"
$FILE | \
while read CMD; do
echo $CMD
done
然而,這種間接性 - 在名為FILE--的變量中輸入命令是不必要的。 使用已提供的解決方案之一。 我只想指出你的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.