问:这个逻辑似乎和 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 grep 和 if [ ] 的行为并排打印出来?这样一跑就一目了然。