Bash函数接受参数或管道的输入


10

我想以一种可以接受参数或管道输入的方式编写以下bash函数:

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

所需用法:

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

2
似乎是一个毫无意义的,当功能base64bash可以做的一切,无论如何。为什么编写函数只是为了避免使用-dor --decode选项?如果您确实必须拥有某种东西,b64decode那么alias b64decode='base64 --decode'b64d会更短,但可以节省更多的键入。
cas

3
没错,不过这只是作为示例。
tyrondis '16

Answers:


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
只是一个简洁的语法海事组织,echo and pipe可能会更快..看到unix.stackexchange.com/questions/59007/...,这是herestring,我犯了一个错误
森迪普•

2
您可以通过管道传递输入tr -d "\n"以删除换行符。
朱莉·佩勒捷

3
base64是否支持多条输入线?当然可以,如果没有的话,这将毫无用处。自己看看:ls -l /usr/bin/ | base64 | base64 -d
cas

1
顺便说一句,+ 1。您的问题是一个很好的答案,只有当它只是更复杂的功能的代表时,才有意义。
cas

4
您实际上并不需要< /dev/stdin; 如果没有文件,base64则只需从它从其父级继承的标准输入中读取/dev/stdin
chepner '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.