For 루프는 두 번 실행됩니다.

For 루프는 두 번 실행됩니다.

따라서 저는 bash 스크립팅을 처음 접했지만 다음과 같은 bash 작업을 원합니다.

게시물 타임스탬프를 만듭니다. (var 또는 파일로)

Feeds.txt라는 파일에서 행을 읽습니다.

전체 문자열에서 숫자 문자열을 두 개의 변수 $feedNum 및 $wholeString으로 분리합니다.

그런 다음 cat 명령을 실행하여 $wholeString이라는 새 파일을 만들거나 추가하고 timestamp.txt의 내용을 파일에 추가합니다.

마지막으로 wget 명령을 실행하여 $feedNum을 URL 문자열에 삽입하고 이전에 생성된 $wholeString 파일에 wget 응답을 출력합니다.

이것이 내가 가진 것입니다.

Feeds.txt는 다음과 같습니다(결국 더 길어집니다).

8147_feed_name.xml
19176_nextfeed_name.xml

제가 정리한 스크립트는 다음과 같았습니다.

#Changes the directory to the correct location
cd /home/scripts
# Inserts the proper timestamp in the file , postdating for one hour.
date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/timestamp.txt

#Loop Logic
for feedNum in `cat feeds.txt |cut -d _ -f 1`;do
   for  wholeString in `cat feeds.txt`; do
    cat /home/scripts/timestamp.txt >>/home/scripts/tmp/$wholeString ;
    wget https\://some.url.com/reports/uptimes/${feedNum}.xml?\&api_key=KEYKEYKEYKEY\&location=all\&start_date=recent_hour -O ->>/home/scripts/tmp/$wholeString;
done
done

내 문제는 4번 실행된다는 것입니다. 따라서 cat과 wget을 삭제하고 다음과 같이 간단한 echo로 바꾸면,

#Changes the directory to the correct location
cd /home/scripts
# Inserts the proper timestamp in the file , postdating for one hour.
date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/timestamp.txt

#Loop Logic
for feedNum in `cat feeds.txt |cut -d _ -f 1`;do
   for  wholeString in `cat feeds.txt`; do
    echo $feedNum $wholeString
done
done

위쪽 줄과 아래쪽 줄이 올바른 이와 같은 출력을 얻습니다. 가운데 2개가 섞여있습니다.

8147 8147_feed_name.xml
8147 19176_nextfeed_name.xml
19176 8147_feed_name.xml
19176 19176_nextfeed_name.xml

왜 이런 일이 발생하는지 이해하지만 해결 방법은 모르겠습니다.

답변1

이렇게 하면 문자열 분할 문제가 해결됩니다(항상 그렇듯이 파일 이름의 공백에 주의하세요).

#Changes the directory to the correct location
cd /home/scripts
# Inserts the proper timestamp in the file , postdating for one hour.
date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/timestamp.txt

#Loop Logic
while IFS=_ read feedNum xmlFile; do
  echo "$feedNum $xmlFile"
done < feeds.txt

wget여기에서 호출을 수집하는 것은 간단해야 합니다.

답변2

OP 여기에는 다른 사용자 이름이 있습니다. 나는 당신이 게시한 첫 번째 코드인 DopeGhoti를 사용하게 되었습니다. 약간의 수정이 필요합니다. 소스 파일을 다시 읽고 각 파일을 가져오는 대신 줄을 잡고 실행하는 방법을 보여주셔서 감사합니다.

 #Create Timestamp
    date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/sitename/timestamp.txt

    #Loop Logic
    while read line; do
       feedNum="$(echo "$line" | cut -d_ -f1)"
       wholeString="$(echo "$line")"
       cat /home/scripts/sitename/timestamp.txt >>/home/scripts/sitename/$wholeString
       wget https\://my.sitename.com/reports/uptimes/${feedNum}.xml?\&api_key=KEY\&location=all\&start_date=recent_hour -O ->>/home/scripts/sitename/$wholeS$
    done < feeds.txt

이를 통해 18개 피드 모두에 대한 올바른 출력이 제공됩니다.

감사합니다!

관련 정보