如何在条件中使用bash返回码?

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成功.无需存储或返回显式返回码.

  • shell将0解释为成功,将非零解释为失败,与通常的布尔解释相反.如果IP地址有效,`valid_IP`应返回0,否则返回1. (3认同)

cho*_*oba 9

如果检查退出状态,则不需要括号:

if valid_ip $IP ; then
    ...
Run Code Online (Sandbox Code Playgroud)

只需按照调用任何其他命令的方式调用该函数.