Bash-Befehlsersetzung funktioniert nicht

Bash-Befehlsersetzung funktioniert nicht

Dies ist das Skript:

#!/bin/bash

thedate=$(date)


var='Current date is $thedate'

echo $var

Die Ausgabe lautet „Aktuelles Datum ist $thedate“ und ich möchte, dass das Datum angezeigt wird. Was habe ich falsch gemacht? Für jede Hilfe wäre ich dankbar.

Antwort1

Das Problem besteht darin, dass bashUmgebungsvariablen nur einmal erweitert werden, es sei denn, Sie verwenden eval, was dazu führt, dass die Befehlszeile zweimal analysiert wird:

eval echo $var

Beachten Sie, dass das angezeigte Datum und die Uhrzeit die aktuellen sind, wenn thedateeingestellt wird, und nicht die, wenn $varreferenziert wird. Um die aktuelle Zeit anzuzeigen, wenn $varreferenziert wird, benötigen Sie:

var='Current date is $(date)'
eval echo $var

Es wäre besser, keine Variablen zu verwenden, sondern eine Funktion zu definieren:-

cdate() { echo Current date is $(date); }
...
cdate

Besser ist es natürlich trotzdem, nicht zu verwenden echo, sondern dateden zusätzlichen Text selbst hinzuzufügen:

cdate() { date +"Current date is %c"; }

Die Ausgabe erfolgt nicht ganz im gleichen Format wie die dateStandardausgabe, es gibt jedoch keinen Formatbezeichner für die Standardausgabe.

Antwort2

var='Current date is $thedate'

Variablen werden in einfachen Anführungszeichen nicht erweitert. Daher wird hier ein String zugewiesen, der den wörtlichen Text enthält $thedate. Sie sollten hier doppelte Anführungszeichen verwenden, um die Variable zu erweitern.

echo $var

Außerdem sollten Sie hier doppelte Anführungszeichen um die Variable setzen, um zu verhindern, dass sie einer Worttrennung und Pfadnamenerweiterung unterliegt, d. h. echo "$var". In diesem speziellen Fall können Sie größtenteils auf die Verwendung von Anführungszeichen verzichten, da das Datum wahrscheinlich keine Platzhalterzeichen enthält. Aber ohne Anführungszeichen würde die Datumszeichenfolge beispielsweise Fri Dec 7 20:41:21 EET 2018als ausgegeben Fri Dec 7 20:41:21 EET 2018, d. h. das doppelte Leerzeichen nach dem Monatsnamen würde zu einem einzelnen Leerzeichen reduziert.

Antwort3

Verwenden Sie doppelte Anführungszeichen statt einfacher Anführungszeichen. Bash erweitert Variablen in einfachen Anführungszeichen nicht.

verwandte Informationen