次のスクリプトではエラーが発生します。
#!/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)
アルファベット順にソートされていることを確認してください0
。wc
これは、いくつかのエラーが返され、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