Funzione Bash che accetta input da parametro o pipe


10

Voglio scrivere la seguente funzione bash in modo che possa accettare il suo input da un argomento o da una pipe:

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

Utilizzo desiderato:

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

2
sembra una funzione inutile quando base64e bashpuò fare comunque tutto ciò. perché scrivere una funzione solo per evitare di usare l' opzione -do --decode? se devi davvero avere qualcosa chiamato b64decodeallora alias b64decode='base64 --decode'. b64dsarebbe più breve, però, e risparmierebbe ancora più digitazione.
CAS

3
Hai ragione, questo è stato usato solo come esempio, però.
Tyrondis,

Risposte:


16

È possibile utilizzare /dev/stdinper leggere da input standard

b64decode()
{
    if (( $# == 0 )) ; then
        base64 --decode < /dev/stdin
        echo
    else
        base64 --decode <<< "$1"
        echo
    fi
}
  • $# == 0 controlla se il numero di argomenti della riga di comando è zero
  • base64 --decode <<< "$1"si può anche usare herestringinvece di usare echoe piping abase64

1
solo un imo sintassi pulito, echo and pipepotrebbe essere più veloce .. vedi unix.stackexchange.com/questions/59007/… ed è herestring, ho fatto un errore
Sundeep

2
È possibile reindirizzare l'input tr -d "\n"per rimuovere le interruzioni di riga.
Julie Pelletier,

3
base64 supporta più linee di input? certo che lo fa, sarebbe piuttosto inutile se non lo facesse. guarda tu stesso:ls -l /usr/bin/ | base64 | base64 -d
cas

1
tra +1. la tua è una buona risposta a una domanda che ha senso solo se si tratta solo di una funzione molto più complicata.
CAS

4
In realtà non è necessario il < /dev/stdin; senza un file, base64leggerà semplicemente dallo standard input che eredita dal suo genitore, che è /dev/stdin.
Chepner,

2

La risposta di Sundeep funziona base64perché quell'utilità non supporta più linee. Una correzione più generale per il caso più generale

è qualcosa di simile

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.