【问题标题】:Prepend output from each function named in a bash array with an echo?在bash数组中命名的每个函数的输出前面加上回声?
【发布时间】:2016-10-04 00:47:02
【问题描述】:

我正在遍历数组:

declare -a CommandArray
CommandArray[1]=check_homebrewinstall
CommandArray[2]=check_javainstall
CommandArray[3]=check_gitversioninstall

for i in "${!CommandArray[@]}"; do ${CommandArray[$i]}; done

哪些打印:

✓ Homebrew is installed at /usr/local/bin/brew.
✓ Java is installed at /usr/bin/java.
✓ Latest Git Version: 2.10.1

但是我需要在 for 循环中添加什么才能打印?:

1) ✓ Homebrew is installed at /usr/local/bin/brew.
2) ✓ Java is installed at /usr/bin/java.
3) ✓ Latest Git Version: 2.10.1

我想在同一行调用每个函数之前对其进行编号。

【问题讨论】:

    标签: bash loops for-loop recursion terminal


    【解决方案1】:

    只需添加索引号${!CommandArray[$i]},您已经将其保存为变量i,正确格式化输出字符串:

    for i in "${!CommandArray[@]}"; do printf '%s) %s\n' "$i" "$( "${CommandArray[$i]}" )"; done
    
    • 命令替换 "$( "${CommandArray[$i]}" )"${CommandArray[$i]} 的扩展作为命令运行

    • 使用printf 模式'%s) %s\n' 将输出格式化为所需格式,第一个字符串(数字)来自i,第二个来自命令替换

    【讨论】:

    • "$( "${CommandArray[$i]}" )",如果我们想证明没有意外(IFS=_ 宁愿在没有内部引号的情况下把事情搞砸,f'rinstance)。
    【解决方案2】:

    为了简洁起见,我会考虑迭代值而不是键,并维护一个计数器:

    for cmd in "${CommandArray[@]}"; do
      printf '%d) %s\n' "$(( ++idx ))" "$("$cmd")"
    done
    

    ...或者,如果您相信每个命令都会发出一行,并以换行符终止,则可以通过放弃命令替换并让正在执行的命令将其结果直接写入 stdout 文件描述符来提高效率它继承自调用它的脚本:

    for cmd in "${CommandArray[@]}"; do
      printf '%d) ' "$(( ++idx ))"  # print number with no trailing newline
      "$cmd"                        # ...and count on the command to emit a newline
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      相关资源
      最近更新 更多