2011-04-14 18 views
1

我有以下腳本。從不同位置逐行讀取請幫助避免重複的代碼

for args 
do 
     while read line; do 
       # do something 
     done <"$args" 

done 

如果腳本是以文件名列表開始的,它應該逐行讀出每個文件。

現在我正在尋找一種從stdin讀取的方式,當腳本啓動時沒有列出文件名,但我不想複製while循環。

任何想法?

回答

0

快速回答:

[[ -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 

缺點:文件名用空格會我被解析爲兩個單詞。

+0

第二次嘗試的第三行是什麼原因?這是我的首選解決方案,但是這一行避免從stdin中讀取。 – former 2011-04-14 11:22:14

+0

@former我忘記了編輯出該行>。<...原來第一段代碼也有該行。這是一個簡單的檢查,以確保$ f存在*和*是一個正常的文件。可選地,您可以將其更改爲-e(存在以及任何類型的文件) – pepoluan 2011-04-14 23:55:25

0

你可以嘗試:

+0

不錯的嘗試,但不是爲我工作。因爲「arg」包含命令行參數$#,在之前的while循環和case-patterns中進行了評估。 – former 2011-04-14 08:54:30