getopts în Linux / Bash

Citește opțiunile scurte ale unui script (-v, -n nume) într-o buclă, cu validare și mesaje de eroare.

Sintaxă comandă
while getopts "ab:c" opt; do
  case $opt in ... esac
done
shift $((OPTIND - 1))

Ce face getopts

getopts parcurge argumentele scriptului unul câte unul și pune litera opțiunii curente în variabila indicată (aici opt). Pentru opțiunile care primesc o valoare, valoarea ajunge în OPTARG.

Șirul de opțiuni descrie ce accepți: "vn:o:" înseamnă -v fără valoare și -n, -o cu valoare (litera urmată de :). Dacă șirul începe cu :, getopts nu mai afișează erori proprii, iar tu tratezi cazurile ? (opțiune necunoscută) și : (lipsește valoarea).

După buclă, OPTIND indică primul argument care nu este opțiune; shift $((OPTIND - 1)) le elimină pe cele procesate, ca în $@ să rămână doar fișierele sau celelalte argumente. getopts nu cunoaște opțiuni lungi (--nume).

Opțiuni și argumente

Opțiune / Parametru Descriere
"vn:" Șirul de opțiuni: v fără valoare, n: cu valoare obligatorie.
":vn:" Modul silențios: erorile se tratează în ramurile \? și :.
OPTARG Valoarea opțiunii curente (sau litera greșită, în modul silențios).
OPTIND Indexul următorului argument de procesat; pornește de la 1.
shift $((OPTIND - 1)) Elimină opțiunile procesate din argumentele poziționale.

Exemple

Exemplul 1: Un script cu opțiuni -n, -o și -v

set -- simulează argumentele primite de script, ca exemplul să ruleze singur.

set -- -v -n Ana -o Iași note.csv absente.csv
VERBOSE=0
NUME=""
ORAS="necunoscut"
while getopts "vn:o:" opt; do
  case $opt in
    v) VERBOSE=1 ;;
    n) NUME=$OPTARG ;;
    o) ORAS=$OPTARG ;;
  esac
done
shift $((OPTIND - 1))
echo "Nume: $NUME, oraș: $ORAS, verbose: $VERBOSE"
echo "Fișiere rămase: $*"

Rezultat

Nume: Ana, oraș: Iași, verbose: 1
Fișiere rămase: note.csv absente.csv

Exemplul 2: Tratarea erorilor în modul silențios

Cu : la începutul șirului, scriptul scrie propriile mesaje. local OPTIND permite apelarea funcției de mai multe ori.

citeste_optiuni() {
  local OPTIND opt
  while getopts ":n:" opt; do
    case $opt in
      n) echo "Salut, $OPTARG!" ;;
      \?) echo "Opțiune necunoscută: -$OPTARG" ;;
      :) echo "Opțiunea -$OPTARG are nevoie de o valoare" ;;
    esac
  done
}
citeste_optiuni -n Mihai
citeste_optiuni -x
citeste_optiuni -n

Rezultat

Salut, Mihai!
Opțiune necunoscută: -x
Opțiunea -n are nevoie de o valoare

Greșeli frecvente

  • Uitarea lui shift $((OPTIND - 1)): în $@ rămân și opțiunile, iar scriptul tratează -v ca nume de fișier.
  • Opțiuni puse după argumente: script.sh fisier.txt -v. getopts se oprește la primul argument care nu începe cu -, deci -v nu este citit.
  • Folosirea lui getopts într-o funcție apelată de mai multe ori fără local OPTIND: la al doilea apel bucla pornește de unde a rămas și nu mai citește nimic.

Comenzi înrudite

  • case: Ramificare multi-opțiune bazată pe potrivirea de tipare text (pattern matching).
  • while: Execută repetat un bloc de comenzi atâta timp cât condiția specificată rămâne adevărată.
  • Variabile în Bash: Declararea, atribuirea, valorile implicite și expandarea corectă a variabilelor în Bash.
  • Funcții în Bash: Gruparea instrucțiunilor în blocuri reutilizabile de cod, cu variabile locale și parametri.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: getopts

Ai o nelămurire despre utilizarea comenzii getopts sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.