これで十分ではないでしょうか?
#!/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 しか出力されないと仮定します。