Bash printf-使用数组作为参数

Bash printf-使用数组作为参数,bash,printf,Bash,Printf,我试图在bash中作为调试工具从代码中打印出一些数据。 所以我想将所有数据存储在一个数组中,然后打印出来 到目前为止,我已经使用一些参数设置了printf: DATA\u ARRAY+=(“\n%-5s%-10s%-15s%-10s%-5s%-5s%-5s%-120s”“data1”“data2”“data3”“data4”“data5”“data6”“data7”“data8”)WARE数据在本例中是随机文本。这将在终端中为我提供一个很好的基于列的文本 但是,其他数据可能看起来更简单: DAT

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

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

DATA\u ARRAY+=(“\n%-5s%-10s%-15s%-10s%-5s%-5s%-5s%-120s”“data1”“data2”“data3”“data4”“data5”“data6”“data7”“data8”)
WARE数据在本例中是随机文本。这将在终端中为我提供一个很好的基于列的文本

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

DATA\u ARRAY+=(“\n%-s”“[删除]\ID:$dataID数据丢失->删除$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")
直接,但这不是我想做的。

“${array[*]}”
将所有元素连接到一个参数中<代码>“${array[@]}”将扩展为每个元素一个参数:

$ args=("Hello %s\n" "World")
$ printf "${args[@]}"
Hello World
“${array[*]}”
将所有元素连接到一个参数中<代码>“${array[@]}”将扩展为每个元素一个参数:

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

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

  • MYFMT
    :(简单变量)将连续格式字符串追加到此变量的末尾
  • 数据_数组
    :(数组)将连续项追加到此数组的末尾
使用问题中的样本,我们得到:

$ 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

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

  • MYFMT
    :(简单变量)将连续格式字符串追加到此变量的末尾
  • 数据_数组
    :(数组)将连续项追加到此数组的末尾
使用问题中的样本,我们得到:

$ 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

是的,这就是剥猫皮的方法。试过这么做,但打印出来的参数“\n%-5s%-10s%-15s%-10s%-5s%-5s%-5s%-120s”并不是一个argument@Fredrik只有第一个参数将用作格式字符串。您附加到一个数组中,因此其中可能已经有项。您可以使用
declare-p DATA_ARRAY
@检查其他人,这样我添加到其中的每个新项都将忽略我放置的格式,因此我只能格式化一次数组?如果是这样的话,有可能在这个数组中添加一个第二格式吗?没有办法做<代码> Prtff“%s”hello“%s\n”世界< /代码>,不,你可以使用多个<代码> Prtff < /Cult> s。也许你不需要收集多个格式字符串和多个参数,你可以在那里执行
printf
,而是收集预先格式化的字符串ep,这就是剥猫皮的方法。尝试过这样做,但参数“\n%-5s%-10s%-15s%-10s%-5s%-5s%-5s%-5s%-120s”被纳入印刷品中,而不是argument@Fredrik只有第一个参数将用作格式字符串。您附加到一个数组中,因此其中可能已经有项。您可以使用
declare-p DATA_ARRAY
@检查其他人,这样我添加到其中的每个新项都将忽略我放置的格式,因此我只能格式化一次数组?如果是这样的话,有可能在这个数组中添加一个第二格式吗?没有办法做<代码> Prtff“%s”hello“%s\n”世界< /代码>,不,你可以使用多个<代码> Prtff < /Cult> s。也许不需要收集多个格式字符串和多个参数,您可以在那里执行
printf
,而是收集预格式化字符串