per loop non funzionante in bash


7

ho il codice qui sotto per sostituire alcuni elementi in più file, ma il ciclo for sta controllando il primo file e non esegue lo script perl. sotto è il mio codice

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
Rimuovi il $(...)modello globbing intorno al tuo nome file. Non è necessaria una sostituzione di comando lì. Puoi anche combinare le quattro invocazioni Perl in una sola per la velocità.
Kusalananda

Risposte:


9

Il $(foo)costrutto eseguirà il comando fooe lo sostituirà $(foo)con l'output di running foo. Vuoi un glob, non è un comando. Quello che stai facendo è tentare di eseguire tutti i file chiamati ./zebu.work.post_opt/ZEBU_CTO_FT_MOD*. Tutto ciò che serve è:

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

O, più semplicemente:

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

O ancora più semplicemente:

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
Il loop è addirittura necessario? Può perl -iplavorare su più file contemporaneamente? Non ho mai provato questo.
Kusalananda

@Kusalananda infatti può. Avrei dovuto pensarci, grazie!
terdon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.