我有这段代码从curl获取文件大小:
file_size=$(curl -sI -b cookies.txt -H "Authorization: Bearer $access_token" -X GET "https://url.com/api/files$file" | grep Content-Length | awk '{print $2}')
我有另一组变量:
output_filesize_lowerBound=25000000
output_filesize_upperBound=55000000
wrong_filesize=317
我想编写一个比较它们的if语句,并允许我处理它。样本:
if [[ ( "$file_size" > "$output_filesize_lowerBound" ) && ( "$file_size" < "$output_filesize_upperBound" ) ]]
then
echo "Writing"
curl -b cookies.txt -H "Authorization: Bearer $access_token" -X GET "https://url.com/api/files$file" -o "$output_file"
elif [[ ( "$file_size" == "$wrong_filesize" ) ]]
then
echo "Wrong File"
else
echo "There is some problem with the file's size, please check it online"
fi
不知怎的,它不能用于错误的文件,即它不会转到第二个if并且每次都先执行。
我浪费了将近一整天的时间来尝试我能找到的所有替代方案。
答案 0 :(得分:3)
首先,我建议使用不同的策略来获取对象大小。我在不同的时间使用过这两种方法:
file_size="$(curl -s -o/dev/null -w '%{size_download}' "$url")"
或
file_size="$(curl -sI "$url" | awk '{a[$1]=$2} END {print a["Content-Length:"]}')"
第一个下载整个对象并返回curl实际看到的字节数。它适用于不返回长度标头的URL。第二个使用curl -I
仅下载标题。
请注意,您也可以在纯bash中解析curl
输出,而不使用awk。但无论如何,这一切都有效。 :)
其次,问题是您的if
符号可能无法与您获得的结果一起使用。您可能需要添加一些调试代码,以使问题实际存在的位置更加明显。我建议分别测试每个潜在的故障并报告具体问题:
if (( file_size < output_filesize_lowerBound )); then
echo "ERROR: $file_size is too small." >&2
elif (( file_size > output_filesize_upperBound )); then
echo "ERROR: $file_size is too big." >&2
elif (( file_size == wrong_filesize )); then
# This will never be hit if wrong_filesize is < lowerBound.
echo "ERROR: $file_size is just plain wrong." >&2
else
echo "Writing"
...
fi
通过单独测试您的限制并在测试错误输出中包含测试数据,更准确地说明导致脚本出现异常行为的原因。
例如,如果您希望在对lowerBound测试file_size之前完成wrong_filesize测试,则可以简单地重新排序测试。