Putty リモート接続で、ファイルを 1 行ずつ読み取り、各行を区切り文字 (「;」) で切り取り、変数が条件を満たしている場合にコマンドを実行しようとしています。しかし、ファイルを読み取ると「有効な識別子ではありません」というメッセージが表示されます。
test.sh ファイル内のいくつかの簡単なロジック:
while read download.archive
do
likes = $(echo cut -d ";" -f 1 $line)
echo $likes
dislikes = $(echo cut -d ";" -f 2 $line)
dislikes = $((dislikes * 95))
url = $(echo cut -d ";" -f 3 $line)
if [$likes -gt $dislikes]
then
youtube-dl --config-location youtube-dl-3.conf url
fi
done < download.archive
download.archive ファイルの内容は次のとおりです。
9873;354;https://www.youtube.com/watch?v=0fd56CGnVRU
3267;54;https://www.youtube.com/watch?v=Mq4jAwPdCMw
25411;871;https://www.youtube.com/watch?v=PcSBOUpgngM
2829;44;https://www.youtube.com/watch?v=S-rj8m7Ssow
921;303;https://www.youtube.com/watch?v=JchVQMuxRVA
2014;32;https://www.youtube.com/watch?v=H8Y_ZfNViPU
しかし、./test.sh を実行しようとすると、次のエラーが発生します"./test.sh: line 4: read: 'download.archive': not a valid identifier"
。ファイルが有効な場合、なぜエラーが発生するのでしょうか?
答え1
多数のエラーが発生した後、動作するコードは次のとおりです。
while IFS= read -r line; do
likes=$(cut -d ";" -f 1 <<< "$line")
dislikes=$(cut -d ";" -f 2 <<< "$line")
likes=$((likes / 50))
url=$(cut -d ";" -f 3 <<< "$line")
if [ $likes -gt $dislikes ]
then
youtube-dl --config-location youtube-dl-3.conf $url
fi
done < download.archive
「read」コマンドの最初の行は常に上記のようになります(readライン)、そして読み込まれるファイルは末尾の「done」ステートメントの後にあります(done <ダウンロード.アーカイブ)。この投稿はこちらIFS
および-r
追加機能とその機能について説明します。
変数を割り当てるとき、割り当ての間にスペースを入れることはできないようです。そのため、これは機能しません。
likes = $(cut -d ";" -f 1 $line)
しかし、これは次のようになります:
likes=$(cut -d ";" -f 1 $line)
...ただし、プログラムが現在読み取っている行を参照するには、 を使用する必要があります<<<
。次のようになります。
likes=$(cut -d ";" -f 1 <<< $line)
最後に、(文中の)条件をチェックするときはif
、始めと終わりの括弧と、その中の条件の間にスペースが必要です。
if [ $likes -gt $dislikes ]
url
youtube-dl の URL を保持する変数を参照するには、 を使用して変数を参照します$
。次のようにします。
$url