2013-05-09 20 views
5

L'output è vuoto dallo script seguente. Cosa manca? Sto cercando di grep una stringascript di shell grep to grep a stringa

#!/bin/ksh  
file=$abc_def_APP_13.4.5.2  
if grep -q abc_def_APP $file; then 
echo "File Found" 
else 
echo "File not Found" 
fi 
+2

Perché il #! linea dire ksh? – jman

+1

Qual è il valore di 'file' dovrebbe essere? Sospetto che potresti avere un problema sul RHS di questo incarico. – chepner

risposta

9

In bash, utilizzare il reindirizzamento <<< da una stringa (una 'Here string'):

if grep -q abc_def_APP <<< $file 

In altre shell, potrebbe essere necessario utilizzare:

if echo $file | grep -q abc_def_APP 

Ho messo il mio then sulla riga successiva; se vuoi il tuo then sulla stessa linea, quindi aggiungi ; then dopo quello che ho scritto.


Si noti che questa assegnazione:

file=$abc_def_APP_13.4.5.2 

è piuttosto strano; prende il valore di una variabile di ambiente ${abc_def_APP_13} e aggiunge .4.5.2 alla fine (deve essere un env var dato che possiamo vedere l'inizio dello script). Probabilmente desidera scrivere:

file=abc_def_APP_13.4.5.2 

In generale, si dovrebbe racchiudere i riferimenti alle variabili che tengono i nomi di file tra virgolette per evitare problemi con gli spazi ecc nei nomi dei file. Non è fondamentale qui, ma le buone pratiche sono buone pratiche:

if grep -q abc_def_APP <<< "$file" 
if echo "$file" | grep -q abc_def_APP 
+0

Se uso 'se echo $ file | grep -q abc_def_APP' sta stampando il contenuto di $ file, che non voglio – Jill448

+0

Hai scelto l'opzione '-q' per far eseguire' grep' in modalità 'quiet' (per [POSIX] (http: // pubs .opengroup.org/onlinepubs/9699919799/utilities/grep.html)); non dovrebbe produrre nulla. Se la tua versione di 'grep' ha una diversa comprensione di' -q', dovrai guardare la pagina man di grep' del tuo uomo, o reindirizzare a '/ dev/null'. –

+0

Il primo ha funzionato. 'se grep -q abc_def_APP <<< $ file' – Jill448

3

Yuck! Usa la stringa della shell corrispondente

if [[ "$file" == *abc_def_APP* ]]; then ... 
+0

non rischi di abbinare più file con' * abc_def_APP * 'e rovini la condizione nel processo? Cosa succede se '$ file' è' abc_def_APP1' e '* abc_def_APP *' espanso in 'abc_def_APP1 abc_def_APP2', la condizione sarebbe valutata come falsa. – Anthony

+0

e circa il "Yuck!" parte ; Sono totalmente d'accordo con te! tutta la shell del comando unix (unix-like) sta diventando disgustosa ... ma non puoi vivere senza di essa, vero? – Anthony

+0

Dentro parentesi doppie, abbiamo la corrispondenza del modello con la stringa a sinistra, non con i nomi di file corrispondenti. –