loop for não funciona no bash


7

Eu tenho o código abaixo para substituir algumas strigns em vários arquivos, mas o loop for está verificando o primeiro arquivo e não executando o script perl. abaixo está o meu código

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

2
Remova o $(...)padrão globbing do seu nome de arquivo. Você não precisa de uma substituição de comando lá. Você também pode combinar as quatro invocações Perl em uma única para obter velocidade.
Kusalananda

Respostas:


9

A $(foo)construção executará o comando fooe será substituída $(foo)pela saída de execução foo. Você quer um globo, isso não é um comando. O que você está fazendo é tentar executar todos os arquivos chamados ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*. Tudo o que você precisa é:

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

Ou, mais simplesmente:

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

Ou ainda mais simplesmente:

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

3
O loop é necessário? Pode perl -iptrabalhar em vários arquivos ao mesmo tempo? Eu nunca testei isso.
Kusalananda

@Kusalananda realmente pode. Deveria ter pensado nisso, obrigado!
terdon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.