Bash変数の型を調べることはできますか?

Bash変数の型を調べることはできますか?

日付を出力する関数を作成しています。date環境変数に引数を指定して、ユーザーが出力をカスタマイズできるようにしたいと思います。型文字列内のスペースを保持するために、次のように配列のパラメータを受け入れたいと思います。

function argdates {
    while [ $# -gt 0 ] && date "${DATE_ARGS[@]}" -d @$1
    do shift
    done
}

ユーザーが日付書式文字列にスペースを含める場合は、配列を使用する必要があります。

DATE_ARGS=( -u "+%y/%U, %I%p %a" )
argdates 1476395008 1493172224

# output:
# 16/41, 09PM Thu
# 17/17, 02AM Wed

ただし、この場合、配列は過度になる可能性があります。

DATE_ARGS="-u -Iseconds"
argdates 1476395008 1493172224

# output:
# date: invalid option -- ' '
# Try 'date --help' for more information.

# output should be:
# 2016-10-13T21:43:28+00:00
# 2017-04-26T02:03:44+00:00

このような単純なケースでは、配列は必要ありません。変数がどのタイプであるかを確認できますか?

ベストアンサー1

私が見るには、関数がすべてのコマンドラインオプションをGNUに直接渡すdateと同時に、数値ではないオプションを特別に処理したいと思うかもしれません。

argdates () {
    local -a opts
    local timestamp

    while [ "$#" -gt 0 ] && [ "$1" != '--' ] && [[ "$1" != [0-9]* ]]; do
        opts+=( "$1" )
        shift
    done
    [ "$1" = '--' ] && shift

    for timestamp do
        date "${opts[@]}" -d "@$timestamp"
    done

    # or, with a single invocation of "date":
    # printf '@%s\n' "$@" | date "${opts[@]}" -f -
}

関数はコマンドライン引数を繰り返し、引数(オプションの終わりを表す標準的な方法)または数字で始まる引数に出会うまで配列にbash格納します。に保存されている各パラメータは、コマンドラインパラメータリストから削除されます。opts--opts

引数以外のオプションが見つかった場合は、残りの引数がdateUNIXエポックタイムスタンプであると仮定し、それを繰り返しながらdate各タイムスタンプに対して保存したオプションを使用して呼び出します。このループをより効率的に実行する方法の詳細については、コードのコメントを参照してください。

通貨例:

$ argdates 1476395008 1493172224
Thu Oct 13 23:43:28 CEST 2016
Wed Apr 26 04:03:44 CEST 2017
$ argdates -- 1476395008 1493172224
Thu Oct 13 23:43:28 CEST 2016
Wed Apr 26 04:03:44 CEST 2017
$ argdates +%D 1476395008 1493172224
10/13/16
04/26/17
$ argdates +%F 1476395008 1493172224
2016-10-13
2017-04-26
$ argdates -u 1476395008 1493172224
Thu Oct 13 21:43:28 UTC 2016
Wed Apr 26 02:03:44 UTC 2017
$ argdates -u -Iseconds 1476395008 1493172224
2016-10-13T21:43:28+00:00
2017-04-26T02:03:44+00:00

おすすめ記事