【问题标题】:Bash printf - using array as argumentBash printf - 使用数组作为参数
【发布时间】:2020-08-16 17:39:37
【问题描述】:

我正在尝试从我的代码中打印出一些数据作为 bash 中的调试工具。 所以我想将所有数据存储在一个数组中,以便稍后打印出来。

到目前为止,我已经用一些参数设置了 printf:

DATA_ARRAY+=("\n%-5s %-10s %-15s %-10s %-5s %-5s %-5s %-120s" "data1" "data2" "data3" "data4" "data5" "data6" "data7" "data8") 在这种情况下数据是随机文本。这将在终端中为我提供一个不错的基于列的文本。

但其他数据可能看起来更简单:

DATA_ARRAY+=("\n%-s" "[Remove] \ID: $dataID Data missing -> Removing $dataID")

我的最后一行是用 printf 打印所有内容

printf "${REMOVE_DATA_ARRAY[*]}".

所以我现在的问题是,当我打印它时,所有数据都不会保留结构,它会对“s”和“i”等字符做出反应。

所以我的问题是,是否可以在不转义每个字符 (s,i) 的情况下执行此操作并使用上面给定的结构打印孔数组。

我不想一次打印每个部分。

如果我这样做,程序确实可以工作

printf ("\n%-5s %-10s %-15s %-10s %-5s %-5s %-5s %-120s" "data1" "data2" "data3" "data4" "data5" "data6" "data7" "data8")

直接,但这不是我想做的。

【问题讨论】:

    标签: bash printf


    【解决方案1】:

    "${array[*]}" 会将所有元素连接到一个参数中。 "${array[@]}" 将扩展为每个元素一个参数:

    $ args=("Hello %s\n" "World")
    $ printf "${args[@]}"
    Hello World
    

    【讨论】:

    • 是的,这就是给猫剥皮的方法。
    • 试过这样做,但参数“\n%-5s %-10s %-15s %-10s %-5s %-5s %-5s %-120s”被包含在打印中而不是被一个论点
    • @Fredrik 只有第一个参数将用作格式字符串。你追加到一个数组上,所以那里可能已经有项目了。您可以通过declare -p DATA_ARRAY 进行检查
    • @thatotherguy 所以我添加的每个新项目都会忽略我放置的格式,因此我只能格式化一次数组?如果是这种情况,是否可以解决此问题并在数组中间添加第二种格式?
    • 没有办法做到printf "%s" Hello "%s\n" World,没有。不过,您可以使用多个 printfs。也许不是收集多个格式字符串和多个参数,你可以在那里做printf,而不是收集预先格式化的字符串
    【解决方案2】:

    如何将格式字符串和数据拆分为 2 个单独的变量:

    • MYFMT :(简单变量)将连续的格式字符串附加到此变量的末尾
    • DATA_ARRAY : (array) 将连续的项目附加到这个数组的末尾

    使用我们得到的问题中的样本:

    $ MYFMT="\n%-5s %-10s %-15s %-10s %-5s %-5s %-5s %-120s"
    $ DATA_ARRAY=("data1" "data2" "data3" "data4" "data5" "data6" "data7" "data8")
    
    $ dataID=666
    
    $ MYFMT="${MYFMT} \n%s"
    $ DATA_ARRAY+=("[Remove] \ID: $dataID Data missing -> Removing $dataID")
    
    $ printf "${FMT}" "${DATA[@]}"
    data1 data2      data3           data4      data5 data6 data7 data8
    
    [Remove] \ID: 666 Data missing -> Removing 666
    
    # to see what printf sees:
    
    $ set -x
    
    $ printf "${FMT}" "${DATA[@]}"
    + printf '\n%-5s %-10s %-15s %-10s %-5s %-5s %-5s %-120s \n%s' data1 data2 data3 data4 data5 data6 data7 data8 '[Remove] \ID: 666 Data missing -> Removing 666'
    
    data1 data2      data3           data4      data5 data6 data7 data8
    
    [Remove] \ID: 666 Data missing -> Removing 666
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多