bash - 如何在有条件的情况下使用 bash 返回码?

标签 bash shell conditional-statements 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
}

但是我在 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/

相关文章:

javascript - 多条件语句 JavaScript

Javascript 条件字段 (Zendesk Lotus)

perl - grep 与不包含关键字的后上下文

java - 在 Eclipse 中的 Java 代码运行时执行 shell 脚本

python - 如何找到Python脚本被杀死的原因?

linux - 'output to stdout'是什么意思

bash - Shell:连接到网站并访问字段

javascript - JS (jQuery) - 如果条件 - 任何数字

regex - SED命令删除空行直到第一次出现句子

bash - 基于 CSV 文件的多列执行高度自定义的排序?