이 표현식이 Bash for-for 구조에서 확장되지 않는 이유는 무엇입니까?

이 표현식이 Bash for-for 구조에서 확장되지 않는 이유는 무엇입니까?

이것은 작동합니다

#!/bin/bash
dir="/home/masi/Documents/CSV/Case/"
targetDir="/tmp/"
id=118
channel=1
filenameTarget=$targetDir"P"$id"C"$channel".csv"
cat $dir"P"$id"C"$channel"T"*".csv" > $filenameTarget

디버깅 시 성공적인 출력bash -x ...

+ dir=/home/masi/Documents/CSV/Case/
+ targetDir=/tmp/
+ id=118
+ channel=1
+ filenameTarget=/tmp/P118C1.csv
+ cat /home/masi/Documents/CSV/Case/P118C1T1000-1010.csv /home/masi/Documents/CSV/Case/P118C1T1010-1020.csv 

for-for 루프의 동일한 표현식이 작동하지 않습니다.

#!/bin/bash
dir="/home/masi/Documents/CSV/Case/"
targetDir="/tmp/"
ids=(118 119)
channels=(1 2)
# http://unix.stackexchange.com/a/319682/16920
for id in ids;
        do
        for channel in channels;
                do
                # example filename P209C1T720-T730.csv
                lastFile=$dir'P'$id'C'$channel'T1790-T1800.csv'
                # show error if no last file exists
                if [[ -f $lastFile ]]; then
                    echo "Last file "$lastFile" is missing" 
                    exit 1
                fi

                filenameTarget=$targetDir"P"$id"C"$channel".csv"
                cat $dir"P"$id"C"$channel"T"*".csv" > $filenameTarget

        done;
done

디버거로 출력bash -x ...

+ dir=/home/masi/Documents/CSV/Case/
+ targetDir=/tmp/
+ ids=(118 119)
+ channels=(1 2)
+ for id in ids
+ for channel in channels
+ lastFile=/home/masi/Documents/CSV/Case/PidsCchannelsT1790-T1800.csv
+ [[ -f /home/masi/Documents/CSV/Case/PidsCchannelsT1790-T1800.csv ]]
+ filenameTarget=/tmp/PidsCchannels.csv
+ cat '/home/masi/Documents/CSV/Case/PidsCchannelsT*.csv'
cat: /home/masi/Documents/CSV/Case/PidsCchannelsT*.csv: No such file or directory

코드 2

if 절은 존재하지 않는 파일에 대해서도 항상 긍정적입니다. 이는 잘못된 것입니다.

#!/bin/bash

dir="/home/masi/Documents/CSV/Case/"
startTimes=( $(seq 300 10 1800) )

id=119
channel=1
# example filename P209C1T720-730.csv
firstFile="${dir}P${id}C${channel}T300-T310.csv"
# show error if no first file exists
if [[ ! -f "${firstFile}" ]]; then
    echo "First file "${firstFile}" is missing" 
    exit 1
fi

cat ${firstFile}

산출

cat: /home/masi/Documents/CSV/Case/P119C1T300-310.csv: No such file or directory
+ for channel in '"${channels[@]}"'
+ for startTime in '"${startTimes[@]}"'
+ endTime=310
+ filenameTarget=/tmp/P119C2.csv
+ cat /home/masi/Documents/CSV/Case/P119C2T300-310.csv

운영체제: 데비안 8.5
리눅스 커널: 4.6

답변1

[[ -f $lastFile ]]~이다진실파일이 존재하는 경우. 그런 다음 당신이 도달한 이후로 다음과 같습니다cat $dir"P"$id"C"$channel"T"*".csv" 그 길은 정말 그렇지~ 아니다존재하다.당신은 아마 원했을 것입니다 if ! [[ -f $lastFile ]].

또한,더 많은 인용문 사용™제대로 - 당신은 인용해야합니다변수. 정적 문자열을 인용하는 것은 좋은 보호 수단이지만 꼭 필요한 것은 아닙니다. 일반적으로 "마지막" 줄을 작성하는 것이 좋습니다 cat "${dir}P${id}C${channel}T"*'.csv' > "$filenameTarget".

관련 정보