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

관련 정보