まず、ファイルサイズ情報を取得するためにカールを使用します。
fileSize=$( curl http://linux.die.net/include/sys/ioctl.h --head | grep Content-Length | awk '{print $2}')
echo $fileSize
1825年
その後、ファイルをダウンロードしてサイズを確認します。
downloadedSize=$(wc -c ioctl.h | awk '{print $1}')
echo $downloadedSize
1825年
その後、この変数を比較したいと思います。しかし、条件は常に偽です。
if [[ "$fileSize" == "$downloadedSize" ]]; then
echo "success"
else
echo "fail"
fi
私はこれを試しました
if [ "$fileSize" == "$downloadedSize" ]; then
if [ $fileSize == $downloadedSize ]; then
if [[ $fileSize == $downloadedSize ]]; then
代わり-eq
に==
何が問題なの?
答え1
ランニング:
$ echo "$fileSize" | od -c
0000000 1 8 2 5 \r \n
0000006
$ echo "$downloadedSize" | od -c
0000000 1 8 2 5 \n
0000005
最初のケースでは、キャリッジリターンが値に追加され(httpヘッダーにdos行終端がある:CRLF)、2番目の変数は正しいことを示しています。 CR(\r
)を削除するとテストが機能します。たとえば、
fileSize=$( curl http://linux.die.net/include/sys/ioctl.h --head |
awk '/Content-Length/ {gsub("\r",""); print $2; exit}')
答え2
条件の両方のオペランドは数値であるため、以下を使用する必要があります。
if [[ $fileSize -eq $downloadedSize ]]; then
変数の値にスペースが含まれている場合、大文字と小文字が区別されます。
答え3
[
または を使用すると[[
構文が異なります。これは同じコマンドではありません。大規模な外部awkの代わりに組み込みコマンドを使用してソリューションを開発できます。私はgrepを使って組み込みコマンドを使って同じことをすることができますcase
。
filesize=$(curl http://linux.die.net/include/sys/ioctl.h --head | grep Content-Length)
downloadedSize=$(wc -c < ioctl.h )
filesize=${filesize//[^0-9]/} # rm not numbers
downloadedSize=${downloadedSize//[^0-9]/}
answer="not same"
# compare strings
[ "$filesize" = "$downloadedSize" ] && answer="same"
echo "$answer"