web-dev-qa-db-ja.com

forループがbashで機能しない

複数のファイルの一部の文字列を置き換える以下のコードがありますが、forループは最初のファイルをチェックし、Perlスクリプトを実行していません。以下は私のコードです

if [ -f zebu.work.post_opt/ZEBU_CTO_FT_MOD.v ]
then
    for file in $(./zebu.work.post_opt/ZEBU_CTO_FT_MOD*);
    do
    Perl -i -p -e 's/input/inout/g' $file; 
        Perl -i -p -e 's/output/inout/g' $file;
        Perl -i -p -e 's/wire.*\n/tran\(i0,\ o\);/g' $file;
        Perl -i -p -e 's/assign.*\n//g' $file;
    done
fi
7
sudhir prabhu

$(foo)構文は、コマンドfooを実行し、$(foo)を実行中のfooの出力に置き換えます。コマンドではないグロブが必要です。あなたがやっていることは、./zebu.work.post_opt/ZEBU_CTO_FT_MOD*と呼ばれるすべてのファイルを実行しようとしていることです。あなたに必要なのは:

if [ -f zebu.work.post_opt/ZEBU_CTO_FT_MOD.v ]
then
    for file in ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*;
    do
        Perl -i -p -e 's/input/inout/g' "$file"
        Perl -i -p -e 's/output/inout/g' "$file"
        Perl -i -p -e 's/wire.*\n/tran\(i0,\ o\);/g' "$file"
        Perl -i -p -e 's/assign.*\n//g' "$file"
    done
fi

または、もっと簡単に:

if [ -f zebu.work.post_opt/ZEBU_CTO_FT_MOD.v ]
then
    for file in ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*;
    do
        Perl -i -p -e 's/input/inout/g; s/output/inout/g; 
                       s/wire.*\n/tran\(i0,\ o\);/g; 
                       s/assign.*\n//g' "$file"
    done
fi

またはさらに簡単に:

if [ -f zebu.work.post_opt/ZEBU_CTO_FT_MOD.v ]
then
    Perl -i -p -e 's/input/inout/g; s/output/inout/g; 
                   s/wire.*\n/tran\(i0,\ o\);/g; 
                   s/assign.*\n//g' ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*
fi
9
terdon