2017-07-03 5 views
0

ich eine Option in einem Shell-Skript Parsen tat bedeutete in dash und bash Insourcing werden, und ich habe einige seltsame Ergebnisse in bash, so habe ich das Wesen des Skripts in:Sehr unterschiedliche getopts Ergebnisse mit verschiedenen Schalen

./getopts:

fn() 
{ 
    local verbose opt 
    while getopts "v" opt; do 
     case "$opt" in v) verbose=1;; ?) return 1;; esac 
    done; shift $((OPTIND - 1)) 
    echo -n "'$verbose' " 
} 
fn -v; fn -v; fn -v; printf '\n' 

und lief diese mit verschiedenen (local -Unterstützung) Schalen:

for sh in bash dash posh zsh; do echo SH=$sh; $sh ./getopts; done 

Die Ergebnisse Ich habe sind:

SH=bash 
'1' '' '' 
SH=dash 
'1' '1' '1' 
SH=posh 
'1' '' '1' 
SH=zsh 
'1' '1' '1' 

Was sind die Gründe für diese Diskrepanzen? Ist das Problem mit bash und posh oder mein Skript?

Antwort

2

Sie müssen OPTIND zurück zu 1 vor der getopts Schleife, so wird es vom ersten Argument beginnen.

In bash wird OPTIND automatisch nur initialisiert, wenn das Skript gestartet wird, in zsh und dash es initialisiert wird, wenn eine Funktion eingeben und auf den alten Wert zurückgesetzt, wenn von der Funktion zurückkehrt. Ich bin mir nicht sicher, was posh tut.

Entsprechend der zsh Dokumentation können Sie es ähnlich wie bash durch Einstellung der POSIX_BUILTINS Option handeln. Ich nehme an, dass das Verhalten bash mit den POSIX-Anforderungen übereinstimmt und dass zsh und dash widersprüchlich sind.

+0

Danke. Wird akzeptieren, wenn SO mich lässt. – PSkocik

Verwandte Themen