求助:如何将两段Bash脚本合并为单个for循环简化实现?
当然可以!合并循环让代码更高效
完全没问题,把两段逻辑整合到同一个for循环里不仅减少了一次目录遍历(更高效),代码也会更紧凑。而且我们还可以顺便优化一些Bash脚本的最佳实践,避免潜在的坑。
先看调整后的完整代码:
#!/bin/bash for file in *; do # 处理空文件:如果文件为空则删除并提示 if [[ ! -s "$file" ]]; then echo "$file is empty and will be removed" rm -- "$file" fi # 检查是否为可执行的普通文件(仅对未被删除的文件生效) if [[ -x "$file" && -f "$file" ]]; then echo "$file is an executable" fi done
几个关键优化点:
- 合并循环:每个文件只遍历一次,避免了原脚本两次扫描目录的开销
- 用
[[ ]]替代[ ]:Bash中的[[ ]]是更现代的条件判断语法,支持更直观的逻辑运算符(比如&&代替老式的-a),还能自动处理带空格的文件名 - 给变量加双引号:
"$file"能避免文件名包含空格、特殊字符时出现语法错误 rm -- "$file":防止文件名以-开头时被当成rm的命令选项处理
如果想要更简洁的“一行式”写法,可以利用Bash的短路求值特性:
#!/bin/bash for file in *; do # 空文件处理:条件成立时执行命令组 [[ ! -s "$file" ]] && { echo "$file is empty and will be removed"; rm -- "$file"; } # 可执行文件检查 [[ -x "$file" && -f "$file" ]] && echo "$file is an executable" done
这种写法和上面的逻辑完全一致,只是把if-else换成了&&短路判断,代码更紧凑。
需要注意的是:空文件被删除后,后面的可执行检查自然不会再处理它,这和原脚本的行为完全一致(原脚本第二个循环也不会遍历已被删除的空文件)。
内容的提问来源于stack exchange,提问作者Sam San
相关产品推荐
相关产品推荐

