有没有办法在 bash 中使用变量来置换内部?

Is there a way to permute inside using to variables in bash?

我正在使用软件 plink2 (https://www.cog-genomics.org/plink/2.0/),我正在尝试迭代 3 个变量。

此软件接受一个扩展名为 .ped 的输入文件和一个扩展名为 .txt 的包含名称列表的排除文件从输入文件中排除。

想法是遍历输入文件,然后排除文件以生成单个输出文件。

  1. 输入文件:Highland.ped - Midland.ped - Lowland.ped
  2. 排除地图文件:HighlandMidland.txt - HighlandLowland.txt - MidlandLowland.txt
  3. 输出文件:HighlandMidland - HighlandLowland - MidlandHighland - MidlandLowland - 低地高地 - 低地中部

通用代码为:

plink2 --file Highland --exclude HighlandMidland.txt --out HighlandMidland
plink2 --file Highland --exclude HighlandLowland.txt --out HighlandLowland
plink2 --file Midland --exclude HighlandMidland.txt --out MidlandHighland
plink2 --file Midland --exclude MidlandLowland.txt --out MidlandLowland
plink2 --file Lowland --exclude HighlandLowland.txt --out LowlandHighland
plink2 --file Lowland --exclude MidlandLowland.txt --out LowlandMidland

为了避免重复此代码 6 次不同的时间,我想使用上面列出的变量(1、2 和 3)来创建单个输出文件。输出文件是替换输入文件名称的排列。

老实说,我认为你现在的代码很清楚;但是如果你真的想把它写成一个循环,这里有一种可能性:

lands=(Highland Midland Lowland)
for (( i = 0 ; i < ${#lands[@]} ; ++i )) ; do
  for (( j = i + 1 ; j < ${#lands[@]} ; ++j )) ; do
    plink2 --file "${lands[i]}" --exclude "${lands[i]}${lands[j]}.txt" --out "${lands[i]}${lands[j]}"
    plink2 --file "${lands[j]}" --exclude "${lands[i]}${lands[j]}.txt" --out "${lands[j]}${lands[i]}"
  done
done

还有一个:

lands=(Highland Midland Lowland)
for (( i = 0 ; i < ${#lands[@]} ; ++i )) ; do
  for (( j = 0 ; j < ${#lands[@]} ; ++j )) ; do
    if [[ "$i" != "$j" ]] ; then
      plink2 \
        --file "${lands[i]}" \
        --exclude "$lands[i < j ? i : j]}$lands[i < j ? j : i]}.txt" \
        --out "${lands[i]}${lands[j]}"
    fi
  done
done

。 . .但上述两者之间的一个共同因素是它们比您当前的代码清晰!