Pat*_*ryk 16 bash shell conditional return-value
我有一小段代码检查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
}
Run Code Online (Sandbox Code Playgroud)
但我在bash条件中的使用存在问题.我已经尝试了很多技术来测试它的返回值,但是大多数技术都失败了.
if [[ !$(valid_ip $IP) ]]; then
if [[ $(valid_ip IP) -eq 1 ]]; then
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议我该怎么办?
编辑
根据你的建议我使用了类似的东西:
if valid_ip "$IP" ; then
... do stuff
else
perr "IP: \"$IP\" is not a valid IP address"
fi
Run Code Online (Sandbox Code Playgroud)
我得到的错误就像
IP:"10.9.205.228"不是有效的IP地址
che*_*ner 15
$?
命令退出后,返回代码在特殊参数中可用.通常,只有在想要在运行另一个命令之前保存其值时才需要使用它:
valid_ip "$IP1"
status1=$?
valid_ip "$IP2"
if [ $status1 -eq 0 ] || [ $? -eq 0 ]; then
Run Code Online (Sandbox Code Playgroud)
或者如果您需要区分各种非零状态:
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
Run Code Online (Sandbox Code Playgroud)
否则,您让各个操作员隐式检查它:
if valid_ip "$IP"; then
echo "OK"
fi
valid_IP "$IP" && echo "OK"
Run Code Online (Sandbox Code Playgroud)
这是一种简单,惯用的写作方式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 ))
}
}
Run Code Online (Sandbox Code Playgroud)
有两种表达方式,即[[...]]
和{ ... }
; 这两个人加入了&&
.如果第一个失败,则valid_ip
失败.如果它成功,则评估第二个表达式(复合语句).该read
分裂串入四个变量,并且每个算术表达式中单独测试.如果一切都是真的,那么((...))
成功,这意味着&&
列表成功,这意味着valid_ip
成功.无需存储或返回显式返回码.
如果检查退出状态,则不需要括号:
if valid_ip $IP ; then
...
Run Code Online (Sandbox Code Playgroud)
只需按照调用任何其他命令的方式调用该函数.