Bash-日志函数-printf

Bash-日志函数-printf,bash,sh,Bash,Sh,我正在尝试为bash创建一个记录器。问题是直接打印正在工作,但LOGGER_FUNC无法正确处理阵列 目前我可以打印应该记录的数据: DEBUG_data_ARRAY=(hi ho no bugs here no) printf "\n%s" "${DEBUG_data_ARRAY[@]}" printf "\n%s %s" "${DEBUG_data_ARRAY[@]}" 其中printf应替换为: LOGGER

我正在尝试为bash创建一个记录器。问题是直接打印正在工作,但LOGGER_FUNC无法正确处理阵列

目前我可以打印应该记录的数据:

DEBUG_data_ARRAY=(hi ho no bugs here no)
printf "\n%s" "${DEBUG_data_ARRAY[@]}"
printf "\n%s %s" "${DEBUG_data_ARRAY[@]}"
其中printf应替换为:

LOGGER_FUNC "\n%s" "${DEBUG_data_ARRAY[@]}"
LOGGER_FUNC "\n%s %s" "${DEBUG_data_ARRAY[@]}"
记录器功能:

LOGGER_FUNC () {
    format=$1
    message=$2
    if [[ $VERBOSE == 0 ]]; then
        printf "${format[@]}" "${message[@]}"
    fi
    if [[ $VERBOSE == 1 ]]; then
         printf "${format[@]}" "${message[@]}" >> $DEBUG_FILE
    fi
    if [[ $VERBOSE == 2 ]]; then
        printf "${format[@]}" "${message[@]}"
        printf "${format[@]}" "${message[@]}" >> $DEBUG_FILE
    fi
}
预期结果如下:

hi 
ho 
no 
bugs
here 
no

hi ho 
no bugs
here no
这将创建两个标量变量。要使
消息
成为包含
$2
$3
$4
等的数组,请编写:

format=$1
message=("${@:2}")
既然
format
是一个标量,您只需编写
$format
,而不是
${format[@]}

if [[ $VERBOSE == 0 ]]; then
    printf "$format" "${message[@]}"
fi
if [[ $VERBOSE == 1 ]]; then
     printf "$format" "${message[@]}" >> "$DEBUG_FILE"
fi
if [[ $VERBOSE == 2 ]]; then
     printf "$format" "${message[@]}"
     printf "$format" "${message[@]}" >> "$DEBUG_FILE"
fi
这将创建两个标量变量。要使
消息
成为包含
$2
$3
$4
等的数组,请编写:

format=$1
message=("${@:2}")
既然
format
是一个标量,您只需编写
$format
,而不是
${format[@]}

if [[ $VERBOSE == 0 ]]; then
    printf "$format" "${message[@]}"
fi
if [[ $VERBOSE == 1 ]]; then
     printf "$format" "${message[@]}" >> "$DEBUG_FILE"
fi
if [[ $VERBOSE == 2 ]]; then
     printf "$format" "${message[@]}"
     printf "$format" "${message[@]}" >> "$DEBUG_FILE"
fi

使用提供给函数的参数:

LOGGER_FUNC () {
    format=$1
    message=$2
    if [[ $VERBOSE == 0 ]]; then
        printf "${format[@]}" "${message[@]}"
    fi
    if [[ $VERBOSE == 1 ]]; then
         printf "${format[@]}" "${message[@]}" >> $DEBUG_FILE
    fi
    if [[ $VERBOSE == 2 ]]; then
        printf "${format[@]}" "${message[@]}"
        printf "${format[@]}" "${message[@]}" >> $DEBUG_FILE
    fi
}
#/副秘书长/垃圾箱/环境卫生
记录器_FUNC(){
#shellcheck disable=SC2059#变量格式字符串
printf“$@”案例$VERBOSE in
1) 猫;;
2) cat>>“$DEBUG_文件”;;
3) tee-一个“$DEBUG_文件”;;
以撒
}
或者实现一个流记录器,该记录器不需要内容参数,而是从
stdin
获取:

#/usr/bin/env bash
#流式记录器
#使用选项记录stdin
#&1:详细级别:
#1:仅限标准件
#2:仅调试文件
#3:标准输出和调试文件
#&2:可选调试文件路径
流记录器(){
如果[$#-eq 0]|[“$1”-eq 0];那么
cat>/dev/null
elif[$#-eq 1]|[“$1”-eq 1];然后
猫
elif[$#-eq 2];然后
如果[“$1”-等式2];则
cat>>“$2”
elif[“$1”-等式3];然后
球座-a“$2”
fi
fi
}
调试_数据_数组=(hi ho此处无bug无)
回声“你好”|流#不打印任何内容
#仅输出到标准输出
printf'\n%s'${DEBUG_data_ARRAY[@]}“| stream_logger 1
printf'\n%s%s'${DEBUG_data_ARRAY[@]}“| stream_logger 1
#仅输出到file1.log
printf'\n%s'${DEBUG_data_ARRAY[@]}“| stream_logger 2 file1.log
printf'\n%s%s'${DEBUG_data_ARRAY[@]}“| stream_logger 2 file1.log
#输出到file2.log和stdout
printf'\n%s'${DEBUG_data_ARRAY[@]}“| stream_logger 3 file2.log
printf'\n%s%s'${DEBUG_data_ARRAY[@]}“| stream_logger 3 file2.log

使用函数提供的参数:

LOGGER_FUNC () {
    format=$1
    message=$2
    if [[ $VERBOSE == 0 ]]; then
        printf "${format[@]}" "${message[@]}"
    fi
    if [[ $VERBOSE == 1 ]]; then
         printf "${format[@]}" "${message[@]}" >> $DEBUG_FILE
    fi
    if [[ $VERBOSE == 2 ]]; then
        printf "${format[@]}" "${message[@]}"
        printf "${format[@]}" "${message[@]}" >> $DEBUG_FILE
    fi
}
#/副秘书长/垃圾箱/环境卫生
记录器_FUNC(){
#shellcheck disable=SC2059#变量格式字符串
printf“$@”案例$VERBOSE in
1) 猫;;
2) cat>>“$DEBUG_文件”;;
3) tee-一个“$DEBUG_文件”;;
以撒
}
或者实现一个流记录器,该记录器不需要内容参数,而是从
stdin
获取:

#/usr/bin/env bash
#流式记录器
#使用选项记录stdin
#&1:详细级别:
#1:仅限标准件
#2:仅调试文件
#3:标准输出和调试文件
#&2:可选调试文件路径
流记录器(){
如果[$#-eq 0]|[“$1”-eq 0];那么
cat>/dev/null
elif[$#-eq 1]|[“$1”-eq 1];然后
猫
elif[$#-eq 2];然后
如果[“$1”-等式2];则
cat>>“$2”
elif[“$1”-等式3];然后
球座-a“$2”
fi
fi
}
调试_数据_数组=(hi ho此处无bug无)
回声“你好”|流#不打印任何内容
#仅输出到标准输出
printf'\n%s'${DEBUG_data_ARRAY[@]}“| stream_logger 1
printf'\n%s%s'${DEBUG_data_ARRAY[@]}“| stream_logger 1
#仅输出到file1.log
printf'\n%s'${DEBUG_data_ARRAY[@]}“| stream_logger 2 file1.log
printf'\n%s%s'${DEBUG_data_ARRAY[@]}“| stream_logger 2 file1.log
#输出到file2.log和stdout
printf'\n%s'${DEBUG_data_ARRAY[@]}“| stream_logger 3 file2.log
printf'\n%s%s'${DEBUG_data_ARRAY[@]}“| stream_logger 3 file2.log

哇,这真是太棒了!这是否也意味着我不能通过两个或更多数组?正确。无法知道一个数组的结束位置和下一个数组的开始位置。如果我们知道长度并将其作为参数添加,是否有可能?@Fredrik这听起来比简单地为每条消息传递一个参数复杂得多。通常,您按原样取第一个参数,
“$1”
,然后
将其移出,然后将剩下的全部参数数组引用为
“$@”
Wow,这让它运行起来很有魅力!这是否也意味着我不能通过两个或更多数组?正确。无法知道一个数组的结束位置和下一个数组的开始位置。如果我们知道长度并将其作为参数添加,是否有可能?@Fredrik这听起来比简单地为每条消息传递一个参数复杂得多。通常,您按原样取第一个参数,
“$1”
,然后
将其移出,然后将整个剩余参数数组引用为
“$@”