カールエラーURL(3)

カールエラーURL(3)

ファイルを繰り返しながら、URLの行(単語)と一緒にCal 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

最後にキャリッジリターンがないと、予想されるエラーが発生します(このコンピュータで実行されているWebサーバーはありません)。

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

たとえば、入力ファイルをUnixテキストファイルに変換するために使用することを検討してくださいdos2unix

シェルが入力ファイル全体を一度に読み込み、ファイルの内容をスペース、タブ、改行に分割し、結果の単語に対してファイル名のグロービングを実行するように強制するため、コードにも問題があります。同様に、コマンドラインで指定されたパス名を分割することもできます。

while一度に1ワードずつ読みたい場合は、ループを使用する方が安全です。

#!/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一度に1行ずつパイプします。

また、URLのHTTPをHTTPSに変更しました。 HTTPを使用すると、リモートサービスによってHTTPSサイトにリダイレクトされ、自動的にフォローするには-Lwithを使用する必要があります。curl

関連情報