if
スクリプトにステートメントがあります。
次のようになります。
if [ "$a" != "0" -a "$b" != "100" ]; then
#some commands here
私が正しく覚えている場合、両方の条件が真であれば、上記の行が機能します。
今どのようにテストしますか?誰でもどちらも真になる前に1つまたは両方の条件を実行しますかsome commands
?
ベストアンサー1
標準(POSIX shおよびユーティリティ)でこれを指定する明確な方法は次のとおりです。
ひも比較する:
if [ "$a" != 0 ] || [ "$b" != 100 ]; then...
10進数比較してください(0100は100ですが、先行スペースが無視されるかどうかは実装によって異なります)。
if [ "$a" -ne 0 ] || [ "$b" -ne 100 ]; then...
整数比較してください(0x64、0144は100です(一部のシェルは8進数に対してPOSIXモードを有効にする必要があります)。
RANDOM
したがって、シェル100.0、1e2、50 + 50...によると(0.003%の場合)...):if [ "$((a != 0 || b != 100))" -ne 0 ]; then...
ただし、変数の内容が構文エラーのため算術拡張に失敗するとシェルがクラッシュするため、この問題を解決するにはサブシェルで実行する必要があります。
if ([ "$((a != 0 || b != 100))" -ne 0 ]); then
変数の内容を制御できない場合は、この形式を使用しないでください。一つ任意コマンド実行の脆弱性数多くの樹皮の中から(
bash
、、、ksh
)zsh
(例えば、$a
のような値x[$(reboot)]
)。
どちらを選択するかは、変数の内容と目的の内容によって異なります。標準形式の10進整数が含まれていることがわかっている場合、3つすべて同じです。
それにもかかわらず-a
/-o
test
演算子を使用しないでください。一般的に廃止され、信頼できない(変数の内容を制御できる場合はここではありません。)