【问题标题】:Bash Shell echo/printf how to format output the right wayBash Shell echo/printf 如何以正确的方式格式化输出
【发布时间】:2016-03-03 01:36:01
【问题描述】:

我当前的 sn-p 代码如下所示...

#Location of network config files
nfds="/etc/sysconfig/network-scripts/"

#Standard prefer of network config files
fil="ifcfg-"

#Array variable that feeds "$nic"
cards= array loop built from "nic=$(ls /sys/class/net | grep en)"

#Set color for Divice labile
div="\033[38;5;39m"

#Set Fix format and colour info
fix="\033[38;5;118m"

#Set color for OK
ok="\033[38;5;28m"

#Clear All font and color info
ctf="\033[0m"

function currentCardDefRoute(){

    defr=$(grep DEFROUTE $nfds$fil$cards | cut -d = -f 2) 

    if [[ $defr = "yes" ]] || [[ $defr = "no" ]]; then
        echo -e " "$div$cards$ctf"'s current default route is\t"$div$defr$ctf"\t\t\t\t   ["$ok"OK"$ctf"]"
        $st
    else
        echo -e " "$div$cards$ctf"'s current default route is \t"$fix"Missing"$ctf"\t\t\t   ["$fix"PLEASE FIX"$ctf"]"
        $st
    fi

}

为了可读性和格式一致,我在所有回显行上缩进 1 个空格。保持输出的可读性和易于理解。

我正在寻找我们的“列”选项,使输出更加动态,并且无论屏幕大小或 var 结果如何,格式都保持一致。我也很想摆脱代码中的所有“\ t”。我试过 printf 没有成功。

我用谷歌搜索了很多不同的方法,但没有看到我正在寻找的具体答案或我可以从中得出答案的变体。

感谢您的帮助。 顺便提一句。这是我写过的第一个代码,所以大家放轻松:)

【问题讨论】:

  • 请使用实际数据/大小/等编辑您的 Q,以“使输出更具动态性并保持格式一致,无论屏幕大小或 var 结果如何”。例如,如果你有一个 80 列的屏幕,但有 120 个宽数据,你想发生什么? 但是基本上,printf 应该是您花时间研究的地方。一旦你理解了man printf 文档的 20-30%(通过做小样本),其余的就很明显了。一些printf 手册页甚至有一个标记为examples 的部分。祝你好运。
  • 由于您有一个c 标签,我会提到c 语言中的printf 是shell printf 函数的“父级”。我不确定您是否认为需要在c 中编码才能使用printf,但您不需要。 (这个看起来不错,但功能可能会因 shell 和操作系统版本而异:ss64.com/bash/printf.html)。祝你好运。
  • 这既与 C 无关,也与标记所定义的 printf 无关(与 C 函数 C 相关)。
  • 输出永远不会超过 80 col 我在我的其余代码中确定了这一点。我研究了 printf 并在 youtube Kris Occhipinti 和其他各种视频上观看了很多视频。列接缝是我需要帮助的语法,我会阅读更多关于你建议的页面,看看我能找到什么。谢谢
  • 旁注:您可以在双引号字符串中使用变量引用,如$var。您不必打开和关闭它们周围的琴弦。

标签: bash shell printf echo


【解决方案1】:

您可能想尝试使用column 实用程序。它的唯一目的是将输出格式化为列。这可能比尝试用echoprintf 做同样的事情更容易。

如果您必须使用printf,则需要使用"%25.25s" 之类的格式说明符。第一个数字是“最小字段宽度”,它(在这种情况下)导致输出至少有 25 个字符宽。如果输出较短,则用空格填充。第二个数字表示要打印的最大字符数。当这两个数字相同时,它实际上表示要在正好 25 个字符宽的字段中打印字符串。您可以使用它来强制变长字符串在屏幕上占用相同数量的空间。

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多