これで十分ではないでしょうか?
#!/bin/bash
ipaddressused=$1
if grep -q -P "$ipaddressused" < <(dig +short sub.domain.com); then
echo "found"
exit 0
else
echo "not found"
exit 1
fi
スクリプトのどこが間違っていましたか?
この線
ipaddresscurrent='dig +short sub.domain.com'
dig +short sub.domain.com
文字列を変数に割り当てますipaddresscurrent
。おそらく、代わりに、コマンドipaddresscurrent
の出力を変数に割り当てたいと思ったでしょう。これは、古い非推奨のバッククォートを使用して行われます。 dig +short sub.domain.com
ipaddresscurrent=`dig +short sub.domain.com`
(ただし、バッククォートは絶対に使用しないでください!) または、次のように、よりモダンで堅牢でネスト可能な$(...)
もの:
ipaddresscurrent=$(dig +short sub.domain.com)
grep -Pzo
あなたが期待していることを本当にしません。代わりに、grep
静かに実行して(したがって-q
フラグ)、その出力を確認する必要があるため、次のようにします。
echo "$ipaddresscurrent" | grep -q -P "$ipaddressused" && echo "found" && exit 0 || echo "not found" && exit 1
変数は実際には必要ないので、bashのプロセス置換を feedipaddresscurrent
に使用することを好みました。grep
また、'' の長いチェーンを使用しないでください&& || &&
。読みにくく、微妙な副作用が生じる可能性があります。
変数に固執したい場合は、ヒアストリングが必要です。
#!/bin/bash
ipaddressused=$1
ipaddresscurrent=$(dig +short sub.domain.com)
if grep -q -P "$ipaddressused" <<< "$ipaddresscurrent"; then
echo "found"
exit 0
else
echo "not found"
exit 1
fi
あなたのコメントで指摘したように:
提供された $ipaddressused が 111.222.333.4 で、リストに 111.222.333.456 が存在する場合も一致することに注意してください。これは問題を引き起こす可能性があります。
これが要求された機能であるかどうかは、実際にはわかりませんでした (スクリプトの引数が正規表現であるため、-P
フラグを外したのはそのためです)。IP を完全に一致させたい場合は、次のように進めます。
#!/bin/bash
if grep -q "^${1//./\.}$" < <(dig +short sub.domain.com); then
echo "found"
exit 0
else
echo "not found"
exit 1
fi
dig
このように使用すると、1 行に 1 つの ip しか出力されないと仮定します。