Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Wie maskiert man ein Single Quote in einem echo Befehl in der bashrc?

  1. #1
    Registrierter Benutzer
    Registriert seit
    Jul 2008
    Beiträge
    146

    Wie maskiert man ein Single Quote in einem echo Befehl in der bashrc?

    Hallo
    ich habe auf meinen Ubuntu Server in der ~/.bashrc einige Alias eingerichtet, auch welche wo ich mit echo Befehlen Infos ausgebe, oft über Kommandos u.ä. zB:

    Code:
    alias testquote='echo" 
    Infos über dies und das
    "'
    Aber jetzt will ich in einem echo Befehl innerhalb von Double Quotes auch ein Apostroph ("'" - Single Quote) eingeben, aber das kriege ich nicht hin, zB:

    Code:
    alias testquote='echo" \'das geht nicht"'
    Das wirft mir einen Fehler, ich weiß nicht, wie ich innerhalb zweier Anführungszeiten (Double Quote) ein einfaches Anführungszeichen, also einen Apostroph maskieren kann.
    Ohne Backslash gibt es erst recht einen Fehler. Die normalen Anführungszeichen für den echo-Befehl brauche ich aber, weil ich oft Variablen mit rein packe, zB bei Funktionen.
    Außerdem habe ich das echo ja auch innerhalb des Alias-Befehls, der schon mit Apostrophen eingepackt wird.

    Single quote within double quotes and the Bash reference manual hat mir auch nichts gebracht.

    Wie macht man das?
    Danke für Tipps.
    franc

  2. #2
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    Code:
    nopes@somehost:~ $ alias foo="echo this is a quoting 'test'"
    nopes@somehost:~ $ foo
    this is a quoting test
    nopes@somehost:~ $ alias foo="echo this is a quoting \'test\'"
    nopes@somehost:~ $ foo
    this is a quoting 'test'
    nopes@somehost:~ $ alias foo="echo \"this is a quoting \'test\'\""
    nopes@somehost:~ $ foo
    this is a quoting \'test\'
    nopes@somehost:~ $ alias foo="echo \"this is a quoting 'test'\""
    nopes@somehost:~ $ foo
    this is a quoting 'test'
    nopes@somehost:~ $ alias foo='echo "this is a quoting '\''test'\''"'
    nopes@somehost:~ $ foo
    this is a quoting 'test'
    nopes@lars-sdr:~ $
    Choose your pain
    Ich bevorzuge doppelte Quotes, da ist für mich das Escapen am einfachsten; die Shell spielt auch mit rein, wirklich dopplte Quotes und gut ist.
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  3. #3
    Registrierter Benutzer
    Registriert seit
    Jul 2008
    Beiträge
    146
    Danke!
    Das ist ja abgefahren
    In meinem Fall wäre es also das:
    Code:
    alias testquote='echo "Das geht: '\''test'\''"'
    root@MacBook:~# testquote
    Das geht: 'test'
    Dieses Escapen verstehe ich gar nicht. Die Escape-Sequenz für das Apostroph ist dann:
    Code:
    '\'
    Apostroph, Backslash, Apostroph???
    Aber gehen tuts, allerdings ist das völlig unleserlich für mich, da nehm ich in Zukunft auch lieber die Doppelten
    Also das:
    Code:
    alias foo="echo this is a quoting \'test\'"
    erscheint mir noch am schlüssigsten.
    EDIT: ach Mist, damit kann ich aber nicht mehrzeilig schreiben! Und mit \n wird auch kein Zeilenumbruch eingefügt.
    Geändert von franc (20.02.24 um 07:03 Uhr)

  4. #4
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.255
    Wo ist das Problem
    druuhl@druuhl:~$ foo=$(echo "quiting foo 'test' test")
    druuhl@druuhl:~$ echo $foo
    quiting foo 'test' test
    Hint, den kompletten String mit double quotes versehen, darin single quotes
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  5. #5
    Registrierter Benutzer Avatar von Huhn Hur Tu
    Registriert seit
    Nov 2003
    Ort
    Karlsruhe
    Beiträge
    2.255
    Aber ich sehe, das problem ist in der Ausfruehrung als Alias gnarf
    Zwischen anonym sein wollen und seine Daten nicht verkaufen wollen, liegen zwei Welten. Wenn man sich einen kostenpflichtigen Dienst sucht, dann meist, weil man für diese Dienstleistung zahlt und nicht selbst das Produkt sein will.


  6. #6
    Registrierter Benutzer
    Registriert seit
    Jul 2008
    Beiträge
    146
    Das wäre ein typischer Alias (mein Muster: <Befehl>doc), wie ich ihn oft verwende:

    
    Code:
    alias renamedoc='echo "
      Mit rename (Perl) oder mmv (Multiple MoVe) kann man mit Muster mehre Dateien umbenennen, siehe:
    
      https://stackoverflow.com/questions/11809666/rename-files-using-regular-expression-in-linux
    
      oder auch die bashfu Funktion renameext (auf Rasp5, rasp, server und MacBook vorhanden).
    
      rename ersetzt mit Perl-Regex-Syntax und Dateimuster, zB:
      Datei(en): \"Blabla bla S01E01.mp3\" soll das Blabla bla weg:
      rename -n \"s/Blabla bla S(\d{2})E(\d{2})\.mp3\$/S\$1E\$2\.mp3/\" *.mp3
    
      mmv sucht in allen Dateien des akt. Verz. und ersetzt jedes ? mit fortlaufenden #1, #2, usw. Beispiel:
      Bei den Dateien: \"Blabla bla S01E01.mp3\" \"Blabla bla S01E02.mp3\" (usw) soll nur das Blabla bla weg:
      mmv \"Blabla bla S??E??.mp3\" \"S#1#2E#3#4.mp3\"
    
    "'
    Ausgabe des Alias:
    Code:
    root@MacBook:~# renamedoc
    
      Mit rename (Perl) oder mmv (Multiple MoVe) kann man mit Muster mehre Dateien umbenennen, siehe:
    
      https://stackoverflow.com/questions/11809666/rename-files-using-regular-expression-in-linux
    
      oder auch die bashfu Funktion renameext (auf Rasp5, rasp, server und MacBook vorhanden).
    
      rename ersetzt mit Perl-Regex-Syntax und Dateimuster, zB:
      Datei: "Blabla bla S01E01.mp3" soll das Blabla bla weg:
      rename -n "s/Blabla bla S(\d{2})E(\d{2})\.mp3$/S$1E$2\.mp3/" *.mp3
    
      mmv sucht in allen Dateien des akt. Verz. und ersetzt jedes ? mit fortlaufenden #1, #2, usw. Beispiel:
      Bei den Dateien: "Blabla bla S01E01.mp3" "Blabla bla S01E02.mp3" (usw) soll nur das Blabla bla weg:
      mmv "Blabla bla S??E??.mp3" "S#1#2E#3#4.mp3"
    In dem Alias hatte ich erst in den Beispielen am Schluss einfache Quotes (Apostrophe), so wie ich sie im echten Befehl auch verwenden würde, aber das ging partout nicht, warf immer Fehler, bis ich dann in den Beispielen zähneknirschend die Anführungszeichen (maskiert mit Backslash) genommen hatte.
    Das ging mir aber etwas gegen den Strich.
    Würde ich hier die Apostrophe jeweils mit Apostroph-Backslash-Apostroph maskieren wäre das im Alias Code noch viel unleserlicher (und damit fehleranfälliger).

    EDIT: ja, ich weiß, ein man rename oder man mmv täte es auch, aber darum geht es ja nicht hier
    Geändert von franc (20.02.24 um 09:27 Uhr)

  7. #7
    Registrierter Benutzer
    Registriert seit
    Jul 2008
    Beiträge
    146
    Zitat Zitat von Huhn Hur Tu Beitrag anzeigen
    ...das Problem ist in der Ausfuehrung als Alias...
    Das ist der Hinweis, jetzt habe ich es auch im Netz gefunden: How to escape single quotes correctly creating an alias - die Antwort von Bronek erklärts. Deckt sich mit Nopes letztem Beispiel.
    It's simply done by finishing already opened one ('), placing escaped one (\'), then opening another one (').
    Also wird nicht mit Apostroph-Backslash-Apostroph maskiert

  8. #8
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.819
    Natürlich gibt es auch da eine Lösung, man kann ANSI-C Quoting nutzen, dann wird alles weniger eigenartig, muss man aber auch erstmal wissen
    https://www.gnu.org/savannah-checkou...C-Quoting.html

    https://onlinegdb.com/OpNXP7Rj4
    Code:
    alias renamedoc=$'echo "
      Mit rename (Perl) oder mmv (Multiple MoVe) kann man mit Muster mehre Dateien umbenennen, siehe:
    
      https://stackoverflow.com/questions/11809666/rename-files-using-regular-expression-in-linux
    
      oder auch die bashfu Funktion renameext (auf Rasp5, rasp, server und MacBook vorhanden).
    
      rename ersetzt mit Perl-Regex-Syntax und Dateimuster, zB:
      Datei(en): \\"Blabla bla S01E01.mp3\\" soll das Blabla bla weg:
      rename -n \'s/Blabla bla S(\d{2})E(\d{2})\.mp3\$/S\$1E\$2\.mp3/\' *.mp3
    
      mmv sucht in allen Dateien des akt. Verz. und ersetzt jedes ? mit fortlaufenden #1, #2, usw. Beispiel:
      Bei den Dateien: \\"Blabla bla S01E01.mp3\\" \\"Blabla bla S01E02.mp3\\" (usw) soll nur das Blabla bla weg:
      mmv \'Blabla bla S??E??.mp3\' \'S#1#2E#3#4.mp3\'
    
    "'
    Geändert von nopes (20.02.24 um 22:42 Uhr) Grund: Demo Link
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  9. #9
    Registrierter Benutzer
    Registriert seit
    Jul 2008
    Beiträge
    146
    Ja, das klappt tatsächlich, einfach ein $-Zeichen vor den Befehl, also nach dem Alias-Istgleich-Zeichen, dann kann man "normal" maskieren. Klappt!
    Danke!

Ähnliche Themen

  1. Antworten: 16
    Letzter Beitrag: 14.07.11, 11:22
  2. Befehl echo!
    Von schahramsigi im Forum Linux Allgemein
    Antworten: 4
    Letzter Beitrag: 15.09.07, 18:29
  3. bash: echo $!, was genau macht der Befehl?
    Von Jimmi im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 11.10.06, 09:35
  4. echo-Befehl beim Booten
    Von SFNR1 im Forum System installieren und konfigurieren
    Antworten: 7
    Letzter Beitrag: 27.02.04, 13:48
  5. Shell Script --> echo Befehl
    Von realtec im Forum Linux Allgemein
    Antworten: 4
    Letzter Beitrag: 12.03.03, 08:03

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •