2017-03-12 6 views
0

は、私は、スクリプト下記の使用多くのファイル内の文字列を置換しようとしているが、私は、フォルダ内の最初のファイル名を渡して、次のBashループ変数を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 

何かアドバイスとしてperliの値を渡すことができないだろうありがとう?

ありがとう

+0

なぜPerlに渡す文字列引数に変数を追加できるのでしょうか? –

+0

@ amine.ahdあなたはもっと説明できますか?私は輸出なしで試みたが、価値は空になる!/error_log \/dev \/null crit;/error_log \/var \/log \/nginx \/$ {i} _error error;エラーが発生しました。 \ n/g; ' * –

+1

なぜperlでそれをしないのですか? – Sobrique

答えて

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

問題は、bashコードがフォルダ内の最初のファイルだけを渡すという問題ではありません。

ループは実際にはすべてのファイル名を通過しますが、Perlコマンドの置換は最初に呼び出されたときにのみ一致します。あなたはに何か他のもので、文字列error_log /dev/null crit;のすべての出現を置き換える最初の繰り返しで

すべてのファイル。その後、見つかるべきerror_log /dev/null crit;がもう存在しないので、2回目以降の反復は何も変更されません。

関連する問題