Bash-Funktion, die Eingaben von Parametern oder Pipe akzeptiert


10

Ich möchte die folgende Bash-Funktion so schreiben, dass sie ihre Eingabe entweder von einem Argument oder einer Pipe akzeptiert:

b64decode() {
    echo "$1" | base64 --decode; echo
}

Gewünschte Verwendung:

$ b64decode "QWxhZGRpbjpvcGVuIHNlc2FtZQ="
$ b64decode < file.txt
$ b64decode <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ="
$ echo "QWxhZGRpbjpvcGVuIHNlc2FtZQ=" | b64decode

2
scheint eine sinnlose Funktion zu sein, wenn base64und bashkann das alles sowieso. Warum eine Funktion schreiben, um die Verwendung der Option -doder zu vermeiden --decode? wenn du wirklich etwas haben musst, b64decodedann alias b64decode='base64 --decode'. b64dwäre allerdings kürzer und würde noch mehr tippen sparen.
Cas

3
Sie haben Recht, dies wurde jedoch nur als Beispiel verwendet.
Tyrondis

Antworten:


16

Sie können verwenden /dev/stdin, um von der Standardeingabe zu lesen

b64decode()
{
    if (( $# == 0 )) ; then
        base64 --decode < /dev/stdin
        echo
    else
        base64 --decode <<< "$1"
        echo
    fi
}
  • $# == 0 prüft, ob die Anzahl der Befehlszeilenargumente Null ist
  • base64 --decode <<< "$1"man kann auch verwenden herestringanstatt zu verwenden echound zu leitenbase64

1
Nur eine saubere Syntax imo, echo and pipekönnte schneller sein .. siehe unix.stackexchange.com/questions/59007/… und es ist herestring, ich habe einen Fehler gemacht
Sundeep

2
Sie können die Eingabe durchleiten tr -d "\n", um Zeilenumbrüche zu entfernen.
Julie Pelletier

2
Unterstützt base64 mehrere Eingabezeilen? Natürlich ist es ziemlich nutzlos, wenn es nicht so wäre. ls -l /usr/bin/ | base64 | base64 -d
Cas

1
Übrigens +1. Ihre Frage ist eine gute Antwort auf eine Frage, die nur dann Sinn macht, wenn sie nur für eine viel kompliziertere Funktion steht.
Cas

4
Du brauchst das eigentlich nicht < /dev/stdin; Ohne Datei base64wird einfach von der Standardeingabe gelesen, die es von seinem übergeordneten Element erbt /dev/stdin.
Chepner

2

Die Antwort von Sundeep funktioniert, base64da dieses Dienstprogramm nicht mehrere Zeilen unterstützt. Eine allgemeinere Lösung für den allgemeineren Fall

ist so etwas wie

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.