'-ge'を使用したバッシュテストトイレ - 0で除算エラー

'-ge'を使用したバッシュテストトイレ - 0で除算エラー

次のスクリプトではエラーが発生します。

#!/bin/bash  
if [[ $(wc -l "/disk1/environment.sh") -ge 0 ]];then  
   echo "File has data"  
fi

line 2: [[: 5 /disk1/environment.sh: division by 0 (error token is "/environment.sh")

しかし、以下のコードはうまくいきます。

#!/bin/bash  
  if [[ $(wc -l "/disk1/environment.sh") > 0 ]];then  
    echo "File has data"  
  fi

ここで「-ge」と「>」がなぜ異なる動作をするのかを教えてくれる人はいますか?
バッシュバージョン:GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

答え1

wc -l /filenameこれは、次のように出力される出力によるものです。

5 /filename

ただし、整数比較(演算子-ge:)を実行しているため、関係のない部分が/filename無効でエラーメッセージが表示されます。

数が返されるwcようにSTDINを介してファイル名を渡すだけです。wc

[[ $(wc -l </disk1/environment.sh) -ge 0 ]]

2番目の場合は、[[ $(wc -l /disk1/environment.sh) > 0 ]]コマンド置換の出力が$(wc -l /disk1/environment.sh)アルファベット順にソートされていることを確認してください0wcこれは、いくつかのエラーが返され、STDOUTで結果が生成されない限り、常にそうです。

、、、、などの[[算術演算子はサポートされていません。次のキーワードが必要です。>>=<<=((

(( $(wc -l </disk1/environment.sh) > 0 ))

答え2

2回目の試みではエラーは発生しませんが、ファイルに少なくとも1行が含まれているかどうかをテストしようとすると動作しません。

出力はwc -l "/disk1/environment.sh"ファイルの行数、スペース、ファイル名で構成されます。行数を使用するには抽出する必要があります。出力を分割する代わりに、より簡単な方法があります。コマンドラインにファイル名を渡すのではなく、wcファイル出力をリダイレクトすることです。次に、wcファイル名なしで数字のみを印刷します。

if [[ $(wc -l <"/disk1/environment.sh") -ge 0 ]];then  
   echo "File has data"  
fi

またはとにかくbash構文を使用しているので、

if (($(wc -l <"/disk1/environment.sh") >= 0)); then  
   echo "File has data"  
fi

もちろん、行数は常に0以上であるため、これは常にtrueです。しかし、他の数字を使用すると便利な結果が得られます。

最初の試みでは-ge演算子を使用します。これは整数演算子です。左辺が整数ではなく、等しいため、エラーメッセージが表示されます42 /disk1/environment.sh

2番目の試行では、条件文<に演算子を使用します。この演算子は文字列比較です(語彙順にソートされています)。wc -l /disk1/environment.sh常に事前に出力される出力は0数字で始まるため、[[ $(wc -l <"/disk1/environment.sh") > 0 ]]常にtrueです。例外は/disk1/environment.sh存在しません。この場合、wc -l標準出力には何も生成されず(代わりに標準エラーにエラーメッセージが記録されます)、比較は偽です。

ファイルの行数をゼロと比較することはあまり役に立ちません。最新のシステムではwc -l改行回数を計算します。テキストファイル内の改行の数は、ファイルが空の場合にのみ0です。 (通常、wc -lファイルに改行が含まれていない場合は0が返されます。テキストファイルには各行の末尾に改行が含まれ、テキスト以外のファイルの少数の改行は有用な情報です。)条件に演算子があります。 。ファイルが空であるかどうかをテストするために式を使用すると、を呼び出す必要はありませんwc

if [[ ! -e /disk1/environment.sh ]]; then
  if [[ -L /disk1/environment.sh ]]; then
    echo "/disk1/environment.sh is a broken symbolic link"
  else
    echo "/disk1/environment.sh does not exist"
  fi
elif [[ ! -r /disk1/environment.sh ]]; then
  echo "/disk1/environment.sh exists but is not readable"
elif [[ ! -s /disk1/environment.sh ]]; then
  echo "/disk1/environment.sh is empty or is a special file (name pipe, etc.)"
else
  echo "/disk1/environment.sh is not empty"
fi

関連情報