私は現在、「ダウンロードマネージャのコマンドラインインターフェイス」を意味する「dmCLI」というプロジェクトを進めています。カールを使用してファイルを部分的にダウンロードしています。私のコードに問題があります。文字列を整数に変換できません。
ここに私の完全なコードがあります。また、私のコードをGithub Repoにアップロードしました。ここにいる: dmCLI GitHubリポジトリ
#!/bin/bash
RED='\033[0;31m'
NC='\033[0m'
help() {
echo "dmcli [ FILENAME:path ] [ URL:uri ]"
}
echo -e "author: ${RED}@atahabaki${NC}"
echo -e " __ _______ ____"
echo -e " ___/ /_ _ / ___/ / / _/"
echo -e "/ _ / ' \/ /__/ /___/ / "
echo -e "\_,_/_/_/_/\___/____/___/ "
echo -e " "
echo -e "${RED}Downloading${NC} has never been ${RED}easier${NC}.\n"
if [ $# == 2 ]
then
filename=$1;
url=$2
headers=`curl -I ${url} > headers`
contentlength=`cat headers | grep -E '[Cc]ontent-[Ll]ength:' | sed 's/[Cc]ontent-[Ll]ength:[ ]*//g'`
acceptranges=`cat headers | grep -E '[Aa]ccept-[Rr]anges:' | sed 's/[Aa]ccept-[Rr]anges:[ ]*//g'`
echo -e '\n'
if [ "$acceptranges" = "bytes" ]
then
echo File does not allow multi-part download.
else
echo File allows multi-part download.
fi
echo "$(($contentlength + 9))"
# if [acceptranges == 'bytes']
# then
# divisionresult = $((contentlength/9))
# use for to create ranges...
else
help
fi
# First get Content-Length via regex or request,
# Then Create Sequences,
# After Start Downloading,
# Finally, re-assemble to 1 file.
contentlengthの値を9で割りたいです。私は以下を試しました:
echo "$(($contentlength/9))"
次のエラーが発生します。
/9") 構文エラー: 無効な算術演算子 (エラーは " で示される)
node.jsで書かれたlocalhostを使用しています。ヘッダー応答を追加しました。要求されたファイルのContent-Lengthを返し、上記のdmCLI.shはContent-Length値を正しく取得します。
./dmcli.sh home.html http://127.0.0.1:404/
HEADリクエストhttp://127.0.0.1:404/戻り値: コンテンツの長さ: 283, 許容範囲: バイト
dmCLIは値を取得するために使用されますが、その値にアクセスしようとすると機能しません。
簡単な操作は次のとおりです。
echo "$contentlength"
ただし、次の方法でアクセスできません。
echo "$contentlength bytes"
そしてここ:
echo "$(($contentlength + 9))"
9を返しますが、292を予想しました。問題は何ですか?なぜ動作しないのですか?
答え1
次の正規表現はバイト数と数字のみを抽出します。
contentlength=$(
LC_ALL=C sed '
/^[Cc]ontent-[Ll]ength:[[:blank:]]*0*\([0-9]\{1,\}\).*$/!d
s//\1/; q' headers
)
上記の変更後、contentlength
変数は10進数でのみ構成されるため(シェルが数字を8進数で処理しないように先行ゼロを削除します)、次の2行は同じ結果を示します。
echo "$(($contentlength/9))"
echo "$((contentlength/9))"
答え2
headers=`curl -I ${url} > headers` contentlength=`cat headers | grep -E '[Cc]ontent-[Ll]ength:' | sed 's/[Cc]ontent-[Ll]ength:[ ]*//g'` echo "$(($contentlength/9))"
次のエラーが発生します。
/9")syntax error: invalid arithmetic operator (error token is "
HTTPヘッダーは常にLFではなくCR / LFで終わります。`cat headers | ...`
コマンド拡張は後続のLFを削除しますが、CRを維持するため、奇妙なエラーが発生します。
% var=`printf "%s\r\n" 333`
% echo var={$var}
}ar={333
% echo "$((var / 3))"
")syntax error: invalid arithmetic operator (error token is "