2013-04-18 7 views
22

Es ist ziemlich klar, dass mit Shell-Skripten diese Art von Sache auf eine Vielzahl von Wegen (mehr als die meisten Programmiersprachen) wegen all der erreicht werden kann verschiedene variable Expansionsverfahren und Programme wie test und [ und [[ usw.Bash: Wie man eine Variable aus dem Argument und mit einem Standardwert setzt

im Moment suche ich nur für

DIR=$1 or . 

Bedeutung, meine DIR Variable enthalten sollte entweder, was in der ersten arg angegeben ist oder das aktuelle Verzeichnis

Was ist der Unterschied zwischen diesem und DIR=${1-.}?

Ich finde die Bindestrichsyntax verwirrend, und suchen Sie besser lesbare Syntax.

Warum kann ich das nicht tun?

DIR="$1" || '.' 

ich dies zu raten bedeutet „wenn $ 1 leer ist, noch die Zuordnung arbeitet (DIR leer wird), so dass der ungültige Befehl‚‘ wird nie ausgeführt. "

+0

fand ich meine Antwort auf das, was die Doppelpunkt bedeutet: http://wiki.bash-hackers.org/syntax/pe#use_a_default_value –

+2

die Sprache Umarmung. Nicht alle Sprachen haben die gleichen Idiome. 'DIR = $ {1: -.}' Ist eine vollkommen natürliche Art, diese Logik in jeder POSIX-kompatiblen Shell auszudrücken. – chepner

+1

Ich finde den Downvote, um völlig gerechtfertigt zu sein. Ich mag die Art, wie ich diese Frage geschrieben habe, nicht. Ich war damals frustriert. Aber seit ich das gepostet habe, hatte ich nie Probleme, mich an die '$ {VAR: -default}' -Syntax zu erinnern. Ich werde meine Frage bearbeiten, um sie weniger kleinlich zu machen. Ich bin sicher, du warst nicht der Downvoter @chepner, aber du hast absolut recht! –

Antwort

38

Ich sehe hier einige Fragen.

  1. „Kann ich etwas schreiben, das diese Logik tatsächlich widerspiegelt“

    Ja. Es gibt ein paar Möglichkeiten, wie Sie es tun können. Hier ist eine:

    if [[ "$1" != "" ]]; then 
        DIR="$1" 
    else 
        DIR=. 
    fi 
    
  2. „Was ist der Unterschied zwischen diesem und DIR=${1-.}?“

    Die Syntax ${1-.} expandiert nach . wenn $1 ist nicht gesetzt, sondern erweitert wie $1 wenn $1 Set-even, wenn $1 ist auf die leere Zeichenfolge festlegen.

    Die Syntax ${1:-.} wird auf . erweitert, wenn $1 nicht festgelegt ist oder auf die leere Zeichenfolge gesetzt ist. Es wird wie $1 nur erweitert, wenn $1 auf etwas anderes als die leere Zeichenfolge festgelegt ist.

  3. "Warum kann ich das nicht tun? DIR="$1" || '.' "

    Weil dies Bash ist, nicht Perl oder Ruby oder eine andere Sprache. (Verzeihen Sie meine Snidness.)

    In Bash trennt || ganze Befehle (technisch trennt es Pipelines). Es trennt keine Ausdrücke.

    Also DIR="$1" || '.' bedeutet "execute DIR="$1", und wenn das mit einem Nicht-Null-Exit-Code endet, führen Sie ".

2

Wie dies etwa:

DIR=. 
if [ $# -gt 0 ]; then 
    DIR=$1 
fi 

$# ist die Anzahl der Argumente an das Skript gegeben, und -gt bedeutet „größer als“, so dass Sie im Grunde DIR auf den Standardwert gesetzt, und wenn der Benutzer angegeben hat ein Argument, dann setzen Sie stattdessen DIR.

+1

Das ist nicht schrecklich, obwohl vier Zeilen definitiv zu viel für meinen Geschmack scheinen. Ich würde lieber die Bindestrich-Var-Erweiterung verwenden, da ich bereits weiß, was es an diesem Punkt bedeutet. –

Verwandte Themen