Функція Bash, яка приймає вхід від параметра або труби


10

Я хочу написати наступну функцію bash таким чином, щоб вона могла прийняти свій вхід або з аргументу, або з каналу:

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

Бажане використання:

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

2
здається безглуздою функцією, коли base64і bashвсе це можна зробити. навіщо писати функцію просто, щоб уникнути використання параметра -dабо --decode? якщо ви дійсно повинні мати щось, що називається b64decodeтоді alias b64decode='base64 --decode'. b64dхоч і коротше, і заощадити ще більше набравши тексту.
cas

3
Ви маєте рацію, однак це було просто використано як приклад.
tyrondis

Відповіді:


16

Ви можете використовувати /dev/stdinдля читання зі стандартного вводу

b64decode()
{
    if (( $# == 0 )) ; then
        base64 --decode < /dev/stdin
        echo
    else
        base64 --decode <<< "$1"
        echo
    fi
}
  • $# == 0 перевіряє, чи кількість аргументів командного рядка дорівнює нулю
  • base64 --decode <<< "$1"можна також використовувати herestringзамість використання echoта трубопроводів доbase64

1
просто чистий синтаксис imo, echo and pipeможе бути швидше .. дивіться unix.stackexchange.com/questions/59007/… і це herestring, я допустив помилку
Sundeep

2
Ви можете tr -d "\n"передати вхід для усунення розривів ліній.
Джулі Пелтьє,

3
чи підтримує base64 кілька ліній введення? Звичайно, так, було б марно, якби не. бачите самі:ls -l /usr/bin/ | base64 | base64 -d
cas

1
btw, +1. ваш - це хороша відповідь на питання, яке має будь-який сенс, лише якщо це лише позиція щодо набагато складнішої функції.
cas

4
Вам насправді не потрібні < /dev/stdin; без файлу base64буде просто читати зі стандартного вводу, який він успадковує від свого батьківського, що є /dev/stdin.
чепнер

2

Відповідь Sundeep працює, base64оскільки ця утиліта не підтримує кілька рядків. Більш загальне виправлення для більш загального випадку

щось подібне

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.