bash: Richtiges Escaping
Der Martin
- bash-script
- escaping
Hallo miteinander,
ich kämpfe derzeit mit dem korrekten Escaping innerhalb eines bash-Scripts.
Zur Herleitung: Ich gebe folgendes am Shell-Prompt ein:
ffplay -f lavfi 'amovie=/data/mp3/ABBA/Kisses\ Of\ Fire.mp3, asplit [a][out1]; [a] showspectrum=size=1024x480:slide=scroll [out0]'
ffplay ist ein sehr schlanker Video/Audio-Player aus dem ffmpeg-Paket. Mit der genannten Anweisung, die ich in der ffmpeg-Dokumentation gefunden habe, spielt er die mp3-Datei ab und zeigt gleichzeitig ein Video-Fenster mit einem in Echtzeit durchlaufenden Spektraldiagramm. Eine nette Spielerei.
Nun wollte ich dieses unhandliche Kommando aber nicht jedesmal wieder eingeben, also habe ich das in ein Script namens ffaudio gesteckt und den Dateinamen durch $1 ersetzt:
# !/bin/bash
ffplay -f lavfi 'amovie="$1", asplit [a][out1]; [a] showspectrum=size=1024x480:slide=scroll [out0]'
Und jetzt falle ich auf die Schnauze, weil innerhalb der Quotes das Argument $1 nicht mehr expandiert wird. Wie escape ich hier richtig?
Einen schönen Tag noch
Martin
Ja. $1
wird innerhalb einfacher Quotas nicht expandiert. Also mach doppelte drum herum...
echo "\"amovie='$1', asplit [a][out1]; [a] showspectrum=size=1024x480:slide=scroll [out0]\""
Mit
#/usr/bin/bash
set -x
ffplay -f lavfi "\"amovie='$1', asplit [a][out1]; [a] showspectrum=size=1024x480:slide=scroll [out0]\""
Kannst Du beim Ersetzen “zusehen“.
Hallo,
Ja.
$1
wird innerhalb einfacher Quotas nicht expandiert. Also mach doppelte drum herum...echo "\"amovie='$1', asplit [a][out1]; [a] showspectrum=size=1024x480:slide=scroll [out0]\""
na klar, danke. Darauf bin ich nicht gekommen.
Warum einfach, wenn's umständlich auch geht!
Mit
#/usr/bin/bash set -x ffplay -f lavfi "\"amovie='$1', asplit [a][out1]; [a] showspectrum=size=1024x480:slide=scroll [out0]\""
Kannst Du beim Ersetzen “zusehen“.
Okay. Ja, die Feinheiten der bash-Syntax sind für mich auch nach Jahren immer noch oft überraschend.
Einen schönen Tag noch
Martin
Hi,
Wie escape ich hier richtig?
eine Möglichkeit, die auch korrekt funktioniert, habe ich gefunden. Ich lasse die Single Quotes weg und maskiere dafür im String jedes "verdächtige" Zeichen (Blank, eckige Klammern) mit einem Backslash.
#!/bin/bash ffplay -f lavfi amovie="$1"\,\ asplit\ \[a\]\[out1\]\;\ \[a\]\ showspectrum=size=1024x480\:slide=scroll\ \[out0\]
Ist das der Weisheit letzter Schluss, oder geht das noch eleganter?
Einen schönen Tag noch
Martin
Ist das der Weisheit letzter Schluss, oder geht das noch eleganter?
Naja. Die Bash und Eleganz. Da darfst Du von den 70er Jahren nicht zu viel erwarten… Aber wenigstenz kann man mit set -x
zusehen. (Nachgeschobener Teil meiner ersten Antwort)