You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本for循环中字符串匹配失败问题求助

Bash脚本JSON提取与子串匹配问题解决

问题根源分析

你的脚本存在三个关键问题:

  1. 脚本解释器不兼容:开头用#!/bin/sh,但[[ ... ]]是Bash专属语法,部分系统的sh(比如Dash)不支持该语法。
  2. 系统环境变量被覆盖:循环变量用了PATH,这是系统用来查找命令的核心环境变量,覆盖后会导致grep等命令找不到。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:10:12