Bash脚本for循环中字符串匹配失败问题求助
Bash脚本JSON提取与子串匹配问题解决
问题根源分析
你的脚本存在三个关键问题:
- 脚本解释器不兼容:开头用
#!/bin/sh,但[[ ... ]]是Bash专属语法,部分系统的sh(比如Dash)不支持该语法。 - 系统环境变量被覆盖:循环变量用了
PATH,这是系统用来查找命令的核心环境变量,覆盖后会导致grep等命令找不到。 - JSON提取的字符串带多余引号:
jq使用@sh会给输出字符串添加单引号,导致匹配时实际是在找带引号的子串(比如'package-1'而非package-1),自然匹配失败。
修正后的脚本
#!/bin/bash # 直接提取原始字符串,去掉@sh避免添加引号 BUILT_APPS=($(jq -r '.packages[]' affected.json)) PATHS=($(jq -r '.tasks[] | .directory' affected.json)) # 循环变量改用pkg_path,避免覆盖系统PATH变量 for pkg_path in "${PATHS[@]}"; do for built_app in "${BUILT_APPS[@]}"; do echo "path: $pkg_path" echo "built app: $built_app" # 方法1:使用grep(现在PATH正常,能找到grep) # if echo "$pkg_path" | grep -iq "$built_app"; then # 方法2:Bash的子串匹配(现在字符串无多余引号,能正常匹配) if [[ "$pkg_path" == *"$built_app"* ]]; then echo 'it is a match' echo -e '\n' fi done done
关键修改说明
- 脚本开头改为
#!/bin/bash,确保支持[[ ... ]]语法。 - 循环变量替换为
pkg_path和built_app,避免覆盖系统环境变量PATH。 jq命令移除@sh选项,直接用-r输出原始无引号字符串,保证子串匹配的准确性。- 变量引用时加上双引号
"${PATHS[@]}"和"${BUILT_APPS[@]}",避免文件名或路径含空格时出现拆分错误。
内容的提问来源于stack exchange,提问作者Patrick Kenyon
相关产品推荐
相关产品推荐

