web-dev-qa-db-ja.com

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

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

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

望ましい使用法:

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

/dev/stdinを使用して標準入力から読み取ることができます

b64decode()
{
    if (( $# == 0 )) ; then
        base64 --decode < /dev/stdin
        echo
    else
        base64 --decode <<< "$1"
        echo
    fi
}
  • $# == 0コマンドライン引数の数がゼロかどうかを確認します
  • base64 --decode <<< "$1"herestringを使用する代わりにechoを使用してbase64にパイプすることもできます
16
Sundeep

サンディープの答えbase64そのユーティリティは複数行をサポートしていないためです。より一般的なケースのより一般的な修正

のようなものです

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