컬 오류 URL (3)

컬 오류 URL (3)

파일을 반복하면서 URL의 줄(단어)과 함께 컬 API를 사용하고 싶습니다.

그 내용은 list2csv.sh다음과 같습니다:

#!/bin/bash

for word in $( cat $1 )
do
    echo "https://api.dictionaryapi.dev/api/v2/entries/en/$word" 
    curl "http://api.dictionaryapi.dev/api/v2/entries/en/$word" 
done

문서 내용 list:

timber
clatter

실행하면 ./list2csv.sh list출력은 다음과 같습니다.

https://api.dictionaryapi.dev/api/v2/entries/en/timber
curl: (3) URL using bad/illegal format or missing URL
https://api.dictionaryapi.dev/api/v2/entries/en/clatter
curl: (3) URL using bad/illegal format or missing URL

에코된 URL을 컬링하려고 하면 다음과 같은 결과가 나타납니다.

$ curl https://api.dictionaryapi.dev/api/v2/entries/en/timber
[{"word":"timber","phonetic":"ˈtɪmbə","phonetics":[{"text":"ˈtɪmbə","audio":"//ssl.gstatic.com/dictionary/static/sounds/20200429/timber--_gb_1.mp3"}],"origin":"Old English in the sense ‘a building’, also ‘building material’, of Germanic origin; related to German Zimmer ‘room’, from an Indo-European root meaning ‘build’.","meanings":[{"partOfSpeech":"noun","definitions":[{"definition":"wood prepared for use in building and carpentry.","example":"the exploitation of forests for timber","synonyms":["wood","logs","firewood","planks","wood products","forest","woodland","woods","lumber"],"antonyms":[]},{"definition":"personal qualities or character.","example":"she is frequently hailed as presidential timber","synonyms":[],"antonyms":[]}]}]}]%

$ curl https://api.dictionaryapi.dev/api/v2/entries/en/clatter
[{"word":"clatter","phonetic":"ˈklatə","phonetics":[{"text":"ˈklatə","audio":"//ssl.gstatic.com/dictionary/static/sounds/20200429/clatter--_gb_1.mp3"}],"origin":"Old English (as a verb), of imitative origin.","meanings":[{"partOfSpeech":"noun","definitions":[{"definition":"a continuous rattling sound as of hard objects falling or striking each other.","example":"the horse spun round with a clatter of hooves","synonyms":[],"antonyms":[]}]},{"partOfSpeech":"verb","definitions":[{"definition":"make or cause to make a continuous rattling sound.","example":"her coffee cup clattered in the saucer","synonyms":["rattle","clank","clink","clunk","clang","bang","blatter"],"antonyms":[]}]}]}]%

저는 macOS를 사용하지만 다른 운영 체제도 사용해 보았습니다.

답변1

입력 파일은 DOS 텍스트 파일입니다. 각 줄 끝에 추가 캐리지 리턴 문자가 포함되어 있으며 이러한 문자는 word변수 값의 일부가 되어 다음과 같은 특정 오류가 발생합니다 curl.

$ curl $'http://localhost/somepath\r'
curl: (3) URL using bad/illegal format or missing URL

끝에 캐리지 리턴이 없으면 예상되는 오류가 발생합니다(이 컴퓨터에서 실행 중인 웹서버가 없습니다).

$ curl 'http://localhost/somepath'
curl: (7) Failed to connect to localhost port 80 after 0 ms: Connection refused

예를 들어 입력 파일을 Unix 텍스트 파일로 변환하는 데 사용하는 것을 고려하십시오 dos2unix.

쉘이 전체 입력 파일을 한 번에 읽고 파일 내용을 공백, 탭 및 줄 바꿈으로 분할하고 결과 단어에 대해 파일 이름 글로빙을 수행하도록 강제하기 때문에 코드에도 문제가 있습니다. 또한 동일한 방식으로 명령줄에 지정된 경로 이름을 분할할 수 있습니다.

while한 번에 한 단어씩 읽으려면 루프를 사용하는 것이 더 안전합니다.

#!/bin/sh

cat -- "$@" |
while IFS= read -r word; do
    curl "https://api.dictionaryapi.dev/api/v2/entries/en/$word"
done

또는 xargs,

#!/bin/sh

cat -- "$@" |
xargs -t -I {} \
    curl 'https://api.dictionaryapi.dev/api/v2/entries/en/{}'

위의 두 스크립트는 모두 명령줄에 인수로 제공된 모든 파일을 연결하고 출력을 curl한 번에 한 줄씩 으로 파이프합니다.

또한 URL의 HTTP를 HTTPS로 수정했습니다. HTTP를 사용하면 원격 서비스에 의해 HTTPS 사이트로 리디렉션되며 자동으로 따라가려면 -Lwith를 사용해야 합니다 .curl

관련 정보