![用于替换每个用户的所有 PHP 文件中的字符串的 Shell 脚本](https://linux22.com/image/1385031/%E7%94%A8%E4%BA%8E%E6%9B%BF%E6%8D%A2%E6%AF%8F%E4%B8%AA%E7%94%A8%E6%88%B7%E7%9A%84%E6%89%80%E6%9C%89%20PHP%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%20Shell%20%E8%84%9A%E6%9C%AC.png)
每个用户都有一些使用共享数据库的 php 文件commondb
。我想遍历所有用户(在 users.csv 中),并在他们的主文件夹(例如 /home/joe)中递归查找所有 php 文件,并将每个出现的“commondb”替换为他们自己的数据库名称,例如将“joe”替换为“joedb”。
我尝试了以下方法:
#!/bin/bash
# Execute like this:
# bash localize.bash users.csv
OLDIFS=$IFS
IFS=","
while read name dummy
do
echo $name
find /home/${name} -name '*.php' -exec sed -i '' 's/commondb/${name}db/g' "{}" \;
done < $1
IFS=$OLDIFS
对于用户.csv
joe, Joe J
george, George G
它没有失败,但文件没有改变。我对 bash 相当不熟悉,我不知道如何调试它 :/
我的脚本可以修复并正常运行吗?
答案1
一开始我没看出你的代码有什么问题。事实上我运行了它,它运行得很好,只是由于在 sed 命令中使用了单引号,它用 ${name} 替换了 commondb。改成双引号就没问题了。
#!/bin/bash
# Execute like this:
# bash localize.bash users.csv
OLDIFS=$IFS
IFS=","
while read name dummy
do
echo $name
find /home/${name} -name '*.php' -exec sed -i '' "s/commondb/${name}db/g" "{}" \;
done < $1
IFS=$OLDIFS