変数が等しい場合は常に false

変数が等しい場合は常に false

まず、ファイルサイズ情報を取得するためにカールを使用します。

fileSize=$( curl http://linux.die.net/include/sys/ioctl.h --head | grep Content-Length | awk '{print $2}')

echo $fileSize1825年

その後、ファイルをダウンロードしてサイズを確認します。

downloadedSize=$(wc -c ioctl.h | awk '{print $1}')

echo $downloadedSize1825年

その後、この変数を比較したいと思います。しかし、条件は常に偽です。

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"

関連情報