2013-12-12 31 views
1

這3.sh讀取第一個參數指定的文件的內容,並取代在第二參數倒數第二參數由最後參數所指定的字中指定的單詞的所有事件。爲什麼這個bash腳本無法修改文件?

$cat file.txt 
    Hello NZ! How r u? Hey NZ! How r u? 
    $./3.sh file.txt NZ Hey Baby 
    Hello Baby! How r u? Baby Baby! How r u? 

下面是我的代碼:

#!/bin/bash 
    list=($1 $2 $3 $4 $5 $6 $7 $8 $9) 
    str="`cat ${list[0]}`" 
    for ((i=1; i<$#-1; i++)) 
     do 
     str="${str//${list[i]}/${list[i+1]}" 
    done 
    echo $str > $1 
+1

一個問題是,在str =「$ {str ...」行中有一個'}'太少。你應該使用'file =「$ {1:?}」; shift'來分別捕獲文件名。只要文件很小,這應該可以工作,但是使用'sed'而不是原始''bash'很誘人。 –

+1

在查找匹配時出現錯誤消息'意外的EOF'「'告訴你一個關閉'''無法識別。然後你可以把兩個關閉的'''作爲潛在的問題點,這很快導致@JonathanLeffler指出的錯誤關閉'}'。如果可以的話,儘量發佈錯誤信息。 – dangenet

回答

1

正如批評家指出,你只是缺少一個右}那裏,所以速戰速決是:

str="${str//${list[i]}/${list[i+1]}}" 

但你可以重寫這更好,像這樣:

#!/bin/bash 
file=$1; shift 
replacement=$1; shift 
str=$(cat "$file") 
for pattern; do 
    str=${str//$pattern/$replacement} 
done 
echo "$str" > "$file" 

這雖然改變了用途,這種新的模式:

./script.sh FILE REPLACEMENT PATTERN1 PATTERN2 PATTERN3 ... 

但我認爲這是值得的,因爲邏輯是更清潔,更簡單。

Btw此版本還修復了其他可能存在的問題,例如文件名中有空格,或者您正在重寫的文本文件中的空格序列。