For 循环格式化

For 循环格式化

我在格式化长输入字符串的嵌套 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}

是一种与“逗号分隔值”非常相似的格式。

相关内容