5

Linuxシェルスクリプトで変数を別の変数から定数を引いたものと比較したい。

cpp では、これは次のようになります。

int index = x;
int max_num = y;

if (index < max_num - 1) {
  // do whatever
} else {
  // do something else
}

シェルで次のことを試しました:

  index=0
  max_num=2
  if [ $index -lt ($max_num - 1) ]; then
    sleep 20
  else 
    echo "NO SLEEP REQUIRED"
  fi

私も試しました:

if [ $index -lt ($max_num-1) ]; then
...

if [ $index -lt $max_num - 1 ]; then
...

if [ $index -lt $max_num-1 ]; then
...

しかし、これらのバージョンは動作しません。そのような条件をどのように正しく書きますか?

よろしく

4

3 に答える 3

7

試したさまざまな例は機能しません。これは、試したどのバリアントでも実際に算術演算が行われないためです。

あなたは言えた:

if [[ $index -lt $((max_num-1)) ]]; then
  echo yes
fi

$(( expression ))算術式を示します。

[[ expression ]]条件付きコンストラクトです。

于 2013-11-07T13:41:58.240 に答える
2

移植可能 (プレーンsh) と言えます。

if [ "$index" -lt "$((max_num-1))" ]; then
    echo yes
fi

短縮版

[ "$index" -lt "$((max_num-1))" ] && echo yes;

[はプログラムですが、 as として呼び出された場合testは閉じる必要があります。変数を引用符で囲む必要があることに注意してください。冗長で一貫性のない bash 拡張機能 cruft ( ) を使用する場合、引用符は必要ありません。][[[ ... ]]

于 2013-11-07T13:50:01.657 に答える
2

ではbash、より読みやすい算術コマンドを使用できます。

index=0
max_num=2
if (( index < max_num - 1 )); then
  sleep 20
else 
  echo "NO SLEEP REQUIRED"
fi

厳密に POSIX に準拠したものは次のとおりです。

index=0
max_num=2
if [ "$index" -lt $((max_num - 1)) ]; then
  sleep 20
else 
  echo "NO SLEEP REQUIRED"
fi
于 2013-11-07T14:36:05.167 に答える