Bash定义目录列表并遍历脚本异常:仅输出[DEBUG]1无[DEBUG]2
问题原因及解决方案
你的脚本有两个关键错误导致循环内的判断不生效:
1. 数组定义语法错误
Bash中声明数组时,元素之间必须用空格分隔,不能使用逗号。你的写法里,每个元素末尾的逗号会被当成元素内容的一部分(比如第一个元素实际是"/Volumes/drive1,",带逗号后缀),这显然不是有效目录路径,所以[ -d "${d}" ]判断始终不成立。
2. 波浪号~的展开问题
被双引号包裹的~不会被Shell解析为用户主目录,会被当作字面字符串处理。比如"~/temp"实际指向的是当前目录下名为~的子目录中的temp,而非你家目录下的temp目录。
修正后的脚本
#!/usr/bin/env bash # 用空格分隔数组元素,去掉逗号;用$HOME代替~确保路径正确展开 declare -a DIR=( "/Volumes/drive1" "/Volumes/drive2" "$HOME/temp" "$HOME/file1" ) [ -d "/Volumes/drive1" ] && echo "[DEBUG] 1" #set -x ## DEBUG for d in "${DIR[@]}"; do [ -d "${d}" ] && echo "[DEBUG] 2 ${d}" done
修正说明
- 移除数组元素间的逗号,改用空格(或换行)分隔元素,符合Bash数组语法规范
- 用
$HOME替代~,确保在双引号内也能正确展开为用户主目录路径 - 如果坚持使用
~,可以去掉双引号(如~/temp),但$HOME在引号内的写法更安全,能避免路径中包含特殊字符时出现解析问题
内容的提问来源于stack exchange,提问作者qazwsx
相关产品推荐
相关产品推荐

