如何在 bash 脚本中用新行打印出 2 个单独的数组

发布于 2025-01-10 10:01:37 字数 287 浏览 0 评论 0原文

所以基本上我希望能够打印出两个单独的数组,每个元素之间有换行符。

我正在寻找的示例输出:

a         x
b         y

(a,b是一个数组x的一部分,y是一个单独的数组)

当前我使用:

printf "%s\n" "${words[@]}        ${newWords[@]}"

但输出结果如下:

a
b         x
y

So basically I want to be able to print out 2 separate arrays with newlines between each element.

Sample output I'm looking for:

a         x
b         y

(a,b being apart of one array x,y being a separate array)

Currently im using:

printf "%s\n" "${words[@]}        ${newWords[@]}"

But the output comes out like:

a
b         x
y

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

末が日狂欢 2025-01-17 10:01:37

由于 bash 已标记,您可以使用 GNU coreutils 中的 paste 将每个数组作为输入:

$ words=(a b)

$ newWords=(x y)

$ paste <(printf '%s\n' "${words[@]}") <(printf '%s\n' "${newWords[@]}")
a   x
b   y

TAB 是默认的列分隔符,但您可以使用选项 - 更改它d。

如果您的数组项可能包含换行符,则可以使用 -z 标志切换到例如 NUL 分隔的字符串,并使用 printf '% 生成每个输入s\0'

As bash is tagged, you could use paste from GNU coreutils with each array as an input:

$ words=(a b)

$ newWords=(x y)

$ paste <(printf '%s\n' "${words[@]}") <(printf '%s\n' "${newWords[@]}")
a   x
b   y

TAB is the default column separator but you can change it with option -d.

If you have array items that might contain newlines, you can switch to e.g. NUL-delimited strings by using the -z flag and producing each input using printf '%s\0'.

甚是思念 2025-01-17 10:01:37

"${words[@]} ${newWords[@]}" 会产生什么?让我们将该扩展放入另一个数组中,看看它里面有什么:

words=(a b)
newWords=(x y)
tmp=("${words[@]}        ${newWords[@]}")
declare -p tmp
declare -a tmp=([0]="a" [1]="b        x" [2]="y")

因此,第一个数组的最后一个元素和第二个数组的第一个元素作为字符串连接起来;其他元素仍然是单独的。


使用 2 个进程替换的 paste 是解决此问题的好方法。如果您想在普通 bash 中执行此操作,请迭代数组的索引

for idx in "${!words[@]}"; do
    printf '%s\t%s\n' "${words[idx]}" "${newWords[idx]}"
done

What does "${words[@]} ${newWords[@]}" produce? Let's put that expansion into another array and see what's inside it:

words=(a b)
newWords=(x y)
tmp=("${words[@]}        ${newWords[@]}")
declare -p tmp
declare -a tmp=([0]="a" [1]="b        x" [2]="y")

So, the last element of the first array and the first element of the second array are joined as a string; the other elements remain individual.


paste with 2 process substitutions is a good way to solve this. If you want to do it in plain bash, iterate over the indices of the arrays:

for idx in "${!words[@]}"; do
    printf '%s\t%s\n' "${words[idx]}" "${newWords[idx]}"
done
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文