In Beginn der Linux-Programmierung Buchen. Es gibt einen Abschnitt über Anweisungsblock . In diesem Abschnitt sieht die Erklärung wie folgt aus.
Anweisungsblöcke
Wenn Sie mehrere Anweisungen an einer Stelle verwenden möchten, an der nur eine zulässig ist, wie z. B. in einer UND- oder ODER-Liste,
können Sie dies tun, indem Sie sie in geschweifte Klammern {} einschließen, um einen Anweisungsblock zu bilden. Sehen Sie sich beispielsweise den folgenden Code an:
get_confirm && {
grep −v "$cdcatnum" $tracks_file > $temp_file
cat $temp_file > $tracks_file
echo
add_record_tracks
}
Bitte erklären Sie, wie der Code im Anweisungsblock ausgeführt wird…
Akzeptierte Antwort:
Der Code in { ... }
genau so ausführen, wie es ohne die geschweiften Klammern ausgeführt worden wäre, außer dass es jetzt vom Exit-Status von get_confirm
abhängig ist .
Wenn get_confirm
mit einem Null-Exit-Status („Erfolg“) beendet wird, wird der Block ausgeführt, andernfalls nicht.
Es ist äquivalent zu
if get_confirm; then
# the contents of the block goes here
fi
(was meiner Meinung nach schöner aussieht)
Das Beispiel des Buches ist meiner Meinung nach kein gutes Beispiel für eine übliche Verwendung von { ... }
. Ein besseres Beispiel wäre gewesen
{ echo 'hello world'; date; } >file
die eine einzige Umleitung verwendet, um die Standardausgabe beider Befehle im { ... }
umzuleiten Block in dieselbe Datei.
Dies ist ähnlich (und hat in diesem Fall den gleichen Effekt wie)
( echo 'hello world'; date ) >file
aber die Anweisungen innerhalb von { ... }
wird in derselben Umgebung wie die Shell ausgeführt, während die Anweisungen in ( ... )
wird in einer Subshell (einer separaten Umgebung) ausgeführt.
Sie können den Unterschied mit
sehen{ a=42; }; echo $a
und
( a=1973 ); echo $a
Der erste gibt 42
aus während die zweite nicht 1973
ausgibt (Die Zuweisung erfolgt in einer Unterschale und kann die Umgebung außerhalb nicht beeinflussen).
Hinweis zur Grammatik:Der abschließende }
eines { ... }
block muss auf einen Zeilenumbruch oder einen ;
folgen . { echo 'hello' }
ist nicht gültig, während sowohl { echo 'hello'; }
und
{
echo 'hello'
}
sind.