簡體   English   中英

在bash腳本中逐行閱讀

[英]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以讀取以防止反斜杠被解釋為轉義序列。
  • 小寫CMDFILE 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM