パラメータまたはパイプからの入力を受け入れるBash関数


10

次のbash関数を、引数またはパイプから入力を受け入れることができるように記述したいと思います。

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

望ましい使用法:

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

2
とき無意味な機能のように思えるbase64し、bashとにかくことをすべて行うことができます。-dor --decodeオプションの使用を避けるためだけに関数を記述する理由 あなたが本当にと呼ばれるものが必要な場合b64decode、その後にalias b64decode='base64 --decode'b64dしかし、より短くなり、さらにタイピングを節約できます。
cas

3
そうです、これは例として使用されただけです。
タイロンディス

回答:


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"改行を削除できます。
Julie Pelletier

2
base64は複数の入力行をサポートしていますか?もちろん、そうしなければ、そうしなければかなり役に立たないでしょう。自分の目で確かめてください:ls -l /usr/bin/ | base64 | base64 -d
cas

1
ところで、+ 1。あなたの質問は、それがはるかに複雑な機能の代役である場合にのみ意味をなす質問に対する良い答えです。
cas

4
実際には必要ありません< /dev/stdin。ファイルがなければ、base64親である標準入力から継承する標準入力から単純に読み取ります/dev/stdin
chepner

2

サンディープの答えのために働くbase64というユーティリティが複数行をサポートしていないため。より一般的なケースのより一般的な修正

のようなものです

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.