&& 表示逻辑与,前一命令成功(退出码为0)才执行后一命令;可用于命令链控制(如 cp && chmod)或 [[ ]] 内部条件组合(如 [[ -e $p && -x $p ]]),但 [ ] 中需用两个独立测试并以 && 连接。

Linux 中用 && 表示逻辑与,意思是“前面条件成立,且后面条件也成立”,两个都为真,整体才为真。它既可用于 if 语句内的测试表达式中,也可直接连接命令,控制执行流程。
在 if 语句里组合测试条件
推荐使用 [ ] 或更安全的 [[ ]],配合 && 连接多个判断:
-
[ -f "$file" ] && [ -r "$file" ]:文件存在 并且 可读 -
[[ -e "$path" && -x "$path" ]]:路径存在 并且 可执行([[ ]]支持内部逻辑运算,更简洁) - 注意:
[ ]写法中,&&必须写在两个独立的[ ]之间;而[[ ]]允许把多个测试写在同一对方括号内,用&&连接
用 && 连接命令实现条件执行
这种用法不依赖 if,靠命令返回值自动控制:
-
cp file1 /tmp/ && chmod 600 /tmp/file1:只有复制成功,才修改权限 -
grep "error" /var/log/syslog && echo "发现错误日志":查到关键词才输出提示 - 原理:前一个命令退出状态为 0(成功),才会执行后一个;任一失败,后续就跳过
常见错误和避坑点
实际写脚本时容易踩的几个坑:
- 别漏空格:
[ -f"$file" ]或[ -f"$file"&&-r"$file" ]都会报语法错误,[是命令,前后及操作符两侧必须有空格 - 变量务必加双引号:
[ -n "$USER" ] && [ -d "/home/$USER" ],防止变量为空或含空格导致解析异常 - 不要混用旧式
-a:[ -f "$f" -a -r "$f" ]虽能工作,但已被 POSIX 弃用,建议统一用&&
对比 || 和 && 的行为差异
理解 && 更清楚,可以顺便记一下 || 的逻辑:
-
A && B:A 成功 → 执行 B;A 失败 → 跳过 B -
A || B:A 成功 → 跳过 B;A 失败 → 执行 B - 组合起来如
A && B || C,不是“三元运算”,而是“若 A 成则 B,否则 C”,但 B 成功时 C 不会执行,B 失败时 C 反而会执行——这点容易误判,复杂逻辑建议还是用标准 if 结构


















