変数が存在するか等しくないかを有効に比較します。

変数が存在するか等しくないかを有効に比較します。

私のスクリプトの構文に問題がありますsh。 Asusルーター用のスクリプトを作成しました。スクリプトは完璧に動作します。しかし、次の行があります。

if [[ "$OldIP" && "$StartIP" != "$OldIP" ]]; then echo OK; fi

が異なる場合にのみtrueで実行する必要がありますecho OK。ラインは動作しますが、より効率的に動作するのを見たいです。これらの変数には有効なIPアドレスが含まれています。$StartIP$OldIP

場合によっては$OldIP何も割り当てられません(初期化されていません)。しかし、$OldIPそれが存在しない場合、それは私の殻でそれらが同じではないことを意味します!

私はその行が次のことをしたくありません:$OldIP存在しない場合 - >他のものをテスト - >実行echo OK

$OldIP私はその行がa)存在しない場合 - >終わりを意味したいと思います。 b)$OldIP存在する場合 -> 異なるかテスト -> 実行しますecho OK

"$OLDIP" &&だから可能であれば何とか削除したいと思います。学びたい質問ではありません。 :)

一種の(しかし動作しません):

if [ [ "$OldIP" ] != "$StartIP" ]; then echo OK; fi

または

if [ $OldIP != "$StartIP" ]; then echo OK; fi

これが私が欲しいのですが、どの時点で文句が出ますか?古いIP空(しかしうまくいく)

しかし、

if [ "$OldIP" != "$StartIP" ]; then echo OK; fi

動作しますが、これを無視します。古いIP

答え1

厳密に言うと、変数に値が割り当てられていないか、すでに値が割り当てられている場合、変数は存在しませんunset。値が空の文字列である変数存在する

標準パラメータ拡張は、文字列がある場合はその文字列を置き換えます${variable+value}(設定されていないか空ではありません)。これは、次のように存在するかどうかをテストするために使用できます。valuevariable

if [ "${OldIP+x}" = "x" ] && [ "$OldIP" != "$StartIP" ]; then
    # code
fi

OldIP存在するかテストするにはtestをbash使用してください-v

 if [[ -v OldIP ]] && [[ "$OldIP" != "$StartIP" ]]; then
     # code
 fi

$OldIP文字列比較は、以前に設定されている場合にのみ(空の文字列に設定されていても)間で行われます。テストでは以下を使用します。$StartIPOldIP-v名前変わりやすい。

答え2

私はあなたのスクリプトが非常に効果的だと思います。あなたは間違いなくこれに多くのサイクルを消費しません。

ロジックを書くもう一つの方法:

{ test -n "$OldIP" || test "$StartIP" != "$OldIP"; } && echo OK

これは、「OldIPが設定されている場合、またはOldIPとStartIPが異なる場合は、echo OKを意味します。

覚えておいてください。これは[読むために使用できる別の名前です。test(1)man 1 test

編集:Gillesが指摘したように、( ... )不要な場所にサブシェルを作成しないように注意してください。

{ ... ; }新しいシェルを実行せずにコマンドをグループ化するために使用できます。

簡単な参照:http://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html

答え3

これはあなたの要件と一致します。

[ "${OldIP:-"$StartIP"}" != "$StartIP" ] && echo "OK"

同じもの(より複雑さ):

${OldIP:+false} || { [[ $OldIP != $StartIP ]] && echo "OK"; }

答え4

以下を使用する場合は、デフォルトの代替を使用できますbash

[[ "${OldIP:=oldunset}" != "${StartIP?StartUnset" ]] && echo "OK"

変数が設定されていないかnullの場合、構文は${var:-def}現在の値$varまたは指定されたデフォルト値(この場合)として評価されます。def変数の値(存在する場合)は変更されません。

構文はエラーコード1で終了し、設定されていないかnullの場合に${var?message}メッセージが表示されます。message$var

明示的に互換性テストが必要な場合は、test次のことができます。

[ ! -z "$OldIP" -a "$OldIP" != "$StartIP" ] && echo "OK"

関連情報