bash 如何声明和迭代值对,其中值可能包含空格(二维数组)

Tho*_*ner 1 variables bash loops

1) 声明

例如,我有成对的目录。这些对包含空格(和/或其他不便,如额外的句点或特殊字符。ext4 可以轻松支持任何东西。)

'/foo/dolor sit/amet.elit'         '/bar/accumsan/luctus massa.nec'
'/baz/sagittis. Fusce/vitae.dolor' '/bam/Nunc aliquetjusto.metus'
Run Code Online (Sandbox Code Playgroud)

我想编写一个 bash 脚本,其中这些对是硬编码/常量。

我非常喜欢在分隔符或不需要预处理任意字符串的字符串中声明字符串(例如,如果可能,我不想在所有文字空格上添加转义符)


2)迭代

使用声明的字符串对,我希望进入一个循环,其中两个字符串在一次迭代中都可以作为单独的变量使用,例如$LEFT$RIGHT

可能使用简单的文件操作,如复制、移动、链接、差异。


笔记:

  • 数组的“高度”应该允许很多对。
  • 如果声明和迭代可以支持大于 2 的二维数组,请注意如何扩展到所需的。
  • 如果 bash 具有“数组”特定数据类型,则问题/答案不强制使用它。任何可迭代的二维声明和迭代就足够了。

Tho*_*ner 7

一种愚蠢而简单的方法,如果您无论如何都要对数据进行硬编码,则可以将数据硬编码为 shell 函数的参数。

#!/usr/bin/env bash

do_for_pair() {
    echo $1
    echo $2
}

do_for_pair "/foo/dolor sit/amet.elit"         "/bar/accumsan/luctus massa.nec"
do_for_pair "/baz/sagittis. Fusce/vitae.dolor" "/bam/Nunc aliquetjusto.metus"
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这种方法。这太务实了。 (2认同)

che*_*ner 5

您可以使用关联数组(bash4 或更高版本):

declare -A arr
arr['/foo/dolor sit/amet.elit']='/bar/accumsan/luctus massa.nec'
arr['/baz/sagittis. Fusce/vitae.dolor']='/bam/Nunc aliquetjusto.metus'

for LEFT in "${!arr[@]}"; do
    RIGHT=${arr["$LEFT"]}
    ...
done
Run Code Online (Sandbox Code Playgroud)