【问题标题】:How to store output from printf with formatting in a variable? [duplicate]如何将 printf 的输出与变量格式一起存储? [复制]
【发布时间】:2015-09-26 10:05:46
【问题描述】:

我想将带有格式的printf 的输出存储在一个变量中,但由于某种原因它会删除格式。

这是正确的输出

$ printf "%-40s %8s %9s  %7s" "File system" "Free" "Refquota" "Free %"
File system                                  Free  Refquota   Free 

现在格式消失了

$ A=$(printf "%-40s %8s %9s  %7s" "File system" "Free" "Refquota" "Free %")
$ echo $A
File system Free Refquota Free %

【问题讨论】:

    标签: linux bash printf echo


    【解决方案1】:

    这是因为您没有引用变量。如果这样做,格式将完美显示:

    echo "$A"   #although $a would be best, uppercase vars are not good practise
    

    也就是说,你的var=$(printf ) 方法完全没问题,你只是没有正确地echo

    您可能想知道原因。在Why does my shell script choke on whitespace or other special characters?中找到它

    为什么我需要写"$foo"?没有引号会怎样?

    $foo 并不意味着“取变量foo 的值”。它的意思是 更复杂的东西:

    • 首先,取变量的值。 * 字段拆分:处理 该值作为空格分隔的字段列表,并构建 结果列表。例如,如果变量包含foo * bar ​ 那么这一步的结果就是三元素列表foo*bar
      • 文件名生成:将每个字段视为一个 glob,即作为通配符模式,并将其替换为与此匹配的文件名列表 图案。如果模式与任何文件都不匹配,则将其保留 未修改。在我们的示例中,这导致列表包含foo, 接下来是当前目录中的文件列表,最后 bar。如果当前目录为空,则结果为foo*bar

    请注意,结果是一个字符串列表。有两个上下文 shell 语法:列表上下文和字符串上下文。字段拆分和 文件名生成只发生在列表上下文中,但大多数情况下 时间。双引号分隔字符串上下文:整个 双引号字符串是单个字符串,不能被拆分。 (例外: "$@" 展开到位置参数列表,例如"$@ 是 如果有三个位置,则相当于"$1" "$2" "$3" 参数。见What is the difference between $* and $@?)

    使用$(foo) `foo` 进行命令替换也是如此。在旁注中,不要使用`foo`:它的引用规则是 怪异且不可移植,并且所有现代 shell 都支持 $(foo) 除了具有直观的引用规则之外,绝对等价。

    算术代换的输出也经历相同的 扩展,但这通常不是问题,因为它只包含 不可扩展字符(假设 IFS 不包含数字或 -)。

    更多详情请见When is double-quoting necessary? 可以省略引号的情况。

    除非您的意思是让所有这些繁琐的事情发生,否则请记住 始终在变量和命令替换周围使用双引号。做 注意:省略引号不仅会导致错误,还会导致 security holes.

    【讨论】:

      【解决方案2】:

      echo 将按顺序打印每个参数,用一个空格分隔。您将一堆不同的参数传递给echo

      简单的解决方法是引用$A:

      A=$(printf "%-40s %8s %9s  %7s" "File system" "Free" "Refquota" "Free %")
      echo "$A"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-07
        • 2019-11-05
        • 1970-01-01
        • 2014-10-21
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多