Bash-Shell: Wie weist man ein mit BC berechnetes Ergebnis einer Variablen zu und druckt es aus?

Bash-Shell: Wie weist man ein mit BC berechnetes Ergebnis einer Variablen zu und druckt es aus?

Ich versuche, den Code zu replizieren vonHierBildbeschreibung hier eingeben

Aus irgendeinem Grund funktioniert es auf meinem Computer nicht. Die Ausgabe und nicht der numerische Wert ist der Befehl selbst.

apple$ x='echo "var=500;var%=7;var"|bc'
apple$ $x
"var=500;var%=7;var"|bc

Ich würde gerne wissen, warum das so ist. Was habe ich falsch gemacht?

Antwort1

Die Quelle verwendet Backticks ( `), um die Befehlsersetzung anzuzeigen. Der innerhalb der Backticks angegebene Befehl wird ausgeführt und das Ergebnis an seine Stelle gesetzt. In diesem Fall handelt es sich um eine einfache Variablenzuweisung, sodass das Ergebnis des Befehls der Variablen zugewiesen wird.

-xDies lässt sich leicht mit der Option zum Bashen erkennen :

$ x=`echo "var=500;var%=7;var"|bc`
++ echo 'var=500;var%=7;var'
++ bc
+ x=3

Anstelle der Backtick-Zeichen haben Sie einfache Anführungszeichen verwendet. Einfache Anführungszeichen weisen die Shell an, den Literalwert beizubehalten und keinerlei Verarbeitung auf seinen Inhalt anzuwenden. Als Ergebnis wird der Befehl unverändert der Variablen zugewiesen. Dies ist die entsprechende -xAusgabe:

$ x='echo "var=500;var%=7;var"|bc'
+ x='echo "var=500;var%=7;var"|bc'

Zum Ausdrucken des Variableninhalts sollten Sie schließlich echooder verwenden printf. Wenn der Wert von „x“ 3 ist, würde die Ausführung eine Fehlermeldung $xausgeben . Die Ausführung hat in Ihrem Fall nur funktioniert, weil der Befehl Teil des Variableninhalts war.-bash: 3: command not found$xecho

Antwort2

Wie Haxiel bemerkt hat, haben Sie anstelle der Backtick-Zeichen höchstwahrscheinlich einfache Anführungszeichen verwendet. Aber besser als Backticks ( `) schlage ich vor, dass Sie verwenden $(). Backticks sind veraltet und $()POSIX-kompatibel.

In Ihrem Beispiel könnten Sie Folgendes tun:

x=$(echo "var=500;var%=7;var" | bc)
echo "$x"

Oder in einem Einzeiler:

echo "var=500;var%=7;var" | bc

verwandte Informationen