我有一小段检查 IP 地址有效性的代码:
function valid_ip()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]; then
stat=1
else
stat=0
fi
fi
return $stat
}
但是我在 bash 条件语句中使用它时遇到了问题。我尝试了很多技术来测试它的返回值,但大多数都失败了。
if [[ !$(valid_ip $IP) ]]; then
if [[ $(valid_ip IP) -eq 1 ]]; then
等等等 谁能建议我在这里做什么?
编辑
根据您的建议,我使用了类似的东西:
if valid_ip "$IP" ; then
... do stuff
else
perr "IP: \"$IP\" is not a valid IP address"
fi
我得到类似
的错误IP: "10.9.205.228" is not a valid IP address
最佳答案
返回码在命令退出后的特殊参数$?
中可用。通常,只有在运行另一个命令之前想要保存它的值时才需要使用它:
valid_ip "$IP1"
status1=$?
valid_ip "$IP2"
if [ $status1 -eq 0 ] || [ $? -eq 0 ]; then
或者如果你需要区分各种非零状态:
valid_ip "$IP"
case $? in
1) echo valid_IP failed because of foo ;;
2) echo valid_IP failed because of bar ;;
0) echo Success ;;
esac
否则,您让各种运算符隐式检查它:
if valid_ip "$IP"; then
echo "OK"
fi
valid_IP "$IP" && echo "OK"
下面是一种简单、惯用的写法 valid_ip
:
valid_ip () {
local ip=$1
[[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && {
IFS='.' read a b c d <<< "$ip"
(( a < 255 && b < 255 && c < 255 && d << 255 ))
}
}
有两个表达式,[[...]]
和 { ... }
;两者由 &&
连接。如果第一个失败,则 valid_ip
失败。如果成功,则计算第二个表达式(复合语句)。 read
将字符串拆分为四个变量,并在算术表达式中分别测试每个变量。如果全部为真,则 ((...))
成功,这意味着 &&
列表成功,这意味着 valid_ip
成功。无需存储或返回显式返回码。
关于bash - 如何在有条件的情况下使用 bash 返回码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573312/