Parametre veya borudan girişi kabul eden bastırma işlevi


10

Aşağıdaki bash işlevini bir argüman veya bir borudan girdisini kabul edebilecek şekilde yazmak istiyorum:

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

İstenilen kullanım:

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

2
ne zaman anlamsız fonksiyonu gibi görünüyor base64ve bashyine hepsi yapabilirsiniz. neden -dveya --decodeseçeneğini kullanmaktan kaçınmak için bir işlev yazmalısınız ? eğer gerçekten b64decodeo zaman aradığınız bir şey olmalı alias b64decode='base64 --decode'. b64dolsa daha kısa olurdu ve daha da yazarak tasarruf edin.
cas

3
Haklısın, bu sadece örnek olarak kullanıldı.
tyrondis

Yanıtlar:


17

/dev/stdinStandart girişten okumak için kullanabilirsiniz

b64decode()
{
    if (( $# == 0 )) ; then
        base64 --decode < /dev/stdin
        echo
    else
        base64 --decode <<< "$1"
        echo
    fi
}
  • $# == 0 komut satırı bağımsız değişkenlerinin sayısının sıfır olup olmadığını kontrol eder
  • base64 --decode <<< "$1"ayrıca kullanmak ve boru kullanmak herestringyerineechobase64

1
sadece temiz bir sözdizimi imo, echo and pipedaha hızlı olabilir .. bkz. unix.stackexchange.com/questions/59007/… ve bu herestringbir hata yaptım
Sundeep

2
tr -d "\n"Satır kesmelerini kaldırmak için girişi kesebilirsiniz.
Julie Pelletier

3
base64 çoklu giriş hatlarını destekliyor mu? Tabii ki, yapmasaydı oldukça işe yaramaz olurdu. kendiniz görün:ls -l /usr/bin/ | base64 | base64 -d
cas

1
btw, +1. sizinkine, sadece çok daha karmaşık bir işlevin yerine getirilmesi durumunda mantıklı gelen bir soruya iyi bir cevap verilir.
cas

4
Aslında gerek yok < /dev/stdin; dosya olmadan base64, üst öğesinden devraldığı standart girişten okuyacaktır /dev/stdin.
chepner

2

Sundeep cevabı için çalışan base64bu yarar birden fazla satır desteklemediği için. Daha genel dava için daha genel bir düzeltme

gibi bir şey

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.