Cerco sempre di rimanere con POSIX sh
invece di usare le estensioni di Bash, poiché uno dei punti principali dello scripting è la portabilità (oltre a collegare i programmi, non sostituirli).
In sh
, c'è un modo semplice per verificare una condizione "is-prefix".
case $HOST in node*)
# Your code here
esac
Considerando quanti anni ha sh arcano e crufty (e Bash non è la cura: è più complicato, meno coerente e meno portatile), vorrei sottolineare un aspetto funzionale molto bello: mentre alcuni elementi di sintassi come case
sono integrati , i costrutti risultanti non sono diversi da qualsiasi altro lavoro. Possono essere composti allo stesso modo:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
O ancora più breve
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
O ancora più breve (solo per presentare !
come un elemento del linguaggio - ma questo è cattivo stile ora)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
Se ti piace essere esplicito, crea il tuo elemento linguistico:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
Non è abbastanza carino?
if beginswith node "$HOST"; then
# Your code here
fi
E dato che sh
fondamentalmente sono solo lavori e liste di stringhe (e processi interni, fuori dai quali i lavori sono composti), ora possiamo anche fare una leggera programmazione funzionale:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # Prints TRUE
all "beginswith x" x xy abc ; checkresult # Prints FALSE
Questo è elegante Non che io sostenga l'uso sh
per qualcosa di serio: si rompe troppo rapidamente sui requisiti del mondo reale (niente lambda, quindi dobbiamo usare le stringhe. Ma le chiamate di funzione di nidificazione con stringhe non sono possibili, i tubi non sono possibili, ecc.)