$ echo $(date)
Thu Jul 2 16:33:11 SGT 2015
$ echo ${date}
$ name=foo
$ echo $(name)
ksh: name: not found
$ echo ${name}
foo
Anscheinend ist $ {variable} dasselbe wie $ variable. während $ () einen Befehl ausführen soll. Warum dann $ {} verwenden?
${
variable_name
}
Antworten:
$(command)
ist "Befehlsersetzung". Wie Sie zu verstehen scheinen, führt es das auscommand
, erfasst die Ausgabe und fügt sie in die Befehlszeile ein, die das enthält$(…)
. z.B,${parameter}
ist "Parametersubstitution". Viele Informationen finden Sie in der Manpage der Shell, bash (1) , unter der Überschrift „ Parameter Expansion “:Informationen zu Positionsparametern finden Sie weiter unten unter „ Positionsparameter “. Am häufigsten wird, wie in den anderen Antworten gezeigt,
parameter
ein Variablenname verwendet. Mit dem${…}
am Ende des obigen Abschnitts angegebenen Formular können Sie den Wert einer Variablen (dh ) abrufen und dieser unmittelbar einen Buchstaben, eine Ziffer oder einen Unterstrich hinzufügen:$variable_name
Sie können dies auch mit Anführungszeichen tun:
Als Übung zu Optionen können Sie auch eine zweite Variable verwenden:
Dies ist jedoch nur Schritt 1. Der nächste Absatz in der Manpage ist interessant, wenn auch etwas kryptisch:
Ich bin mir nicht sicher, wie ich das klarer machen kann, außer am Beispiel:
Nennen wir diesen Schritt 1½. Es gibt viele interessante Dinge, die Sie als Schritt 2 tun können:
Sie können nichts ohne die
{
...}
Klammern tun .Positionsparameter
Betrachten Sie dieses künstliche Beispiel:
weil die Shell nicht versteht
$10
,$11
usw. Es behandelt,$10
als ob es wäre${1}0
. Aber es versteht${10}
,${11}
usw., wie in der Manpage erwähnt ("ein Positionsparameter mit mehr als einer Ziffer").Das Obige (zusammen mit vielen weiteren Formen von Konstrukten) wird ausführlicher in der Manpage der Shell, bash (1), behandelt .
${parameter…something_else}
Eine Anmerkung zu Anführungszeichen
Beachten Sie, dass Sie Shell-Variablen immer in Anführungszeichen setzen sollten, es sei denn, Sie haben einen guten Grund, dies nicht zu tun , und Sie sind sicher , dass Sie wissen, was Sie tun. Während geschweifte Klammern wichtig sein können, sind sie im Gegensatz dazu nicht so wichtig wie Anführungszeichen.
Dies gilt auch für Positionsparameter (z. B.
"$1"
Befehlszeilenargumente) und auch für die Befehlssubstitution:Eine kurze Abhandlung über die Interaktion zwischen Anführungszeichen und ... finden Sie unter Bash-Anführungszeichen ohne Befehlsersetzung .
$(
)
quelle
!
.${!animal}
bezieht sich eigentlich auf die Variable$cat
anstatt auf den Wert cat." Ja, das ist genau der Punkt. "Wie wird / at ein" c "in echo $ {animal / at / ow}?" Huh? / at wird nicht "c"; "Cat" wird "cow", wenn "at" durch "ow" ersetzt wird.In Ihrem Beispiel sind $ var und $ {var} identisch. Geschweifte Klammern sind jedoch nützlich, wenn Sie die Variable in einer Zeichenfolge erweitern möchten:
Somit bieten die geschweiften Klammern eine Möglichkeit, die Variable zu ersetzen, um den Namen der neuen Variablen zu erhalten, die selbst ersetzt werden soll.
quelle
Ich sehe es normalerweise häufiger in Streichern. So etwas funktioniert nicht:
Aber das wird:
Wie Sie richtig sagten,
$()
wird verwendet, um einen Befehl auszuführen:Sie können auch Backticks verwenden, aber ich finde die
$()
vielseitiger. Zum einen können Backticks nicht (einfach) verschachtelt werden.quelle
date_directory=`ls \`date '+%Y-%m-%d'\``
. Aber es ist schrecklich hässlich.$(…)
ist viel klarer und einfacher zu bedienen.`…`
war die (einzige) Syntax für die Befehlsersetzung vor Jahren$(…)
erfunden worden, so müssen Sie sich nichts vorstellen - die Leute haben es getan.