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.