跳到主要内容

问:这个逻辑似乎和 if [ ] 的判断方式不一样

对,你发现的点很对!🤝 确实 if 的判断逻辑[]命令 这两种写法下是不一样的。


1. if <命令>; then ... fi 的逻辑

  • if 会判断 命令的退出状态码
    • 0 → 视为 (进入 then)
    • 非0 → 视为 (跳过 then)

例子:

if echo hello; then
echo "命令执行成功"
fi

输出:

hello
命令执行成功

因为 echo 的退出状态码是 0


2. if [ 条件 ]; then ... fi 的逻辑

  • [ 其实就是命令 /usr/bin/[(一个可执行程序),它的退出状态码由条件表达式决定:
    • 条件成立 → 退出状态码是 0(真)
    • 条件不成立 → 退出状态码是 1(假)

例子:

if [ 1 -eq 1 ]; then
echo "条件成立"
fi

输出:

条件成立

3. 差别在哪里?

  • if <命令>:直接看命令的 退出状态码
  • if [ 条件 ]:是一个专门的命令,它的退出状态码由 条件表达式 的真假决定。

换句话说:

  • if 后跟 任意命令,逻辑取决于命令的返回码。
  • if [ ... ] 只是 if <命令> 的一个特殊用法。

4. 回到你的代码

if ! echo "$interface_names" | grep -q "$interface_name"; then
echo "网卡名称不存在"
exit 1
fi

#echo "$interface_names" | grep -q "$interface_name" 匹配到时返回0,匹配不到返回1,所以匹配不到时 if 条件是 if 0 ,此时的if 0 对应的是if True,而非 if False,故会进入 then 部分的执行。
  • 这里 if 判断的对象是: ! ( echo "$interface_names" | grep -q "$interface_name" )
  • 本质上依然是 判断命令的退出状态码

要不要我帮你写一个对比的小 demo 脚本,把 if grepif [ ] 的行为并排打印出来?这样一跑就一目了然。