Bash Curl Output与变量进行比较?

时间:2017-12-12 12:56:03

标签: bash if-statement

我有这段代码从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并且每次都先执行。

我浪费了将近一整天的时间来尝试我能找到的所有替代方案。

1 个答案:

答案 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测试,则可以简单地重新排序测试。