Probleme mit der Erweiterung von Bash-Variablen mit einfachen Anführungszeichen

Probleme mit der Erweiterung von Bash-Variablen mit einfachen Anführungszeichen

Ich habe eine Variable, die ich wie folgt aufbaue:

ATTSTR=""
for file in $LOCALDIR/*.pdf
do
  ATTSTR="${ATTSTR} -a \"${file}\""
done

Die Variable enthält jetzt (beachten Sie die Leerzeichen im Dateinamen):

ATTSTR=' -a "/tmp/Testpage - PDFCreator.pdf"'

Und jetzt möchte ich diese Variable in einem Befehl wie diesem verwenden:

mutt -s "Subject" "${ATTSTR}" [email protected]

Es stellt sich jedoch heraus, dass es folgendermaßen erweitert wird und der Befehl daher fehlschlägt (beachten Sie die hinzugefügten einfachen Anführungszeichen, die die erweiterte Variable umgeben):

mutt -s "Subject" ' -a "/tmp/Testpage - PDFCreator.pdf"' [email protected]

Ich möchte, dass meine Variable ohne einfache Anführungszeichen erweitert wird. Die Verwendung von „ "$ATTSTR"oder“ $ATTSTRist einfach noch schlimmer. Wie kann ich das erreichen?

Antwort1

Dateinamen in erweiterten Zeichenfolgen sind notorisch unzuverlässig; widerstehen Sie dieser Versuchung.

Verwenden Sie stattdessen einAnordnungum die Dateinamen unabhängig von Leerzeichen intakt zu halten:

arr=()
for f in $somedir/*.pdf
do
arr+=( -a "$f")
done

# and for usage/display:

mutt -s mysubject "${a[@]}" some@body

Sehen Sie sich dieBash-Handbuch zu Arraysals Referenz.

Antwort2

Verwenden Sie die Eval-Funktion

command="mutt -s \"Subject\" $ATTSTR [email protected]"
response=$(eval "$command")

verwandte Informationen