You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:59:25