如何在Bash脚本中实现命令与函数输出的同行并排显示?
解决Bash菱形图案左右并排的问题
你的脚本核心问题在于直接用printf拼接多行输出时,会把所有行内容混在一起,无法实现每行左右对应并排;另外全局变量space会在多次调用函数后值异常,需要同步修正。
修正后的完整脚本
#!/bin/bash read -p "Please write a number: " number # 生成初始满星串 stars=$(printf "%${number}s" "*" | tr ' ' '*') # 生成左上金字塔(带前置空格) pyramid1() { local space=$(( number - 1 )) for (( i=1; i<=number; i++ )); do printf "%*s" "$space" "" printf "%${i}s" "" | tr ' ' '*' echo space=$(( space - 1 )) done } # 生成右上金字塔(无前置空格,从满星递减) pyramid2() { local current_stars="$stars" for (( i=1; i<=number; i++ )); do echo "$current_stars" current_stars="${current_stars:1}" done } # 生成左下金字塔(左上金字塔反转) pyramid3() { pyramid1 | tac } # 生成右下金字塔(右上金字塔反转) pyramid4() { pyramid2 | tac } # 用paste合并左右对应行,实现并排 paste <(pyramid1) <(pyramid2) | sed 's/\t/ /' paste <(pyramid3) <(pyramid4) | sed 's/\t/ /'
关键修改说明
- 局部变量隔离:将
space、current_stars设为函数内局部变量,避免全局变量污染导致多次调用函数出错。 - 行合并工具
paste:通过进程替换<(command)将每个金字塔的输出作为临时输入源,paste会自动将左右两个输入的对应行合并,再用sed把默认的制表符分隔替换为空格,保证排版自然。 - 简化星号生成:用
printf+tr替代循环拼接星号,代码更高效简洁。 - 反转逻辑简化:用
tac命令直接反转输出行,替代手动处理反转的复杂逻辑。
示例输出(输入为3时)
* *** ** ** * * ** ** * ***
内容的提问来源于stack exchange,提问作者Oguzhan
相关产品推荐
相关产品推荐

