Bash中如何正确组合OR与AND运算符实现目录操作逻辑?
你的Bash命令逻辑分析与修正方案
你的写法不正确,核心问题是
mkdir确实会无论ls是否成功都执行,原因如下:
Bash中&&和||的优先级相同,执行顺序为左结合,你的命令等价于:(ls "$MY_DIR" || echo "Creating $MY_DIR") && mkdir -p "$MY_DIR"当
$MY_DIR存在时,ls返回0,||后的echo不执行,整个括号内的表达式返回0,触发&&后的mkdir执行——这违背了你“目录存在时只输出内容”的需求;当目录不存在时,ls失败,执行echo(返回0),括号内表达式返回0,mkdir执行,这部分符合预期,但整体逻辑存在漏洞。正确的写法有两种:
- 用if语句(更规范易读):
这是Shell脚本中推荐的写法,逻辑清晰,不易出错:
if [ -d "$MY_DIR" ]; then ls "$MY_DIR" else echo "Creating $MY_DIR" mkdir -p "$MY_DIR" fi这里用
-d直接判断目录是否存在,比ls更可靠——如果目录存在但你没有读权限,ls会返回失败,但目录实际存在,用-d能避免这种误判。- 调整逻辑运算符的结合方式:
若坚持用||和&&组合,需把echo和mkdir用括号包裹,让它们作为||的右侧整体:
ls "$MY_DIR" || (echo "Creating $MY_DIR" && mkdir -p "$MY_DIR")这样当
ls成功时,||右侧的括号内容完全不执行;当ls失败时,才会依次执行echo和mkdir。- 用if语句(更规范易读):
内容的提问来源于stack exchange,提问作者Anil
相关产品推荐
相关产品推荐

