Come parte di questo script, ho bisogno di poter controllare se il primo argomento dato corrisponde alla prima parola del file. Se lo fa, esce con un messaggio di errore; se non lo fa, aggiunge gli argomenti al file. Capisco come scrivere l'istruzione if
, ma non come usare grep
all'interno di uno script. Ho capito che grep
avrà un aspetto simile a questo
grep ^$1 schemas.txt
Sento che questo dovrebbe essere molto più facile di come lo sto facendo.
Sto ottenendo un errore "troppi argomenti" sull'istruzione if
. Mi sono sbarazzato dello spazio tra grep -q
e poi ho ottenuto un errore operatore binario previsto.
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
grep
restituisce un codice di uscita diverso se ha trovato qualcosa (zero) e se non ha trovato nulla (non-zero). In un'istruzione if
, un codice di uscita zero è mappato a "true" e un codice di uscita non zero è mappato a false. Inoltre, grep ha un argomento -q
per non mostrare il testo trovato (ma solo il codice di stato di uscita)
Quindi, potete usare grep in questo modo:
if grep -q PATTERN file.txt; then
echo found
else
echo not found
fi
Come nota veloce, quando fate qualcosa come if [ -z "$var" ]...
, si scopre che [
è in realtà un comando che state eseguendo, proprio come grep. Sul mio sistema, è /usr/bin/[
. (Beh, tecnicamente, la tua shell probabilmente lo ha incorporato, ma questa è un'ottimizzazione. Si comporta come se fosse un comando). Funziona allo stesso modo, [
restituisce un codice di uscita zero per true, un codice di uscita non zero per false. (test
è la stessa cosa di [
, tranne che per la chiusura ]
)
Un altro modo semplice è usare grep -c
.
Questo produce (non restituisce come codice di uscita), il numero di linee che corrispondono al modello, quindi 0 se non c'è corrispondenza o 1 o più se c'è una corrispondenza.
Quindi, se si volesse controllare che il pattern corrisponda 3 o più volte, si farebbe:
if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
...
Se volete usarlo con le parentesi quadre, potete eseguire il seguente
if [ `grep -q PATTERN file.txt` ]; then
echo found
else
echo not found
Questa logica funziona per tutti i comandi, basta mettere i vostri comandi all'interno del backtick (il pulsante sopra la scheda o verso il basso del pulsante Esc o a sinistra del pulsante 1)