Come faccio a confrontare una variabile con una stringa (e fare qualcosa se corrispondono)?
Come faccio a confrontare una variabile con una stringa (e fare qualcosa se corrispondono)?
Risposte:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
Se vuoi fare qualcosa quando non corrispondono, sostituiscilo =
con !=
. Puoi leggere ulteriori informazioni sulle operazioni sulle stringhe e sulle operazioni aritmetiche nella rispettiva documentazione.
$x
?Vuoi le virgolette in giro $x
, perché se è vuoto, il tuo script Bash rileva un errore di sintassi come mostrato di seguito:
if [ = "valid" ]; then
==
dell'operatoreSi noti che Bash consente ==
di essere utilizzato per l'uguaglianza con [
, ma questo non è standard .
Utilizzare il primo caso in cui le virgolette intorno $x
sono facoltative:
if [[ "$x" == "valid" ]]; then
o usa il secondo caso:
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
. Modificandolo in ["$ 1" = "on"] il problema è stato risolto.
=
e non due.
[ $x -eq "valid" ]
. -eq
è l'operatore di confronto per numeri interi, non stringhe.
["x$yes" == "xyes"]
, che sta prefissando sia la variabile che la stringa letteralmente con un x
? È una reliquia dei vecchi tempi o è davvero necessaria in alcune situazioni?
Oppure, se non hai bisogno di un'altra clausola:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
può fallire.
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
.
{ echo invalid && false; }
è più efficiente di ( echo invalid && false )
, poiché evita di pagare per una subshell non necessaria.
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
Appunti:
if
e [
e ]
sono importanti>
e <
sono operatori di reindirizzamento, quindi evitatelo con \>
e \<
rispettivamente per le stringhe.$a
realtà " "
lo circondava come parte del valore letterale della stringa, quindi ho dovuto usare il carattere escape $b
per confrontare i valori. Sono stato in grado di trovare questo dopo l'esecuzione bash -x ./script.sh
, il flag -x ti permette di vedere il valore di ogni esecuzione e aiuta nel debug.
Per confrontare le stringhe con i caratteri jolly utilizzare
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
i caratteri jolly. (a proposito: +1 per i caratteri jolly!)
$stringB
deve essere citato (e, per inciso, la sinistra non ha bisogno di essere citato): if [[ $stringA = *"$stringB"* ]]; then
.
Devo dissentire su uno dei commenti in un punto:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Sembra solo uno a, hmm, il non iniziato ...
Utilizza modelli comuni come lingua, in un certo senso;
E dopo aver imparato la lingua.
È una semplice espressione logica, con una parte speciale: valutazione pigra degli operatori logici.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Ogni parte è un'espressione logica; il primo può essere vero o falso, gli altri due sono sempre veri.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Ora, quando viene valutato, viene verificato il primo. Se è falso, il secondo operando della logica e &&
dopo non è rilevante. Il primo non è vero, quindi non può essere il primo e il secondo essere vero, comunque.
Ora, in questo caso è il primo lato della logica o ||
falso, ma potrebbe essere vero se l'altro lato - la terza parte - è vero.
Quindi verrà valutata la terza parte, principalmente scrivendo il messaggio come effetto collaterale. (Ha il risultato 0
per true, che non usiamo qui)
Gli altri casi sono simili, ma più semplici - e - lo prometto! sono - possono essere - facili da leggere!
(Non ne ho uno, ma penso che essere un veterano UNIX con la barba grigia aiuta molto in questo.)
... && ... || ...
solito è malvisto (scusate il veterano Unix con la barba grigia, vi siete sbagliati per tutto questo tempo), dato che non è semanticamente equivalente a if ... then ... else ...
. Non ti preoccupare, questa è una trappola comune .
... && ... || ...
è un modello perfettamente valido e un idioma bash comune. Il suo utilizzo prescrive conoscenze precedenti (che potrebbero essere utili da tenere a mente se ci sono principianti tra il pubblico), ma OP ha i capelli per dimostrare di sapere come evitare i tombini aperti.
puoi anche usare use case / esac
case "$string" in
"$pattern" ) echo "found";;
esac
|
, prima di )
. La in
dichiarazione è equivalente a then
in if
dichiarazioni. Si potrebbe sostenere che funzioni su un elenco di schemi, in cui ogni elenco ha una propria dichiarazione su cosa fare, se si proviene da Python. Non come substring in string
, ma piuttosto for item in list
. Utilizzare a *
come ultima affermazione se si desidera una else
condizione. Ritorna al primo incontro.
Lo script seguente legge da un file denominato "testonthis" riga per riga e quindi confronta ogni riga con una stringa semplice, una stringa con caratteri speciali e un'espressione regolare. Se non corrisponde, lo script stamperà la riga, altrimenti no.
Lo spazio in Bash è molto importante. Quindi funzionerà quanto segue:
[ "$LINE" != "table_name" ]
Ma quanto segue non lo farà:
["$LINE" != "table_name"]
Quindi per favore usa come è:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
bash
ma perché in [
realtà è un binario esterno (come in which [
produce qualcosa del genere /usr/bin/[
)
Probabilmente userei le corrispondenze regexp se l'input ha solo poche voci valide. Ad esempio, solo "start" e "stop" sono azioni valide.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Nota che ho minuscolo la variabile $ACTION
usando la doppia virgola. Inoltre, questo non funzionerà su versioni bash troppo vecchie là fuori.
Bash 4+ esempi. Nota: non usare le virgolette causerà problemi quando le parole contengono spazi, ecc. Citano sempre in Bash, IMO.
Ecco alcuni esempi in Bash 4+:
Esempio 1, controlla 'yes' nella stringa (senza distinzione tra maiuscole e minuscole):
if [[ "${str,,}" == *"yes"* ]] ;then
Esempio 2, controlla "yes" nella stringa (senza distinzione tra maiuscole e minuscole):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Esempio 3, controlla 'yes' nella stringa (case sensitive):
if [[ "${str}" == *"yes"* ]] ;then
Esempio 4, controlla 'yes' nella stringa (case sensitive):
if [[ "${str}" =~ "yes" ]] ;then
Esempio 5, corrispondenza esatta (maiuscole e minuscole):
if [[ "${str}" == "yes" ]] ;then
Esempio 6, corrispondenza esatta (senza distinzione tra maiuscole e minuscole):
if [[ "${str,,}" == "yes" ]] ;then
Esempio 7, corrispondenza esatta:
if [ "$a" = "$b" ] ;then
Godere.
if [ "$a"="$b" ]
o non funziona ... non può avere spazi attorno agli uguali