Come parte di questo script, devo essere in grado di verificare se il primo argomento fornito corrisponde alla prima parola del file. In tal caso, esci con un messaggio di errore; in caso contrario, aggiungere gli argomenti al file. Ho capito come scrivere il if
istruzione, ma non come usare grep
all'interno di una sceneggiatura. Comprendo che grep
assomiglierà a questo
grep ^$1 schemas.txt
Sento che dovrebbe essere molto più facile di come lo sto facendo.
Ricevo un errore "troppi argomenti" su if
dichiarazione. Mi sono liberato dello spazio tra grep -q
e quindi è previsto un errore dell'operatore binario.
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "[email protected]" >> schemas.txt
fi
Risposta accettata:
grep
restituisce un codice di uscita diverso se ha trovato qualcosa (zero) rispetto a se non ha trovato nulla (diverso da zero). In un if
, un codice di uscita zero viene mappato su "true" e un codice di uscita diverso da zero viene mappato su false. Inoltre, grep ha un -q
argomento per non restituire il testo corrispondente (ma restituire solo il codice dello stato di uscita)
Quindi, puoi usare grep in questo modo:
if grep -q PATTERN file.txt; then
echo found
else
echo not found
fi
Come nota veloce, quando fai qualcosa come if [ -z "$var" ]…
, si scopre che [
è in realtà un comando che stai eseguendo, proprio come grep. Sul mio sistema, è /usr/bin/[
. (Beh, tecnicamente, la tua shell probabilmente lo ha integrato, 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 diverso da zero per false. (test
è la stessa cosa di [
, fatta eccezione per il ]
di chiusura )