printf输出有时缺少格式的Bash函数
我有一个函数,它接受四个参数并输出一个格式化的标题。大多数情况下,此函数都可以工作,但有时它决定不工作printf输出有时缺少格式的Bash函数,bash,shell,printf,string-formatting,Bash,Shell,Printf,String Formatting,我有一个函数,它接受四个参数并输出一个格式化的标题。大多数情况下,此函数都可以工作,但有时它决定不工作 yelB=$'\e[1;33m' fclr=$'\e[0m' format_title() { # USAGE # format_title "TITLE" "{h1/h2/h3}" "${color}" "{fill_character}" # EXMAPLE # format_title "Heading 1" "h2" "$yelB" "="
yelB=$'\e[1;33m'
fclr=$'\e[0m'
format_title() {
# USAGE
# format_title "TITLE" "{h1/h2/h3}" "${color}" "{fill_character}"
# EXMAPLE
# format_title "Heading 1" "h2" "$yelB" "="
# ============================ Heading 1 ============================
ftitle=$1
heading=$2
color=$3
fill=$4
total_length=100
ftitle_spacing=" "
ftitle_border=$'\n' # variable implemented in h1 instances only
formatted_ftitle=""
if [[ $heading == "h1" ]]; then
for (( i=1; i<=$total_length; i++ )); do
ftitle_border=$ftitle_border$fill
done
fi
if [[ $heading == "h1" || $heading == "h2" ]]; then
ftitle_spacing=" "
fi
ftitle_fill=$(( ( $total_length / 2 ) - ( ${#ftitle} / 2 ) - ${#ftitle_spacing} ))
for (( i=0; i<=$ftitle_fill; i++ )); do
formatted_ftitle=$formatted_ftitle$fill
if (( i == $ftitle_fill - 1 )); then
formatted_ftitle=$formatted_ftitle$ftitle_spacing$color$ftitle$fclr$ftitle_spacing$formatted_ftitle
# Check if the fill will be even or odd; if odd, remove the last fill character
if (( $ftitle_fill % 2 )); then
formatted_ftitle="${formatted_ftitle::-1}"
fi
if [[ $heading == "h1" ]]; then
formatted_ftitle=$ftitle_border$'\n'$formatted_ftitle$ftitle_border$'\n'
fi
break
fi
done
printf "%s\n" "$formatted_ftitle"
}
format_title "TEST HEADING ONE WITH EVEN NUMBER CHARACTERS" "h1" "$yelB" "#"
format_title "TEST HEADING TWO WITH ODD NUMBER CHARACTERS" "h1" "$yelB" "#"
format_title "TEST HEADING ONE WITH EVEN NUMBER CHARACTERS" "h2" "$yelB" "="
format_title "TEST HEADING TWO WITH ODD NUMBER CHARACTERS" "h2" "$yelB" "="
format_title "TEST HEADING ONE WITH EVEN NUMBER CHARACTERS" "h3" "$yelB" "-"
format_title "TEST HEADING TWO WITH ODD NUMBER CHARACTERS" "h3" "$yelB" "-"
yelB=$'\e[1;3300万'
fclr=$'\e[0m'
格式(标题){
#用法
#格式_title“title”“{h1/h2/h3}”“${color}”“{fill_character}”
#埃克斯马普
#格式标题“标题1”“h2”“$yelB”“=”
#==============================================标题1============================
ftitle=1美元
标题=$2
颜色=$3
填充=4美元
总长度=100
ftitle_间距=“”
ftitle_border=$'\n'#仅在h1实例中实现的变量
格式化的_ftitle=“”
如果[[$heading==“h1”]];则
对于((i=1;i对于h1/h2,对于偶数/奇数${{{ftitle}}
,您分别有${{ftitle}=18/19
(即偶数=偶数,奇数=奇数)
但对于h3,偶数/奇数分别有${{格式化的{u ftitle}=27/28
(即奇数=偶数,偶数=奇数)
因此,在决定是否删除尾随字符时,似乎不仅需要考虑填充符的奇偶性,还需要考虑标题
实际上,它似乎归结为只需要担心${ftitle}
的偶数/奇数,例如:
yelB=$'\e[1;33m'
fclr=$'\e[0m'
format_title() {
# USAGE
# format_title "TITLE" "{h1/h2/h3}" "${color}" "{fill_character}"
# EXMAPLE
# format_title "Heading 1" "h2" "$yelB" "="
# ============================ Heading 1 ============================
ftitle=$1
heading=$2
color=$3
fill=$4
total_length=100
ftitle_spacing=" "
ftitle_border=$'\n' # variable implemented in h1 instances only
formatted_ftitle=""
if [[ $heading == "h1" ]]; then
for (( i=1; i<=$total_length; i++ )); do
ftitle_border=$ftitle_border$fill
done
fi
if [[ $heading == "h1" || $heading == "h2" ]]; then
ftitle_spacing=" "
fi
ftitle_fill=$(( ( $total_length / 2 ) - ( ${#ftitle} / 2 ) - ${#ftitle_spacing} ))
for (( i=0; i<$ftitle_fill; i++ )); do
formatted_ftitle=$formatted_ftitle$fill
done
formatted_ftitle=$formatted_ftitle$ftitle_spacing$color$ftitle$fclr$ftitle_spacing$formatted_ftitle
# if the length of ftitle is odd, remove the last fill character
if (( ${#ftitle} % 2 )); then
formatted_ftitle="${formatted_ftitle::-1}"
fi
if [[ $heading == "h1" ]]; then
formatted_ftitle=$ftitle_border$'\n'$formatted_ftitle$ftitle_border$'\n'
fi
printf "%s\n" "${formatted_ftitle}"
}
format_title "TEST HEADING ONE WITH EVEN NUMBER CHARACTERS" "h1" "$yelB" "#"
format_title "TEST HEADING TWO WITH ODD NUMBER CHARACTERS" "h1" "$yelB" "#"
format_title "TEST HEADING ONE WITH EVEN NUMBER CHARACTERS" "h2" "$yelB" "="
format_title "TEST HEADING TWO WITH ODD NUMBER CHARACTERS" "h2" "$yelB" "="
format_title "TEST HEADING ONE WITH EVEN NUMBER CHARACTERS" "h3" "$yelB" "-"
format_title "TEST HEADING TWO WITH ODD NUMBER CHARACTERS" "h3" "$yelB" "-"
####################################################################################################
################## TEST HEADING ONE WITH EVEN NUMBER CHARACTERS ##################
####################################################################################################
####################################################################################################
################### TEST HEADING TWO WITH ODD NUMBER CHARACTERS ##################
####################################################################################################
================== TEST HEADING ONE WITH EVEN NUMBER CHARACTERS ==================
=================== TEST HEADING TWO WITH ODD NUMBER CHARACTERS ==================
--------------------------- TEST HEADING ONE WITH EVEN NUMBER CHARACTERS ---------------------------
---------------------------- TEST HEADING TWO WITH ODD NUMBER CHARACTERS ---------------------------
yelB=$'\e[1;3300万'
fclr=$'\e[0m'
格式(标题){
#用法
#格式_title“title”“{h1/h2/h3}”“${color}”“{fill_character}”
#埃克斯马普
#格式标题“标题1”“h2”“$yelB”“=”
#==============================================标题1============================
ftitle=1美元
标题=$2
颜色=$3
填充=4美元
总长度=100
ftitle_间距=“”
ftitle_border=$'\n'#仅在h1实例中实现的变量
格式化的_ftitle=“”
如果[[$heading==“h1”]];则
为了((i=1;i“line up”是什么意思?所有“TEST”字符串都从同一列开始?前导“#=”的数目相同?由于所有字符串都显示为“off”1个字符,我猜在计算ftitle\u fill
时存在逻辑错误,即bash math是基于整数的,所以我想知道您是否没有正确处理截断当将奇数长度字符串的长度减半时,您是否尝试过打印${ftitle\u fill}
和格式化的\u ftitle
(${ftitle}
)要查看数字是否与您期望的相符?@markp您可以在嵌入的图像上看到,最后两个标题的输出分别是短的和扩展的一个填充字符。数学似乎很好,因为图像还显示了可变的标题长度(一个字符数为偶数,一个字符数为奇数,函数适用于此)。您没有定义“对齐”;从我的角度来看,所有内容都应该左对齐,前导“#=-”的数量相同……除了最后3行的尾随1-3个字符的问题之外;同样,由于所有内容似乎都“关闭”了1个字符……我仍然打赌您的数学对于截断的0.5…aga是不正确的在中,修改脚本以打印实际数字,并查看它们是否与您的匹配expect@markp抱歉--我刚刚意识到。所谓“排列”,我的意思是每个标题都应该与最后一个填充字符对齐;总长度为100个字符。标题是右对齐的,我理解这一点,并且对此感到满意。但是最后一个图像中的两个标题很短,扩展了1个填充字符,并且右对齐,这是我无法理解的。ANSI颜色代码在字符串索引中计数,但不显示h1
和h2
在填充字符和标题字符串之间有偶数个空格,h3
有一个whitespace。在h3
中添加一个额外的空格修复了此问题。非常感谢!