我使用一个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[@]}
部分。
谢谢!
我认为问题是,在
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
以上循环,我把周围的阵列和变量引用双引号,但周围没有通配符;这意味着外壳将扩大通配符(只要你想),但不能乱用变量的内容。
尝试:
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