Domanda

Ho il seguente script

cat $1 | while read line
do
    line=`echo $line | tr "[:lower:]" "[:upper:]"`

    if [ "`echo $line | cut -f1 -d:`" = "foo" ] && \
       [ "`echo $line | cut -f2 -d:`" = "bar" ]; then
        echo 'exsist'
        exit 1;
    fi
done

tutto funziona fino a risuonare e poi quando lo script colpisce uscire non e che continua ad andare. Tutte le idee.

Grazie

È stato utile?

Soluzione

Non è necessario che il backslash -. Questa non è la shell C

Il problema è che il ciclo while è in una sotto-shell, che esce, ma perché è gestito come un sub-shell, script principale continua.

Nel contesto, la soluzione più semplice è probabilmente:

while read line
do
    line=`echo $line | tr "[:lower:]" "[:upper:]"`
    if [ "`echo $line | cut -f1 -d:`" = "foo" ] &&
       [ "`echo $line | cut -f2 -d:`" = "bar" ]; then
        echo 'exist'
        exit 1
    fi
done < $1

Se si deve elaborare più file ( 'cat "$ @"' invece di 'cat $ 1'), poi si deve lavorare un molto più difficile po 'più difficile:

cat "$@" |
while read line
do
    line=`echo $line | tr "[:lower:]" "[:upper:]"`
    if [ "`echo $line | cut -f1 -d:`" = "foo" ] &&
       [ "`echo $line | cut -f2 -d:`" = "bar" ]; then
        echo 'exist'
        exit 1
    fi
done
[ $? != 0 ] && exit 1

Questa verifica lo stato di uscita del gasdotto costituito da 'gatto' e 'mentre', che è lo stato di uscita del ciclo 'while, che sarà 1 nell'esempio se 'foo: bar' si trova al all'inizio di una riga.

Naturalmente, ci sono altri modi per rilevare che, come ad esempio:

grep -s -q "^foo:bar:" "$@" && exit 1

Questa esegue molto meno comandi rispetto alla versione loop. (Se è necessario per consentire. '^ Foo: bar $' così, utilizzare egrep invece di grep pianura)

Altri suggerimenti

Si sta traducendo il testo da caso testo in basso in testo maiuscolo, ma poi prova contro il minuscolo, in modo da non arrivare all'uscita.

dal momento che si desidera convertire in maiuscolo per ogni linea, si può fare in questo modo

#!/bin/sh

tr '[:lower:]' '[:upper:]' < file | while IFS=":" read -r a b c
do
    case "$a $b" in
        "FOO BAR" ) echo "exist";exit;;
        *) echo "$a $b";;
    esac
done

O lo si può fare solo con awk (nawk per Solaris)

nawk -F":" '
topper($1)=="FOO" && topper($2)=="BAR"{
    print "exist"
    exit
}
{
    print topper($0)
}
' file

È possibile rendere i condizionali case-insensitive aggiungendo shopt -s nocasematch sopra il test. Per impostare le cose a maiuscole e minuscole. shopt -u nocasematch

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top