Menghurai Bendera dan Argumen dengan getopts
Laksanakan antara muka baris perintah profesional menggunakan getopts untuk pilihan pendek, argumen wajib dan mesej penggunaan.
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
OPTINDdanOPTARGsecara 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
doneMentakrifkan 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'—-amemerlukan argumen;-bdan-ctidak 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 1daripada laluan ralat danusage 0daripada 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!"
doneMenggabungkan Bendera pada Baris Perintah
getopts mengendalikan bendera pendek bergabung yang ditulis tanpa ruang secara automatik, selaras dengan konvensyen Unix standard:
-v -qadalah setara dengan-vq-n 5 -vadalah setara dengan-n5 -vatau-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"
doneMembungkus 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
globalatau hantarkan nilai melalui nameref (declare -n) - Kembalikan kod keluar bukan sifar untuk masukan yang salah supaya
mainboleh 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; doUlang 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
-hdan keluar dengan 1 untuk ralat. - Bendera bergabung — getopts mengendalikan
-vqdan-n5secara 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.
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 & Penskripan Bash, tingkat taraf kepada CoddyKit PRO. Kursus Penguasaan Baris Perintah Linux & 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 & 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 & Penskripan Bash?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Penguasaan Baris Perintah Linux & 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 & Penskripan Bash ini?
Ya. Setiap pelajaran Penguasaan Baris Perintah Linux & 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
- Mereka Bentuk Fungsi dengan Skop Setempat dan Kod Pulangan
- Membina dan Memanggil Pustaka Bash Boleh Guna Semula
- Menghurai Bendera dan Argumen dengan getopts
- Menghantar Tatasusunan dan Peta Bersekutu antara Fungsi