2013-12-12 119 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此版本还修复了其他可能存在的问题,例如文件名中有空格,或者您正在重写的文本文件中的空格序列。