我有以下腳本。從不同位置逐行讀取請幫助避免重複的代碼
for args
do
while read line; do
# do something
done <"$args"
done
如果腳本是以文件名列表開始的,它應該逐行讀出每個文件。
現在我正在尋找一種從stdin讀取的方式,當腳本啓動時沒有列出文件名,但我不想複製while循環。
任何想法?
我有以下腳本。從不同位置逐行讀取請幫助避免重複的代碼
for args
do
while read line; do
# do something
done <"$args"
done
如果腳本是以文件名列表開始的,它應該逐行讀出每個文件。
現在我正在尋找一種從stdin讀取的方式,當腳本啓動時沒有列出文件名,但我不想複製while循環。
任何想法?
快速回答:
[[ -z $1 ]] && defaultout=/dev/stdin
for f in "[email protected]" $defaultout; do
while read line; do
# do something
done < "$f"
done
缺點:參數不被解析
第二次嘗試:
[[ -z $1 ]] && defaultout=/dev/stdin
for f in [email protected] $defaultout; do
if [[ -f $f ]]; then
while read line; do
# do something
done < "$f"
fi
done
缺點:文件名用空格會我被解析爲兩個單詞。
你可以嘗試:
不錯的嘗試,但不是爲我工作。因爲「arg」包含命令行參數$#,在之前的while循環和case-patterns中進行了評估。 – former 2011-04-14 08:54:30
以下應該做你想要什麼:
cat "[email protected]" | while read line; do
# something
done
第二次嘗試的第三行是什麼原因?這是我的首選解決方案,但是這一行避免從stdin中讀取。 – former 2011-04-14 11:22:14
@former我忘記了編輯出該行>。<...原來第一段代碼也有該行。這是一個簡單的檢查,以確保$ f存在*和*是一個正常的文件。可選地,您可以將其更改爲-e(存在以及任何類型的文件) – pepoluan 2011-04-14 23:55:25