Der Martin: bash: Richtiges 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

--
"Hab ich vergessen" ist oft nur ein Euphemismus für "Hab ich noch nie verstanden".

akzeptierte Antworten

  1. 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“.

    1. 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

      --
      "Hab ich vergessen" ist oft nur ein Euphemismus für "Hab ich noch nie verstanden".
  2. 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

    --
    "Hab ich vergessen" ist oft nur ein Euphemismus für "Hab ich noch nie verstanden".
    1. 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)