Usa l'istruzione Bash if…else

I rami in Bash spesso eseguono il percorso sbagliato quando i confronti tra stringhe utilizzano l'operatore numerico-eqo quando le variabili vengono lasciate senza virgolette. Passando a Bash[[ ]]test con gli operatori corretti corregge questi errori logici e semplifica la manutenzione degli script.

Metodo 1: Scrivi if…else con Bash[[ ]](stringhe, numeri e file)

Passaggio 1:Crea un nuovo script e aggiungi un condizionale minimo utilizzando la moderna sintassi di test Bash[[ ]]. Questa forma evita l'espansione accidentale dei glob e la suddivisione delle parole, il che riduce il comportamento sorprendente rispetto alle parentesi singole.

#!/usr/bin/env bash
set -euo pipefail

read -r -p "Enter a value: " val

if [[ "$val" == "admin" ]]; then
  echo "Welcome, admin."
else
  echo "Access limited."
fi

Passaggio 2:Confronta le stringhe con==O!=. Citare le variabili per evitare che valori e spazi vuoti interrompano i test. Ciò impedisce corrispondenze involontarie causate da espansioni senza virgolette.

user="alice"
target="alice"

if [[ "$user" == "$target" ]]; then
  echo "Usernames match."
else
  echo "Usernames differ."
fi

Passaggio 3:Utilizzare gli operatori numerici per gli interi all'interno[[ ]]:-eq,-ne,-gt,-ge,-lt,-le. Questi operano solo sui numeri ed evitano confronti lessicografici.

read -r -p "Enter a number: " n

if [[ "$n" -gt 10 ]]; then
  echo "Greater than 10."
elif [[ "$n" -eq 10 ]]; then
  echo "Equal to 10."
else
  echo "Less than 10."
fi

Passaggio 4:Controlla i file con gli operatori di test dei file. Questi ti aiutano a ramificarti in base allo stato del filesystem senza eseguire comandi esterni.

  • -f path: esiste un file normale.
  • -d path: la directory esiste.
  • -e path: il percorso esiste (qualsiasi tipo).
  • -x path: il file eseguibile esiste.
  • -r path/-w path: leggibile/scrivibile.
path="./data.txt"

if [[ -f "$path" ]]; then
  echo "File exists."
else
  echo "Creating file..."
  : > "$path"
fi

Passaggio 5:Combina le condizioni con&&(E),||(OR) e!(NON). Raggrupparli tra parentesi per chiarezza e corretta precedenza.

Leggi anche:Automatizza le attività Linux con gli strumenti Bash e GPT

file="./report.log"
size=5

# True when the file exists AND size is at least 5
if [[ -f "$file" ]] && [[ "$size" -ge 5 ]]; then
  echo "Process report."
fi

# True when user is admin OR staff
role="staff"
if [[ "$role" == "admin" || "$role" == "staff" ]]; then
  echo "Privileged."
fi

# Negation: path exists but is not a directory
if [[ -e "$file" && ! -d "$file" ]]; then
  echo "Path is not a directory."
fi

Passaggio 6:Utilizzoelifai controlli di cortocircuito. Una volta che una condizione è vera, i rami successivi vengono saltati, il che accelera la valutazione e riduce i comandi non necessari.

status="warning"

if [[ "$status" == "error" ]]; then
  echo "Exit immediately."
  exit 1
elif [[ "$status" == "warning" ]]; then
  echo "Log and continue."
else
  echo "All good."
fi

Metodo 2: confrontare i numeri interi con(( ))valutazione aritmetica

Passaggio 1:Utilizzare contesti aritmetici per la logica numerica. Dentro(( )), puoi scrivere confronti di tipo matematico (<,>,==) senza virgolette di variabili. Questo è conciso e veloce per i controlli relativi ai soli numeri interi.

a=12 b=8

if (( a > b )); then
  echo "a is larger."
elif (( a == b )); then
  echo "Equal."
else
  echo "b is larger."
fi

Passaggio 2:Combina gli operatori booleani direttamente nel contesto aritmetico. Ciò riduce il boilerplate quando si valutano più condizioni numeriche.

x=7 y=3 z=10

if (( (x > y) && (z >= 10) )); then
  echo "Threshold met."
fi

Passaggio 3:Convalida l'input. I contesti aritmetici trattano i valori non numerici come zero. Se l'input può essere non numerico, proteggilo con un test regex[[ ]]prima di valutare.

read -r n
if [[ "$n" =~ ^-?[0-9]+$ ]] && (( n >= 0 )); then
  echo "Non-negative integer."
else
  echo "Invalid number."
fi

Metodo 3: utilizzare POSIX-portable[ ]per una più ampia compatibilità della shell

Passaggio 1:Preferisci parentesi singole quando prendi di mira shell oltre Bash (ad esempio,/bin/sh). Ricordatelo[è un comando: spazi e virgolette sono obbligatori.

#!/bin/sh

a="hello"
b="hello"

if [ "$a" = "$b" ]; then
  echo "Match."
else
  echo "No match."
fi

Passaggio 2:Utilizzare operatori numerici per numeri interi e variabili virgolette per evitare la suddivisione delle parole. Ciò evita bug quando le variabili sono vuote o contengono spazi.

a=5
b=30

if [ "$a" -lt "$b" ]; then
  echo "a is less than b."
fi

Passaggio 3:Quando si eseguono confronti tra stringhe lessicografiche con<O>, sfuggire agli operatori per impedire il reindirizzamento. Molti errori derivano dal dimenticare questo.

x="apple" y="banana"

if [ "$x" < "$y" ]; then
  echo "apple comes before banana."
fi

Passaggio 4:Utilizzare i test dei file allo stesso modo di in[[ ]], ma mantieni tutto tra virgolette per evitare casi limite.

file="./cfg.ini"
if [ -r "$file" ] && [ -w "$file" ]; then
  echo "Config is readable and writable."
fi

Metodo 4: sostituire le catene lunghe concaseper ramificazioni basate sul valore

Passaggio 1:Utilizzocaseper semplificare più controlli di uguaglianza su una singola variabile. Ciò riduce gli elementi nidificatiifblocca e migliora la leggibilità e la velocità durante la corrispondenza dei modelli.

read -r -p "Enter mode (start|stop|status): " mode

case "$mode" in
  start)  echo "Starting...";;
  stop)   echo "Stopping...";;
  status) echo "Service is running.";;
  *)      echo "Unknown mode."; exit 1;;
esac

Passaggio 2:Abbina facilmente più modelli. Ciò mantiene la logica compatta ed evita confronti ripetuti di variabili.

level="warn"

case "$level" in
  error|err)  echo "Exit with failure."; exit 1;;
  warn|warning) echo "Log warning.";;

  info|debug) echo "Proceed normally.";;
  *)          echo "Unrecognized level.";;
esac

Metodo 5: testare correttamente più condizioni ed eseguire il debug degli errori

Passaggio 1:Raggruppa la logica booleana per riflettere la tua tabella di verità. Ad esempio, "richiedi Z o entrambi X e Y" diventaif [[ "$Z" == "TRUE" || ( "$X" == "TRUE" && "$Y" == "TRUE" ) ]]. Le parentesi chiariscono la precedenza e prevengono bug sottili.

X="TRUE" Y="FALSE" Z="TRUE"

if [[ "$Z" == "TRUE" || ( "$X" == "TRUE" && "$Y" == "TRUE" ) ]]; then
  echo "Conditions met."
else
  echo "Conditions not met."
fi

Passaggio 2:Scegli gli operatori giusti. Utilizzo==per archi e-eqper gli interi. Mescolarli causa rami errati (ad esempio, stringa rispetto a-eqfallisce sempre).

Passaggio 3:Citare le espansioni variabili nei test, soprattutto con parentesi singole. Il virgolette evita arresti anomali quando le variabili sono vuote e impedisce l'espansione dei caratteri jolly rispetto alle voci del filesystem.

Passaggio 4:Traccia la logica quando i risultati sembrano errati. Abilita xtrace per vedere ogni comando e condizione espansi mentre Bash lo valuta.

#!/usr/bin/env bash
set -x  # turn on trace
# ... your conditionals here ...
set +x  # turn off trace

Passaggio 5:Mantieni gli script coerenti e leggibili. Rientra il corpo sottothen/else, lasciare spazi tra parentesi e favorire uscite anticipate sui rami di errore per ridurre l'annidamento.

Riferimento: Panoramica degli operatori di test più comuni

Questo rapido elenco ti aiuta a scegliere l'operatore giusto per il lavoro.

  • stringhe:==,!=,-n var(lunghezza > 0),-z var(vuoto).
  • Interi:-eq,-ne,-gt,-ge,-lt,-le; o utilizzare(( ))con<,>,==.
  • File:-f(regolare),-d(rubrica),-e(esiste),-x(eseguibile),-r(leggibile),-w(scrivibile).
  • Logica:&&(E),||(O),!(NON); gruppo con( ... )dentro[[ ]].

Con il modulo di test corretto, gli operatori corretti e le virgolette coerenti, i condizionali Bash eseguono ogni volta il ramo desiderato. Mantenere[[ ]]per gli script Bash, utilizzare(( ))per la matematica e tornare a[ ]solo quando la portabilità è un must.

Related Posts