私のスクリプトの構文に問題があります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}
(設定されていないか空ではありません)。これは、次のように存在するかどうかをテストするために使用できます。value
variable
if [ "${OldIP+x}" = "x" ] && [ "$OldIP" != "$StartIP" ]; then
# code
fi
OldIP
存在するかテストするにはtestをbash
使用してください-v
。
if [[ -v OldIP ]] && [[ "$OldIP" != "$StartIP" ]]; then
# code
fi
$OldIP
文字列比較は、以前に設定されている場合にのみ(空の文字列に設定されていても)間で行われます。テストでは以下を使用します。$StartIP
OldIP
-v
名前変わりやすい。