脚本中赋值find+grep筛选的目录结果为空,命令行执行正常
解决命令赋值后变量为空的问题
我来帮你排查下这个问题,你遇到的变量赋值后为空的情况,大概率是命令里的几个语法错误导致的,咱们一步步拆解修复:
首先看命令里的几个明显错误:
- 命令替换语法错误:你写的
$ (中间多了个空格!shell里命令替换的正确写法是$(...),空格会让shell把$和(当成两个独立的元素,直接导致赋值失败,变量自然为空。 - find参数错误:
-type -d是错的,-type选项后面直接跟文件类型标识,应该写成-type d(没有额外的横杠)。 - 变量引用与管道语法错误:
${EX_PATTERN|这里明显没写完,变量引用需要闭合的},而且管道符|的位置应该在第一个grep命令结束后,正确的管道链是find ... | grep -Eiv "${EX_PATTERN}" | grep -Eio "${FIND_PATTERN}"。 - 变量未加引号的隐患:如果
FIND_ROOT、EX_PATTERN这些变量包含空格或特殊字符,不加双引号会让shell解析出错,所以一定要给变量加上双引号。
修复后的完整命令:
GET_DIR=$(find "${FIND_ROOT}" -type d 2>/dev/null | grep -Eiv "${EX_PATTERN}" | grep -Eio "${FIND_PATTERN}")
额外排查技巧:
如果修复后变量还是为空,可以分步执行命令来定位问题:
- 先单独执行
find "${FIND_ROOT}" -type d 2>/dev/null,确认有没有输出目录列表; - 加上第一个grep:
find ... | grep -Eiv "${EX_PATTERN}",看排除后的结果是否符合预期; - 最后加上第二个grep,检查
FIND_PATTERN的正则是否能匹配到前面的结果(毕竟grep -o只输出匹配的部分,如果正则不对也会返回空)。
内容的提问来源于stack exchange,提问作者VintageKoala
相关产品推荐
相关产品推荐

