BASH 循环遍历变量

BASH 循环遍历变量

如果我在 bash 中有一堆变量,如下所示:

foo_1="path/1"
foo_2="path/2"
foo_3="path/3"
foo_4="path/4"
foo_5="path/5"

它们都以 开头foo_

有没有办法循环遍历它们并对每个运行命令?我尝试使用正则表达式执行此操作

for i in [ $foo_.\+ ]

但这似乎没有起作用。

例如,如果我想运行mkdir以 开头的所有变量foo_,我该怎么做?

答案1

我完全同意@choroba 的建议:动态命名的变量名很难使用。

不过,有一种方法可以使用一些特殊的语法:

for var in "${!foo_@}"; do
    declare -n ref=$var
    mkdir -p "$ref"
done

结果是

$ tree
.
└── path
    ├── 1
    ├── 2
    ├── 3
    ├── 4
    └── 5

6 directories, 0 files

3.5.3 Shell参数扩展手册中说:

${!前缀*}
${!前缀@}

扩展为以 开头的变量的名称字首,由 IFS 特殊变量的第一个字符分隔。当使用 '@' 并且扩展名出现在双引号内时,每个变量名都会扩展为一个单独的单词。

declare文件:

declare [-aAfFgiIlnrtux] [-p] [name[=value] …]

-n

给每个名字名称引用属性,使其成为另一个变量的名称引用。该其他变量由姓名. 所有引用、分配和属性修改姓名,除了使用或更改 -n 属性本身的操作外,都是对引用的变量执行的名字的值。nameref 属性不能应用于数组变量。

答案2

改用数组。

foos=(path/1 path/2 path/3 path/4 path/5)

要创建所有目录,您可以

mkdir -p "${foos[@]}"

或者,如果你想逐一执行某些操作

for foo in "${foos[@]}" ; do
    mkdir -p "$foo"
done

答案3

for var in "${!foo_@}"; do
    ref=${!var}
    mkdir -p "$ref"
done

相关内容