Penguasaan Baris Perintah Linux & Penskripan Bash · Pelajaran

Menghurai Bendera dan Argumen dengan getopts

Laksanakan antara muka baris perintah profesional menggunakan getopts untuk pilihan pendek, argumen wajib dan mesej penggunaan.

Pelajaran 3 daripada 413 langkah

Menghurai Bendera dan Argumen dengan getopts ialah pelajaran Penguasaan Baris Perintah Linux & Penskripan Bash percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Penguasaan Baris Perintah Linux & Penskripan Bash, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Penguasaan Baris Perintah Linux & Penskripan Bash merangkumi sejumlah 4 pelajaran.

Sebab getopts Wujud

Setiap skrip dunia sebenar akhirnya perlu menerima pilihan seperti -v, -o output.txt atau -n 5. Menghuraikannya secara manual dengan $1, $2… akan cepat menjadi rapuh.

getopts ialah binaan terbina dalam yang mematuhi piawaian POSIX untuk mengendalikan pilihan pendek (-a, -b) dengan boleh dipercayai, termasuk pilihan yang menerima argumen. Ia terbina dalam setiap shell POSIX, jadi tiada kebergantungan diperlukan.

  • Mengendalikan bendera bergabung: -vn 5 = -v -n 5
  • Melaporkan pilihan yang tidak diketahui dengan baik
  • Menetapkan pemboleh ubah standard OPTIND dan OPTARG secara automatik

Dalam pelajaran ini, anda akan membina CLI lengkap dan profesional menggunakan getopts dari awal.

Sintaks getopts

Sintaks terasnya ialah gelung while yang memanggil getopts pada setiap lelaran:

while getopts "optstring" varname; do
  case "$varname" in
    ...
  esac
done
  • optstring — rentetan yang menyenaraikan setiap huruf pilihan yang diterima. Tanda titik bertindih selepas huruf bermaksud pilihan itu memerlukan argumen.
  • varname — menerima huruf pilihan semasa pada setiap lelaran.
  • OPTARG — ditetapkan secara automatik kepada nilai argumen apabila tanda titik bertindih mengikuti huruf tersebut.
  • OPTIND — indeks bagi argumen seterusnya yang perlu diproses; gunakan shift $((OPTIND - 1)) selepas gelung untuk mendedahkan parameter kedudukan yang masih berbaki.
#!/usr/bin/env bash
# Minimal skeleton — shows the loop structure
while getopts 'vn:' opt; do
  case "$opt" in
    v) echo "Verbose mode on" ;;
    n) echo "Count = $OPTARG" ;;
    ?) echo "Unknown option: -$OPTARG" >&2; exit 1 ;;
  esac
done

Mentakrifkan Optstring

optstring ialah pengisytiharan padat bagi kontrak CLI anda. Setiap aksara mewakili satu bendera yang diterima.

  • 'abc' — menerima -a, -b, -c (tiada argumen)
  • 'a:bc' — -a memerlukan argumen; -b dan -c tidak memerlukannya
  • ':abc' — tanda titik bertindih di hadapan mengaktifkan mod ralat senyap (skrip anda mengendalikan pilihan yang salah dan bukannya shell mencetak mesej)

Mod senyap lebih sesuai dalam skrip pengeluaran kerana anda mendapat kawalan penuh terhadap mesej ralat dan kod keluar.

#!/usr/bin/env bash
# optstring ':o:vq'
# -o  requires an argument (output file)
# -v  verbose flag (no argument)
# -q  quiet flag  (no argument)
# Leading ':' = silent error mode

while getopts ':o:vq' opt; do
  case "$opt" in
    o) OUTPUT="$OPTARG" ;;
    v) VERBOSE=1 ;;
    q) QUIET=1 ;;
    :) echo "Error: -$OPTARG requires an argument" >&2; exit 1 ;;
    \?) echo "Error: unknown option -$OPTARG" >&2; exit 1 ;;
  esac
done
echo "OUTPUT=$OUTPUT  VERBOSE=$VERBOSE  QUIET=$QUIET"

OPTARG dan Argumen yang Diperlukan

Apabila satu bendera diikuti tanda titik bertindih dalam optstring, getopts menyimpan nilainya dalam OPTARG. Pengguna boleh menulis argumen itu sama ada dengan atau tanpa ruang:

  • -o report.txt
  • -oreport.txt

Kedua-dua bentuk dihuraikan dengan cara yang sama. Ini ialah salah satu kelebihan utama berbanding penghuraian manual $1/shift.

Dalam mod senyap (':' di hadapan optstring), argumen yang tiada menyebabkan getopts menetapkan varname kepada : dan OPTARG kepada huruf pilihan — sesuai untuk mesej ralat yang khusus.

#!/usr/bin/env bash
# Demonstrate OPTARG with a file-processing script

while getopts ':i:o:' opt; do
  case "$opt" in
    i) INPUT="$OPTARG" ;;
    o) OUTPUT="$OPTARG" ;;
    :) echo "Error: option -$OPTARG needs a value" >&2; exit 1 ;;
    \?) echo "Error: unknown flag -$OPTARG" >&2; exit 1 ;;
  esac
done

echo "Input  : ${INPUT:-<not set>}"
echo "Output : ${OUTPUT:-<not set>}"

Mengalihkan Melepasi Pilihan dengan OPTIND

Selepas getopts selesai, OPTIND mengandungi indeks bagi argumen bukan pilihan yang pertama. Gunakan shift untuk membuang semua pilihan yang telah diproses supaya $1, $2… merujuk kepada parameter kedudukan yang masih berbaki (contohnya nama fail).

Ungkapan lazimnya sentiasa:

shift $((OPTIND - 1))

Selepas pengalihan itu, $@ hanya mengandungi argumen yang bukan bendera — operan bagi perintah anda.

#!/usr/bin/env bash
# Shows OPTIND shift and leftover positional args

VERBOSE=0
while getopts ':vn:' opt; do
  case "$opt" in
    v) VERBOSE=1 ;;
    n) COUNT="$OPTARG" ;;
    :) echo "Error: -$OPTARG requires an argument" >&2; exit 1 ;;
    \?) echo "Error: unknown option -$OPTARG" >&2; exit 1 ;;
  esac
done
shift $((OPTIND - 1))

echo "VERBOSE=$VERBOSE  COUNT=${COUNT:-1}"
echo "Remaining args: $*"

Menulis Fungsi Usage

Skrip profesional sentiasa menyediakan fungsi usage() yang mencetak mesej bantuan dan keluar. Konvensyennya ialah:

  • Cetak ke stderr (fd 2) supaya tidak mencemarkan keluaran yang disalurkan
  • Keluar dengan kod 0 untuk -h / --help, dan keluar dengan kod 1 untuk penggunaan yang tidak sah
  • Panggil usage 1 daripada laluan ralat dan usage 0 daripada pengendali -h
#!/usr/bin/env bash

usage() {
  cat >&2 <<EOF
Usage: $(basename "$0") [-v] [-n COUNT] [-o FILE] [FILE...]

Options:
  -v          Verbose output
  -n COUNT    Repeat COUNT times (default: 1)
  -o FILE     Write output to FILE
  -h          Show this help
EOF
  exit "${1:-0}"
}

while getopts ':vn:o:h' opt; do
  case "$opt" in
    v) VERBOSE=1 ;;
    n) COUNT="$OPTARG" ;;
    o) OUTFILE="$OPTARG" ;;
    h) usage 0 ;;
    :) echo "Error: -$OPTARG requires a value" >&2; usage 1 ;;
    \?) echo "Error: unknown option -$OPTARG" >&2; usage 1 ;;
  esac
done
shift $((OPTIND - 1))
echo "Parsed OK — verbose=${VERBOSE:-0} count=${COUNT:-1} out=${OUTFILE:--}"

Nilai Lalai dan Pengesahan

Selepas penghuraian, sahkan dan tetapkan nilai lalai sebelum melakukan kerja sebenar. Asingkan fasa penghuraian (gelung) daripada fasa logik. Ini menjadikan kedua-dua bahagian lebih mudah dibaca dan diuji.

  • Gunakan ${VAR:-default} untuk nilai lalai sebaris
  • Sahkan argumen berangka dengan ungkapan nalar atau pemeriksaan aritmetik
  • Sahkan bahawa pilihan yang diperlukan benar-benar telah diberikan
#!/usr/bin/env bash

usage() { echo "Usage: $(basename "$0") -n COUNT [-v]" >&2; exit 1; }

VERBOSE=0
COUNT=''

while getopts ':n:v' opt; do
  case "$opt" in
    n) COUNT="$OPTARG" ;;
    v) VERBOSE=1 ;;
    :) echo "Error: -$OPTARG needs a value" >&2; usage ;;
    \?) echo "Error: -$OPTARG unknown" >&2; usage ;;
  esac
done
shift $((OPTIND - 1))

# Validation phase
[[ -z "$COUNT" ]] && { echo "Error: -n COUNT is required" >&2; usage; }
[[ "$COUNT" =~ ^[0-9]+$ ]] || { echo "Error: COUNT must be a positive integer" >&2; usage; }

for (( i=1; i<=COUNT; i++ )); do
  [[ $VERBOSE -eq 1 ]] && echo "Iteration $i of $COUNT"
  echo "Hello, world!"
done

Menggabungkan Bendera pada Baris Perintah

getopts mengendalikan bendera pendek bergabung yang ditulis tanpa ruang secara automatik, selaras dengan konvensyen Unix standard:

  • -v -q adalah setara dengan -vq
  • -n 5 -v adalah setara dengan -n5 -v atau -vn5

Anda tidak perlu menulis kod tambahan untuk menyokongnya — getopts mengulangi setiap aksara dalam rentetan pilihan bergabung secara automatik. Ini ialah satu lagi sebab utama untuk menggunakan getopts dan bukannya penghuraian manual.

#!/usr/bin/env bash
# Test combined flag parsing
# Run as:  bash script.sh -vq -n3

VERBOSE=0; QUIET=0; COUNT=1

while getopts ':vqn:' opt; do
  case "$opt" in
    v) VERBOSE=1 ;;
    q) QUIET=1 ;;
    n) COUNT="$OPTARG" ;;
    :) echo "Error: -$OPTARG needs value" >&2; exit 1 ;;
    \?) echo "Error: unknown -$OPTARG" >&2; exit 1 ;;
  esac
done
shift $((OPTIND - 1))

echo "verbose=$VERBOSE quiet=$QUIET count=$COUNT"

Mengendalikan Pemisah Tanda Sengkang Berganda

Perintah Unix menerima -- (tanda sengkang berganda) sebagai isyarat jelas bahawa pemprosesan pilihan harus dihentikan. Semua yang berada selepas -- dianggap sebagai argumen kedudukan, walaupun kelihatan seperti bendera.

getopts berhenti secara automatik apabila menemui --. Selepas shift $((OPTIND - 1)), tanda sengkang berganda itu hilang dan $@ hanya mengandungi operan.

Ini penting untuk skrip yang beroperasi pada nama fail yang mungkin bermula dengan tanda sengkang, contohnya:

myscript.sh -v -- -strangefile.txt
#!/usr/bin/env bash
# Demonstrate -- separator
# Run as:  bash script.sh -v -- file1.txt -oddname.txt

VERBOSE=0
while getopts ':v' opt; do
  case "$opt" in
    v) VERBOSE=1 ;;
    \?) echo "Unknown option -$OPTARG" >&2; exit 1 ;;
  esac
done
shift $((OPTIND - 1))   # removes -v and the '--' separator

echo "Verbose: $VERBOSE"
echo "Files to process:"
for f in "$@"; do
  echo "  -> $f"
done

Membungkus getopts dalam Fungsi Pustaka

Dalam skrip modular, anda boleh merangkum getopts dalam fungsi parse_args() yang menetapkan pemboleh ubah global (atau nameref). Ini memastikan main() kekal kemas dan membolehkan anda mendapatkan sumber penghuraian daripada skrip lain.

Peraturan utama bagi corak ini:

  • Isytiharkan pemboleh ubah pilihan sebelum memanggil fungsi
  • Gunakan pemboleh ubah global atau hantarkan nilai melalui nameref (declare -n)
  • Kembalikan kod keluar bukan sifar untuk masukan yang salah supaya main boleh bertindak balas
#!/usr/bin/env bash

# Global option variables
VERBOSE=0; OUTPUT=''; COUNT=1

parse_args() {
  local opt
  while getopts ':vn:o:h' opt; do
    case "$opt" in
      v) VERBOSE=1 ;;
      n) COUNT="$OPTARG" ;;
      o) OUTPUT="$OPTARG" ;;
      h) echo "Usage: $(basename "$0") [-v] [-n N] [-o FILE]"; exit 0 ;;
      :) echo "Error: -$OPTARG needs a value" >&2; return 1 ;;
      \?) echo "Error: unknown option -$OPTARG" >&2; return 1 ;;
    esac
  done
  shift $((OPTIND - 1))
  ARGS=("$@")   # leftover positional args stored in array
}

main() {
  parse_args "$@" || exit 1
  echo "verbose=$VERBOSE count=$COUNT output=${OUTPUT:--} args=${ARGS[*]}"
}

main "$@"

Contoh Dunia Sebenar Lengkap: Pengarkib Log

Berikut ialah skrip dunia sebenar yang lengkap dan menggunakan semua perkara yang dibincangkan dalam pelajaran ini: optstring dengan argumen yang diperlukan, mod ralat senyap, fungsi penggunaan, nilai lalai, pengesahan dan pengalihan OPTIND.

Kaji strukturnya — inilah templat yang perlu anda ikuti dalam setiap skrip yang ditulis dan memerlukan antara muka CLI.

#!/usr/bin/env bash
# archive_logs.sh — compress and move logs older than N days

set -euo pipefail

DESTDIR='/tmp/log_archive'
DAYS=30
VERBOSE=0

usage() {
  cat >&2 <<EOF
Usage: $(basename "$0") [-v] [-d DAYS] [-o DIR] SOURCE_DIR

  -d DAYS   Archive logs older than DAYS (default: 30)
  -o DIR    Destination directory (default: /tmp/log_archive)
  -v        Verbose output
  -h        Show this help
EOF
  exit "${1:-0}"
}

while getopts ':d:o:vh' opt; do
  case "$opt" in
    d) DAYS="$OPTARG" ;;
    o) DESTDIR="$OPTARG" ;;
    v) VERBOSE=1 ;;
    h) usage 0 ;;
    :) echo "Error: -$OPTARG requires a value" >&2; usage 1 ;;
    \?) echo "Error: unknown option -$OPTARG" >&2; usage 1 ;;
  esac
done
shift $((OPTIND - 1))

# Validation
[[ $# -lt 1 ]] && { echo "Error: SOURCE_DIR is required" >&2; usage 1; }
[[ "$DAYS" =~ ^[0-9]+$ ]] || { echo "Error: DAYS must be numeric" >&2; exit 1; }
SOURCE="$1"
[[ -d "$SOURCE" ]] || { echo "Error: '$SOURCE' is not a directory" >&2; exit 1; }

mkdir -p "$DESTDIR"
[[ $VERBOSE -eq 1 ]] && echo "Archiving logs older than $DAYS days from $SOURCE to $DESTDIR"

find "$SOURCE" -name '*.log' -mtime "+$DAYS" -print | while read -r f; do
  gzip -c "$f" > "$DESTDIR/$(basename "$f").gz"
  [[ $VERBOSE -eq 1 ]] && echo "  archived: $f"
done

echo "Done."

Semakan Pantas: Optstring getopts

Baca panggilan getopts berikut dan pilih perihalan yang betul tentang kelakuannya:

while getopts ':f:vq' opt; do

Ulang Kaji Pelajaran: Menguasai getopts

Anda telah mempelajari cara membina antara muka baris perintah profesional dalam Bash menggunakan getopts. Berikut ialah ringkasan perkara utama:

  • Sintaks optstring — huruf tanpa tanda titik bertindih ialah bendera boolean; tanda titik bertindih selepas huruf bermaksud pilihan itu memerlukan argumen; tanda titik bertindih di hadapan mengaktifkan mod ralat senyap.
  • OPTARG — menyimpan nilai argumen secara automatik untuk pilihan yang memerlukannya.
  • OPTIND — gunakan shift $((OPTIND - 1)) selepas gelung untuk mendedahkan parameter kedudukan yang masih berbaki dalam $@.
  • Mod ralat senyap — lebih sesuai dalam pengeluaran; kendalikan sendiri kes : (argumen tiada) dan \? (pilihan tidak diketahui) untuk mendapatkan kawalan penuh.
  • Fungsi usage() — sentiasa tulis fungsi ini; cetak ke stderr, keluar dengan 0 untuk -h dan keluar dengan 1 untuk ralat.
  • Bendera bergabung — getopts mengendalikan -vq dan -n5 secara automatik tanpa kod tambahan.
  • Corak modular — bungkus getopts dalam fungsi parse_args() untuk menghasilkan skrip yang kemas dan boleh digunakan semula.

Menguasai getopts mengubah skrip anda daripada alat satu tujuan menjadi program CLI yang boleh dipercayai, mesra pengguna dan mematuhi konvensyen Unix.

Percuma untuk bermula

Pelajari Bash dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
22
Pelajaran
88

Soalan Lazim

Adakah pelajaran “Menghurai Bendera dan Argumen dengan getopts” percuma?

Ya — teks penuh “Menghurai Bendera dan Argumen dengan getopts” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Penguasaan Baris Perintah Linux &amp; Penskripan Bash, tingkat taraf kepada CoddyKit PRO. Kursus Penguasaan Baris Perintah Linux &amp; Penskripan Bash merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Menghurai Bendera dan Argumen dengan getopts”?

Laksanakan antara muka baris perintah profesional menggunakan getopts untuk pilihan pendek, argumen wajib dan mesej penggunaan. Anda berlatih Penguasaan Baris Perintah Linux &amp; Penskripan Bash menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Penguasaan Baris Perintah Linux &amp; Penskripan Bash?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Penguasaan Baris Perintah Linux &amp; Penskripan Bash di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Menghurai Bendera dan Argumen dengan getopts” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Penguasaan Baris Perintah Linux &amp; Penskripan Bash ini?

Ya. Setiap pelajaran Penguasaan Baris Perintah Linux &amp; Penskripan Bash menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mereka Bentuk Fungsi dengan Skop Setempat dan Kod Pulangan
  2. Membina dan Memanggil Pustaka Bash Boleh Guna Semula
  3. Menghurai Bendera dan Argumen dengan getopts
  4. Menghantar Tatasusunan dan Peta Bersekutu antara Fungsi
← Kembali ke Penguasaan Baris Perintah Linux &amp; Penskripan Bash