我可以内省 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都会从命令行参数列表中移出。

一旦发现一个参数不是 的选项date,我们就假设其余参数是 UNIX 纪元时间戳并循环这些,使用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

答案2

您可以通过放弃使用数组并让用户DATE_ARGS简单地指定为应插入命令行中的字符串来更轻松地做到这一点date

$ argdates(){
    for d; do printf %s "$DATE_ARGS" | xargs date -d "@$d"; done
}
$ DATE_ARGS='-u "+%y/%U, %I%p %a"' argdates 1476395008 1493172224
16/41, 09PM Thu
17/17, 02AM Wed
$ DATE_ARGS='-u -Iseconds' argdates 1476395008 1493172224
2016-10-13T21:43:28+00:00
2017-04-26T02:03:44+00:00

相关内容