如果我在 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