我在格式化长输入字符串的嵌套 for 循环时遇到问题:
我目前正在使用下面的嵌套 for 循环来命名我省略的单独程序的输出文件:
#!/bin/bash
for hemi in lh rh
do
for measure in thickness area volume meancurv gauscurv foldind curvind
do
echo ${hemi}"--"${measure}
done
done
我希望能够像下面这样格式化循环,以便于运行多个不同的循环,这些循环具有可能需要修改的更长的数组列表。只需要在一处修改列表将大大减少出现错误/遗漏等的机会:
#!/bin/bash
hemi=( lh rh )
measure=( thickness area volume meancurv gauscurv foldind curvind )
for((i=${hemi[${i}]};i<2;i++));do
for((j=${measure[${j}]};j<7;j++));do
echo ${hemi[${i}]}"--"${measure[${j}]}
done
done
这是我得到的输出,我无法弄清楚我做错了什么:
lh--thickness
lh--area
lh--volume
lh--meancurv
lh--gauscurv
lh--foldind
lh--curvind
./for_loop_testing.sh: line 7: ((: j=: syntax error: operand expected (error token is "=")
答案1
让我提供一个简化版本:
for i in "${hemi[@]}"; do
for j in "${measure[@]}"; do
echo "$i--$j"
done
done
重点是"${array[@]}"
扩展到所有数组元素,因此这里我们只是迭代所有元素,将它们放入变量i
和 中j
,然后打印它们。
附带说明:不要忘记在变量和数组周围加上双引号,特别是如果任何元素可以包含空格。
答案2
您需要将i
和初始化j
为 0 而不是您分配的值。所以,循环将如下所示:
for((i=0;i<${#hemi[@]};i++));do
for((j=0;j<${#measure[@]};j++));do
echo "${hemi[$i]}--${measure[$j]}"
done
done
${#array[@]}
给出数组中元素的数量。 (请注意,bash 数组可能有空洞(非连续元素),因此只有在您知道它们没有空洞时才使用它。)
答案3
如果您不介意用逗号修改列表,您可以这样做:
#!/bin/bash
printf "%s\n" {lh,rh}--{thickness,area,volume,meancurv,gauscurv,foldind,curvind}
有一些方法可以让这种扩展在 eval 中使用变量,虽然不是那么容易,但可行。需要的话询问。
编辑1:
以防万一这是投反对票的原因。
我将澄清该提案确实管理空格、星号和其他一些困难的名称。尝试:
printf "%s\n" {lh,rh}--{"hello world",foldind," * ",curvind}
是一种与“逗号分隔值”非常相似的格式。