我有一小段代码检查IP地址的有效性:
function valid_ip() { local ip=$1 local stat=1 if [[ $ip =~ ^[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
返回代码在特殊参数$?命令退出后.通常,您只需要在运行另一个命令之前保存其值即可使用它:
原文链接:https://www.f2er.com/bash/385858.htmlvalid_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}$]] && { IFS='.' read a b c d <<< "$ip" (( a < 255 && b < 255 && c < 255 && d << 255 )) } }
有两个表达式,[[…]]和{…};两人加入了&&如果第一个失败,那么valid_ip将失败.如果它很容易,那么第二个表达式(复合语句)被评估.读取将字符串分成四个变量,每个变量在算术表达式中单独测试.如果都是真的,那么((…))成功,这意味着&&列表成功,这意味着valid_ip成功.不需要存储或返回显式的返回码.