파일에서 변수로 행 읽기

파일에서 변수로 행 읽기

시간과 노력을 절약하기 위해 대규모 프로세스를 자동화하려고 노력하고 있지만 아마도 필요 이상으로 어렵게 만들고 있는 것 같습니다. 지금까지 내가 하고 있는 일은 다음과 같습니다.

#!/bin/bash
LISTFILE="/tmp/filename"
for FILE in $LISTFILE
    do curl -XDELETE ADDRESS:PORT/VALUE/VALUE/$FILE
done

그러나 $FILE 값을 반환하는 대신 /tmp 및 /filename에서 오류가 발생합니다. 내가 해야 할 일은 파일을 반복하고 각 줄에 대해 한 번씩 명령을 실행하고 $FILE 값을 채우는 것입니다.

어떤 조언이라도 대단히 감사하겠습니다.

답변1

이 경우 for값이 $FILE의 값이 되는 반복을 한 번만 수행하면 됩니다 $LISTFILE.

파일의 줄을 반복하려면 다음을 사용하면 됩니다.

while read -r FILE; do
    curl -XDELETE "ADDRESS:PORT/VALUE/VALUE/$FILE"
done < /tmp/filename

이는 파일의 각 줄에 별도의 파일이 나열되어 있다고 가정합니다.

답변2

for줄은:

for FILE in $LISTFILE

"그 안의 모든 행에 대해"를 의미하지는 않습니다 $LISTFILE. 이는 "변수의 각 항목에 대해"를 의미합니다 $LISTFILE. $LISTFILE파일 경로만 포함했으므로 해당 경로 $FILE가 저장됩니다.

for"각 줄"에 대해 명령을 반복 하도록 하세요 .콘텐츠$LISTFILE', 다음과 같이 코드를 변경해야 합니다.

#!/bin/bash
LISTFILE="/tmp/filename"
while read FILE
   do echo $FILE
done < $LISTFILE

이것은 while루프를 사용하고 read"입력"을 한 줄씩 읽는 명령을 사용합니다. 우리의 입력은 파일의 내용이며, 마지막에 지정합니다(이 부분: ) < $LISTFILE.

답변3

쉘 루프를 사용하여 텍스트 파일의 행을 처리하는 거의 모든 경우에는 또는 또는 또는 (또는 기타 사용 가능한 텍스트 처리 도구)을 for사용하는 것이 더 좋습니다 . 더 빠르고 쉬우며 원치 않는 부작용(예: 사용하기 전에 IFS 설정)이 없습니다 .awkcutsedperlread

예를 들어:

awk '{print "curl -XDELETE '\''ADDRESS:PORT/VALUE/VALUE/"$1"'\''"}' \
 /tmp/filename | 
 sh

(올바른 출력이 생성되는지 확인하려면 sh, bash 또는 dash 등으로 파이프하지 않고 먼저 실행하십시오.)

이렇게 하면 원하는 작업이 수행되며 공백, 전역 와일드카드, 앰퍼샌드, 세미콜론 등이 포함된 파일 이름을 수용할 수 있도록 URL 주위에 작은따옴표를 넣습니다. 파일 이름에 작은따옴표나 줄 바꿈이 포함된 파일을 제외한 모든 파일에 적용됩니다. 후자는 개행으로 구분된 입력 파일로 수정할 수 없지만 전자는 명령문 앞에 다음을 삽입하여 수정할 수 있습니다 print.

gsub(/'\''/,"'"'\\\\''"'");

나는 최근에 그것이 무엇을 하는지에 대한 설명을 여기에 썼습니다:https://unix.stackexchange.com/a/293818/7696

awk '{ gsub(/'\''/,"'"'\\\\''"'");
       print "curl -XDELETE '\''ADDRESS:PORT/VALUE/VALUE/"$1"'\''"}' \
 /tmp/filename | 
 sh

파일 이름에 성가신 문자가 없을 것이라고 확신한다면 훨씬 더 간단합니다.

awk '{ print "curl -XDELETE ADDRESS:PORT/VALUE/VALUE/"$1 }' /tmp/filename | sh

관련 정보