2014-12-14 22 views
27

Ich habe zwei Fragen und könnte einige helfen mir, sie zu verstehen.

  1. Was ist der Unterschied zwischen ${} und $()? Ich verstehe, dass () bedeutet, dass Befehl in separaten Shell ausgeführt wird und $ bedeutet den Wert an Variable übergeben. Kann mir jemand beim Verstehen helfen das? Bitte korrigieren Sie mich, wenn ich falsch liege.

  2. Wenn wir /bash$ for ((i=0;i<10;i++)); do echo $i; done verwenden können und es funktioniert gut, warum kann ich es nicht als /bash$ while ((i=0;i<10;i++)); do echo $i; done verwenden? Was ist der Unterschied im Ausführungszyklus für beide?

Antwort

43

Die Syntax ist Token-Ebene, so dass die Bedeutung des Dollarzeichens hängt von dem Token in es ist der Ausdruck $(command) ein modernes Synonym für `command` ist, die für den Befehl Substitution steht. es bedeutet, command laufen lassen und seine Ausgabe hier setzen.So

echo "Today is $(date). A fine day." 

laufen den date Befehl führen und dessen Ausgang in dem Argumente zu echo. Die Klammern beziehen sich nicht auf die Syntax zum Ausführen eines Befehls in einer Untershell, obwohl sie etwas gemeinsam haben (die Befehlsersetzung wird auch in einer separaten Untershell ausgeführt).

dagegen ${variable} ist nur ein Begriffsklärung Mechanismus, so können Sie ${var}text sagen, wenn Sie meinen, der Inhalt der Variable var, gefolgt von text (im Gegensatz zu $vartext Gegensatz was bedeutet, der Inhalt der Variable vartext).

Die while Schleife erwartet ein einzelnes Argument, das zu wahr oder falsch (oder tatsächlich multiple, wo der Wahrheitswert der letzten Eins untersucht wird - Jonathan Leffler für das Aufzeigen dieses auszuwerten); Wenn es falsch ist, wird die Schleife nicht mehr ausgeführt. Die for-Schleife iteriert über eine Liste von Elementen und bindet diese wiederum jeweils an eine Schleifenvariable an. Die Syntax, auf die Sie sich beziehen, ist eine - eher generalisierte - Möglichkeit, eine Schleife über einen Bereich arithmetischer Werte auszudrücken.

Eine for Schleife wie diese kann als while Schleife umformuliert werden. Der Ausdruck

for ((init; check; step)); do 
    body 
done 

entspricht

init 
while check; do 
    body 
    step 
done 

es sinnvoll, alle die Schleifensteuerung an einem Ort für die Lesbarkeit zu halten macht; Aber wie Sie sehen können, wenn es so ausgedrückt wird, macht die for Schleife einiges mehr als die while Schleife.

Natürlich ist diese Syntax Bash-spezifisch; klassische Bourne-Shell hat nur

for variable in token1 token2 ...; do 

(Etwas elegant, können Sie die echo im ersten Beispiel vermeiden könnte, solange Sie sicher sind, Ihr Argument Zeichenfolge enthält keine % Formatcodes:

date +'Today is %c. A fine day.' 

einen Prozess vermeiden, wo Sie eine wichtige Überlegung, lernen kann, auch wenn es in diesem isolierten Beispiel nicht viel Unterschied.)

+1

Genau genommen erwartet ein while-Befehl eine Folge von Befehlen (nicht unbedingt eine Pipeline), und der Beendigungsstatus des letzten Befehls in der Sequenz bestimmt, ob die Schleife fortgesetzt wird oder nicht. Also: 'während ls; pwd; Datum; hallo hallo; Schlaf 1; done "ist gültig, und der Exit-Status von" date "steuert, ob die Schleife fortgesetzt wird oder nicht. Ich habe Semikolons verwendet, weil Sie keine Zeilenumbrüche in einem Kommentar formatieren können, aber Sie könnten die Befehle in mehrere Zeilen in einem Shell-Skript schreiben. –

-1
  1. Ihr Verständnis ist richtig. Für detaillierte Informationen über {} siehe bash ref - parameter expansion

  2. 'für' und 'während' haben unterschiedliche Syntax und bieten verschiedene Stile der Programmierer-Steuerung für eine Iteration. Die meisten nicht-asm Sprachen bieten eine ähnliche Syntax.

Mit während, würden Sie wahrscheinlich schreiben i=0; while [ $i -lt 10 ]; do echo $i; i=$((i + 1)); done im Wesentlichen verwalten alles über die Iteration selbst

+0

Nicht mein Down-Vote, aber das OP scheint verwirrend '(command ...)' mit '$ (commnd ...)' zu sein, die im Detail ziemlich unterschiedlich sind, obwohl sie auch einige Gemeinsamkeiten haben. Daher ist deine erste Beobachtung nicht ganz genau; das Verständnis des OP ist nicht ganz korrekt. –

+2

_Meisten Nicht-Asm-Sprachen bieten eine ähnliche Syntax._ Was ??? –

+0

@gniourf_gniourf FOR syntax. In den meisten Nicht-Assembler-Sprachen (in meinem begrenzten Wissen), nicht einige alte wie Algol – Dinesh

15
  1. $() bedeutet: „Erster bewerten und dann den Rest der Zeile bewerten“.

    Ex:

    echo $(pwd)/myFile.txt 
    

    als

    echo /my/path/myFile.txt 
    

    Auf der anderen Seite interpretiert werden ${} erweitert eine Variable.

    Ex:

    MY_VAR=toto 
    echo ${MY_VAR}/myFile.txt 
    

    als

    echo toto/myFile.txt 
    
  2. Warum interpretiert werden kann, nicht, dass ich es verwenden, wie bash$ while ((i=0;i<10;i++)); do echo $i; done

    ich die Antwort Angst habe, ist nur dass die Bash-Syntax für while einfach nicht das Gleiche ist wie die Syntax für for.

+2

"zuerst auswerten und dann den Rest der Zeile auswerten" - ich verstehe diese Beschreibung von '$ (...)' nicht. –