Fungsi Bash yang menerima input dari parameter atau pipa

10

Saya ingin menulis fungsi bash berikut dengan cara yang dapat menerima inputnya dari argumen atau pipa:

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

Penggunaan yang diinginkan:

$ b64decode "QWxhZGRpbjpvcGVuIHNlc2FtZQ="
$ b64decode < file.txt
$ b64decode <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ="
$ echo "QWxhZGRpbjpvcGVuIHNlc2FtZQ=" | b64decode
tyrondis
sumber
2
Sepertinya fungsi yang sia-sia kapan base64dan bashbisa melakukan semua itu. mengapa menulis fungsi hanya untuk menghindari penggunaan opsi -datau --decode? jika Anda benar-benar harus memiliki sesuatu yang disebut b64decodeitu alias b64decode='base64 --decode'. b64dakan lebih pendek, dan menyimpan lebih banyak mengetik.
cas
3
Anda benar, ini hanya digunakan sebagai contoh.
tyrondis

Jawaban:

16

Anda dapat menggunakannya /dev/stdinuntuk membaca dari input standar

b64decode()
{
    if (( $# == 0 )) ; then
        base64 --decode < /dev/stdin
        echo
    else
        base64 --decode <<< "$1"
        echo
    fi
}
  • $# == 0 memeriksa apakah jumlah argumen baris perintah adalah nol
  • base64 --decode <<< "$1"Anda juga bisa menggunakan herestringalih-alih menggunakan echodan mengirim pipa kebase64
Sundeep
sumber
1
hanya imo sintaksis yang bersih, echo and pipemungkin lebih cepat .. lihat unix.stackexchange.com/questions/59007/… dan itu herestring, saya membuat kesalahan
Sundeep
2
Anda dapat menyalurkan input melalui tr -d "\n"untuk menghapus garis putus.
Julie Pelletier
3
apakah base64 mendukung beberapa saluran input? tentu saja, akan sangat sia-sia jika tidak. lihat sendiri:ls -l /usr/bin/ | base64 | base64 -d
cas
1
btw, +1. jawaban Anda adalah jawaban yang bagus untuk sebuah pertanyaan yang hanya masuk akal jika itu hanya berlaku untuk fungsi yang jauh lebih rumit.
cas
4
Anda sebenarnya tidak membutuhkannya < /dev/stdin; tanpa file, base64hanya akan membaca dari input standar yang diwarisi dari induknya, yaitu /dev/stdin.
chepner
2

Jawaban Sundeep berfungsi base64karena utilitas itu tidak mendukung banyak baris. Perbaikan yang lebih umum untuk kasus yang lebih umum

adalah sesuatu seperti

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
TomRoche
sumber