Bash-日志函数-printf
我正在尝试为bash创建一个记录器。问题是直接打印正在工作,但LOGGER_FUNC无法正确处理阵列 目前我可以打印应该记录的数据: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
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”
,然后将其移出,然后将整个剩余参数数组引用为“$@”