扩大内的阵列for循环(文件列表)

问题描述 投票:0回答:2

我使用一个for循环遍历文件时遇到了问题。为简单起见,我创建了一个小圈应该解释我此刻这问题。

起点:一个文件夹中的文件具有在其文件名定义的位置特定文件,一到三个数字。

目标:遍历某些文件(不是全部)使用一个for循环。

问题:我创建包含特定用于每个文件中的这些一至三个位数字的阵列。该文件被称为在for循环的开始,我想用数组引用到特定文件。但是:数组不能正确扩展。

希望有人能帮助! (可能有几个很好的替代方式来做到这一点。也许有些人并不需要一个数组,但因为我认为这可能是在如何扩大变量的基本missunderstanding我会有兴趣知道解决我的具体问题作为一个for循环的开头的文件名的一部分。)

这是代码:

declare -a SOME_SAMPLES=(37 132 253 642 242 42)

for d in prmrp_*_${SOME_SAMPLES[@]}_S*_L00?_R1_001.fastq.gz; do

    INPUT_FILE1=$(echo $d | sed 's/_L00._R1_001.fastq.gz//')
    echo ${INPUT_FILE1}

done

同样,这仅仅是一个示例的代码。问题是,如此循环失败这是不正确扩大${SOME_SAMPLES[@]}部分。

谢谢!

arrays bash for-loop
2个回答
1
投票

我认为问题是,在

prmrp_*_${SOME_SAMPLES[@]}_S*_L00?_R1_001.fastq.gz

它不重复对阵列的每个元件的整个表达式,它只是盲目地插入在中间的数组元素,给人这相当于:

prmrp_*_37 132 253 642 242 42_S*_L00?_R1_001.fastq.gz

...是一堆分离的物品(prmrp_*_37作为通配符表达,随后132作为一个简单的字符串,随后253等)。 AIUI要扩展阵列的内容,然后对每个元素使用通配符表达式来获取所有匹配的文件。要做到这一点,最好的办法是使用两个环,一个扩展阵列,另外找到匹配的文件:

for sample in "${SOME_SAMPLES[@]}"; do
    for d in prmrp_*_"${sample}"_S*_L00?_R1_001.fastq.gz; do
        ...

顺便说一句,我也建议使用小写或混合的情况下的变量名称(例如高于sample),以避免与众多全大写的变量具有特殊的含义/功能可能的冲突。另外,我会使用一个参数扩展删除文件名的后缀(而不是sed):

input_file1=${d%_L00?_R1_001.fastq.gz}

此外,你应该一般把周围的变量引用双引号(例如echo "${input_file1}"而不是echo ${input_file1})。 (如input_file1=${d...分配是个例外,虽然双引号不要伤害那里。他们只是没必要)注意,在for以上循环,我把周围的阵列和变量引用双引号,但周围没有通配符;这意味着外壳将扩大通配符(只要你想),但不能乱用变量的内容。


0
投票

尝试:

array=( 37 132 253 642 242 42 );

for d in ${array[@]}; do
    INPUT_FILE1="prmrp_*_"$d"_S*_L00?_R1_001.fastq.gz";
    echo ${INPUT_FILE1}
done
© www.soinside.com 2019 - 2024. All rights reserved.