Getopts - Getopts

Getopts
Geliştirici (ler)Çeşitli açık kaynak ve ticari geliştiriciler
İlk sürüm1986; 34 yıl önce (1986)
İşletim sistemiUnix, Unix benzeri, IBM i
TürKomut

Getopts bir yerleşik Unix kabuğu ayrıştırma komutu komut satırı argümanları. POSIX Yardımcı Program Sözdizimi Yönergelerini izleyen komut satırı argümanlarını, C arayüzüne dayalı olarak işlemek için tasarlanmıştır. getopt.

Selefi Getopts harici programdı getopt tarafından Unix Sistem Laboratuvarları.

Tarih

Orijinal getopt birkaç sorunu vardı: bağımsız değişkenlerdeki boşlukları veya kabuk meta karakterlerini işleyemiyordu ve hata mesajlarının çıktısını devre dışı bırakma yeteneği yoktu.[1]

Getopts ilk olarak 1986 yılında Bourne kabuğu Unix SVR3 ile birlikte gönderilir. Mevcut ve argüman konumlarının konumunu izlemek için kabuğun kendi değişkenlerini kullanır, OPTIND ve OPTARGve seçenek adını bir kabuk değişkeninde döndürür.[2] Bourne kabuğunun önceki versiyonlarında Getopts.

1995'te, Getopts dahil edildi Tek UNIX Belirtimi versiyon 1 / X / Açık Taşınabilirlik Yönergeleri Sayı 4.[3] Sonuç olarak, Getopts artık dahil mermilerde mevcut Bourne kabuğu, KornShell, Almquist kabuğu, Bash ve Zsh.[4]

Getopts komut aynı zamanda IBM i işletim sistemi.[5]

Modern kullanımı getopt , temelde geliştirilmiş bir uygulama nedeniyle kısmen yeniden canlandırıldı util-linux. BSD'ye dayalı bu sürüm getopt, sadece eski etrafındaki iki şikayeti düzeltmekle kalmadı getopt, ama aynı zamanda GNU tarzı uzun seçenekleri ayrıştırma yeteneği ve seçenekler için isteğe bağlı argümanlar, Getopts yoksundur.[6] Bununla birlikte, çeşitli BSD dağıtımları eski uygulamaya bağlı kaldı.[1]

Kullanım

Getopt ve getopts kullanım özeti şuna benzer: C kardeşi:

getopt Optstring [parametreler]Getopts Optstring varname [parametreler]
  • Optstring bölümü C kardeşiyle aynı formata sahiptir.
  • parametreleri bölüm basitçe getopt'un ayrıştırmasını istediği şeyi kabul eder. Ortak bir değer tüm parametrelerdir, "$@" POSIX kabuğunda.
    • Bu değer getoptlarda bulunur ancak kabuğun parametrelerine erişebildiği için nadiren kullanılır. Bununla birlikte, ayrıştırıcıyı sıfırlamakta kullanışlıdır.
  • varname getopts'un bir kısmı, ayrıştırılan seçeneği saklamak için bir kabuk değişkenini adlandırır.

Ancak komutları kullanma şekli çok değişir:

  • getopt, "normalleştirilmiş" bağımsız değişkeni temsil eden boşluklarla ayrılmış simgeler içeren düz bir dize döndürür. Biri daha sonra onu saf bir şekilde ayrıştırmak için while döngüsü kullanır.[1]
  • getopts, C getopt gibi tekrar tekrar adlandırılır. Bağımsız değişkenlerin sonuna ulaştığında 1 (kabuk yanlış) döndürür.[3]

Geliştirmeler

Çeşitli jetoptlarda

2004 ilkbaharında (Solaris 10 beta geliştirme), libc uygulaması getopt () uzun seçenekleri desteklemek için geliştirilmiştir. Sonuç olarak, bu yeni özellik yerleşik komutta da mevcuttu Getopts Bourne Shell'den. Bu, parantez içindeki son ekler tarafından tetiklenir. Optstring uzun takma adlar belirleme.[7]

KornShell ve Zsh her ikisinin de uzun argümanlar için bir uzantısı vardır. İlki Solaris'teki gibi tanımlanmıştır,[8] ikincisi ayrı bir Zparseopts komut.[9]

KornShell ek olarak uygular Optstring ile başlayan seçenekler için uzantılar + onun yerine -.[8]

Linux getopt'ta

Bir alternatif Getopts Linux'un geliştirilmiş sürümüdür getopt, harici komut satırı programı.

Linux geliştirilmiş sürümü getopt ekstra güvenliğe sahiptir Getopts artı daha gelişmiş özellikler. Uzun seçenek adlarını destekler (ör. --Yardım) ve seçeneklerin tüm işlenenlerden önce görünmesi gerekmez (örn. komut operand1 operand2 -a operand3 -b Linux geliştirilmiş sürümü tarafından izin verilir getopt ama ile çalışmıyor Getopts). Ayrıca, kabuklar için kaçan meta karakterleri de destekler ( tcsh ve POSIX sh ) ve isteğe bağlı argümanlar.[6]

Karşılaştırma

Program
Özellik
POSIX getoptsSolaris getoptsUnix / BSD getoptLinux getopt
Kolay ayrıştırma için seçenekleri ayırırEvetEvetEvetEvet
Hata mesajlarının bastırılmasına izin verirEvetEvetHayırEvet
Beyaz boşluklar ve meta karakterlerle güvenliEvetEvetHayırEvet
İşlenenlerin seçeneklerle karıştırılmasına izin verirHayırEvetHayırEvet
Uzun seçenekleri desteklerEmülasyonEvetHayırEvet
İsteğe bağlı argümanlarHata yönetimiHata yönetimiHayırEvet

Örnekler

Bash'de üç seçenek ve sıfır ekstra argüman alan bir Wikipedia indiricisi oluşturduğumuzu varsayalım:

wpdown -a Makale adı -l [dil] -v

Mümkün olduğunda, aşağıdaki uzun tartışmalara izin veririz:

-a --article-l --language, --lang-v --verbose

Netlik açısından, yardım metni dahil edilmemiştir ve herhangi bir web sayfasını indiren bir program olduğunu varsayıyoruz. Ek olarak, tüm programlar şu biçimdedir:

#! / bin / bashVERBOSE=0MAKALE=''LANG=en# [BURAYA ÖRNEK]Eğer ((VERBOSE> 2)); sonra  printf "% s" 'Seçenek olmayan argümanlar:'  printf '% q' "${kalan[@]]}"fiEğer ((VERBOSE> 1)); sonra  printf "% S indiriliyor:% s" "LANG" "$ MAKALE"fiEğer [[ ! $ MAKALE ]]; sonra  printf "% s" "Makale yok!">&2  çıkış 1fisave_webpage "https: //${LANG}.wikipedia.org / wiki /${MAKALE}"

Eski getopt kullanma

Eski getopt, isteğe bağlı bağımsız değişkenleri desteklemez:

# her şeyi ayrıştırın; başarısız olursa kefaletle çıkarızargümanlar=`getopt 'a: l: v' $*` || çıkış# şimdi sterilize edilmiş argümanlar var ... orijinali bununla değiştirinAyarlamak -- $ argssüre doğru; yapmak    durum $1 içinde (-v)   ((VERBOSE ++));  vardiya;;      (-a)   MAKALE=$2; vardiya 2;;      (-l)   LANG=$2; vardiya 2;;      (--)   vardiya; kırmak;;      (*)    çıkış 1;;           # hata    esacbittikalan=("$@")

Bu komut dosyası, içinde boşluk veya kabuk meta karakteri (? Veya * gibi) olan herhangi bir makale başlığından da kopar.

Getopts kullanma

Getopts, betiğe C arayüzünün görünümünü ve hissini verir, ancak POSIX'te isteğe bağlı argümanlar hala eksiktir:

#! / bin / shsüre Getopts ': a: l: v' seçmek; yapmak    durum $ opt içinde (v)   ((VERBOSE ++));;      (a)   MAKALE=$ OPTARG;;      (l)   LANG=$ OPTARG;;      (:)   # "isteğe bağlı bağımsız değişkenler" (seçenek bağımsız değişken işleme eksik)            durum $ OPTARG içinde (a) çıkış 1;; Söz dizimimize göre # hata              (l) :;;      # kabul edilebilir ama hiçbir şey yapmıyor            esac;;    esacbittivardiya "$ OPTIND"Kalan # "$ @"

Artık doğrudan kabuk seçenekleri üzerinde çalışmadığımız için, artık onları değiştirmemize gerek yok. Ancak, kalan argümanları şimdi almak için bir dilimleme işlemi gereklidir.

Mümkün, ancak uzun argüman desteğini taklit etmek --hızlı argüman olarak hızlı bir seçeneğe -.[10]

Linux getopt kullanarak

Linux getopt, çıktısından kaçar ve kabuğun onu yorumlaması için bir "eval" komutu gerekir. Gerisi değişmedi:

# Bağımsız değişken-sınır bilgisini korumak için $ * yerine "$ @" kullanıyoruzARGS=$(getopt -o 'a: l :: v' --uzun 'makale:, dil ::, lang ::, ayrıntılı' -- "$@") || çıkışdeğerlendirme "Ayarlamak -- ARGS"süre doğru; yapmak    durum $1 içinde (-v|--verbose)            ((VERBOSE ++)); vardiya;;      (-a|--makale)            MAKALE=$2; vardiya 2;;      (-l|--lang|--dil)            # handle isteğe bağlı: getopt onu boş bir dizeye normalleştirir            Eğer [ -n "$2" ]; sonra              LANG=$2; vardiya;            fi            vardiya;;      (--)  vardiya; kırmak;;      (*)   çıkış 1;;           # hata    esacbittikalan=("$@")

Ayrıca bakınız

Referanslar

  1. ^ a b c getopt (1) – FreeBSD Genel Komutlar Manuel
  2. ^ Mascheck, Sven. "Geleneksel Bourne Kabuğu Ailesi". Alındı 2010-12-01.
  3. ^ a b "getopts". Açık Grup (POSIX 2018).
  4. ^ https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtin
  5. ^ IBM. "IBM System i Sürüm 7.2 Programlama Qshell" (PDF). Alındı 2020-09-05.
  6. ^ a b getopt (1) – Linux Genel Komutlar Manuel
  7. ^ "getopt (3)". Oracle Solaris 11.2 Bilgi Kitaplığı.
  8. ^ a b "ksh getopts - seçenekleri kabuk betiği komut satırından ayrıştır". www.mkssoftware.com.
  9. ^ zshmodüller (1) – Linux Genel Komutlar Manuel
  10. ^ https://gist.github.com/webb/ff380b0eee96dafe1c20c2a136d85ef0

Dış bağlantılar