我正在尝试使用下面的脚本替换许多文件中的字符串但是我无法将i
的值传递给perl
,因为以下是在文件夹中传递第一个文件名< / p>
for i in `ls | awk -F".conf" '{print $1}'`
do
export i
/usr/bin/perl -p -i -w -e 's/error_log \/dev\/null crit;/error_log \/var\/log\/nginx\/$ENV{i}_error error;\n/g;' *
done
任何建议都会受到赞赏吗?
谢谢
答案 0 :(得分:2)
您可以将其作为命令行参数传递。请注意迭代配置文件的正确方法。
for i in *.conf; do
f=${i%.conf}
perl -piwe 's|error_log /dev/null crit;|error_log /var/log/nginx/$ARGV[0]_error error;\n|g;' "$f"
done
答案 1 :(得分:1)
问题不在于您的bash代码只传递文件夹中的第一个文件。
循环实际上传递了所有文件名,但Perl命令中的替换仅匹配第一次调用它。
在第一次迭代中,您将所有出现的字符串error_log /dev/null crit;
替换为 所有文件 中的其他内容。此后不再找到error_log /dev/null crit;
,因此第二次和后续迭代无法进行任何更改。