为什么这个bash脚本无法修改文件?

时间:2013-12-12 14:55:09

标签: bash shell

这个3.sh读取第一个参数中指定的文件的内容,并将第二个参数中指定的所有单词替换为 second last 参数。 最后参数中指定的单词。

    $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 个答案:

答案 0 :(得分: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 ...

但我认为这是值得的,因为逻辑更清晰,更简单。

顺便说一下,这个版本还修复了你可能遇到的其他潜在问题,例如文件名中有空格,或者你正在重写的文本文件中的空格序列。

相关问题