시간과 노력을 절약하기 위해 대규모 프로세스를 자동화하려고 노력하고 있지만 아마도 필요 이상으로 어렵게 만들고 있는 것 같습니다. 지금까지 내가 하고 있는 일은 다음과 같습니다.
#!/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 설정)이 없습니다 .awk
cut
sed
perl
read
예를 들어:
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