Linux 如何将Bash循环变量传递给Perl?
我试图使用下面的脚本替换许多文件中的字符串,但我无法将Linux 如何将Bash循环变量传递给Perl?,linux,bash,perl,centos,Linux,Bash,Perl,Centos,我试图使用下面的脚本替换许多文件中的字符串,但我无法将I的值传递给perl,因为下面传递的是文件夹中的第一个文件名 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 如果您有任何建议,我们将不
I
的值传递给perl
,因为下面传递的是文件夹中的第一个文件名
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
如果您有任何建议,我们将不胜感激。
谢谢。您可以将其作为命令行参数传递。注意迭代配置文件的正确方法
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
您可以将其作为命令行参数传递。注意迭代配置文件的正确方法
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
问题不在于bash代码只传递文件夹中的第一个文件 循环实际上会通过所有文件名,但是Perl命令中的替换只在第一次调用时匹配
在第一次迭代中,替换所有出现的字符串
error\u log/dev/null crit使用所有文件中的其他内容编写>。此后不再出现错误\u log/dev/null crit代码>,因此第二次和后续迭代无法进行任何更改。问题不在于bash代码只传递文件夹中的第一个文件
循环实际上会通过所有文件名,但是Perl命令中的替换只在第一次调用时匹配
在第一次迭代中,替换所有出现的字符串error\u log/dev/null crit使用所有文件中的其他内容编写>。此后不再出现错误\u log/dev/null crit代码>无法找到,因此第二次和后续迭代无法进行任何更改。当您可以将变量附加到要传递给Perl的字符串参数时,为什么要导出?@amine.ahd您能解释更多吗?我尝试不导出,但值为空!请记住:/usr/bin/perl-p-i-w-e的/error\u log\/dev\/null crit/错误\u log\/var\/log\/nginx\/${i}\u错误\不适用*为什么不在perl中完成这一切?您是否尝试打印$i
的值以确保它不是空的?当您可以将变量附加到要传递给perl的字符串参数时,为什么要导出?@amine.ahd您能解释更多吗?我尝试不导出,但值为空!请记住:/usr/bin/perl-p-i-w-e的/error\u log\/dev\/null crit/错误\u log\/var\/log\/nginx\/${i}\u错误\不适用*为什么不在perl中完成这一切?您是否尝试打印$i
的值以确保它不是空的?