2008-11-29 90 views
-1

我的bash腳本不工作的方式,我希望它:如何讓我的bash腳本工作?

#!/bin/bash 

total="0" 
count="0" 
#FILE="$1" This is the easier way 
for FILE in $* 
do 
    # Start processing all processable files 
    while read line 
    do 
     if [[ "$line" =~ ^Total ]]; 
     then 
      tmp=$(echo $line | cut -d':' -f2) 
      count=$(expr $count + 1) 
      total=$(expr $total + $tmp) 
     fi  
    done < $FILE 
done 
echo "The Total Is: $total" 
echo "$FILE" 

有另一種方式,以便它讀取參數到$1而不是$FILE修改此腳本?我已經使用while循環嘗試:

while [ $1 != "" ] 
    do .... 
done 

此外,當我實現了代碼重演。有沒有辦法解決這個問題?

我遇到的另一個問題是,當我有多個文件hi*.txt它給了我重複。爲什麼?我有像hi1.txthi1.txt~這樣的文件,但波形文件是0字節,所以我的腳本不應該找到任何東西。


我有什麼好,但可以改善。我很感謝你的awk建議,但是它現在超越了我作爲unix程序員的水平。

Strager:我的文本編輯器自動生成的文件不包含任何內容..它只有0個字節..但是我繼續前進並刪除它們以確保它。但是,我的劇本實際上並沒有兩次閱讀所有內容。當它真的不應該時,我想它再次循環。我試圖用退出命令來保持沉默。但是沒有成功。

while [ "$1" != "" ]; do 
    # Code here 

    # Next argument 
    shift 
done 

這段代碼很漂亮,但我一次指定所有可能的命令。示例:hi [145] .txt 如果提供將一次讀取所有三個文件。 假設用戶輸入hi * .txt; 然後我得到所有我喜文件讀取兩次,然後再次添加。

我該如何對它進行編碼,以便在指定hi * .txt時讀取我的文件(只是一次)? 我真的認爲這是因爲沒有1美元。

+0

請更好地格式化您的代碼。選中它並點擊小代碼按鈕,或者至少確保它縮進四個空格。 – Dustin 2008-11-29 00:28:00

回答

1

如果你定義了一個函數,它會收到參數$ 1。儘管爲什麼1美元對你來說比$ FILE更有價值?

#!/bin/sh 

process() { 
    echo "doing something with $1" 
} 

for i in "[email protected]" # Note use of "[email protected]" to not break on filenames with whitespace 
do 
    process "$i" 
done 
1
while [ "$1" != "" ]; do 
    # Code here 

    # Next argument 
    shift 
done 

在你的問題,波浪號文件......這些都是通過文本編輯器創建的臨時文件。如果您不希望它們與您的glob表達式匹配(通配符),請將其刪除。否則,請在腳本中過濾它們(不推薦)。

2

看起來您正試圖從提供的文件中標記爲「Total:」的行中總計總計。說出你想要做的事情總是一個好主意 - 以及你如何去做(參見How to Ask Questions the Smart Way)。

如果是這樣,那麼你的工作方式就像我看到的那樣複雜。出了什麼問題:

grep '^Total:' "[email protected]" | 
cut -d: -f2 | 
awk '{sum += $1} 
    END { print sum }' 

這不打印出「總數是」等;目前還不清楚爲什麼你在版本結束時回顯$ FILE。

您可以使用Perl或任何其他合適的程序代替awk;你可以做在Perl或Python的整個工作 - 事實上,cut工作可以由awk來完成:

grep "^Total:" "[email protected]" | 
awk -F: '{sum += $2} 
     END { print sum }' 

採取更進一步的,整個工作可以做的awk

awk -F: '$1 ~ /^Total/ { sum += $2 } 
     END { print sum }' "[email protected]" 

的在Perl代碼不會更難,結果可能會更快:

perl -na -F: -e '$sum += $F[1] if m/^Total:/; END { print $sum; }' "[email protected]" 

當通過所提供的文件名參數迭代一個shell腳本,你應該使用'"[email protected]"'來代替'$*',因爲後面的記法不會保留文件名中的空格。

您對'$1'的評論讓我困惑。您可能會要求在每次迭代時從名稱爲$1的文件中讀取;即使用:

while [ $# -gt 0 ] 
do 
    ...process $1... 
    shift 
done 

HTH!