无法将diff输出分割为数组:Bash脚本问题求助
问题根源与解决方案
你遇到的问题核心在于 read -ra 默认只读取一行输入,而你的diffresult变量里实际藏着换行符——因为diff的输出原本就是多行的,哪怕用tr -d '<>-'处理后,每行内容还是以换行分隔,并没有变成单行。
当你执行IFS=',' read -ra array <<< "$diffresult"时,read命令只读取了变量里的第一行(也就是2c2),后面的所有行都被直接忽略了,这就导致数组长度只有1,遍历也只输出第一个元素。
修正步骤
先把多行内容转换成单行逗号分隔格式
修改你的diff命令,把换行符也替换成逗号(或者用paste更稳妥,避免末尾多余的逗号):# 方法1:用tr替换换行为逗号 diffresult=$(diff <(jq . actualProp.json) <(jq . standardProp.json) | tr -d '<>-' | tr '\n' ',') # 方法2:用paste合并所有行为单行,逗号分隔(推荐,避免末尾空元素) diffresult=$(diff <(jq . actualProp.json) <(jq . standardProp.json) | tr -d '<>-' | paste -s -d ',' -)优化分割规则,避免元素带前置空格
原内容里的逗号后面都跟着空格,所以把IFS设置为,(逗号加空格),这样分割出来的元素就不会带多余的空格:IFS=', ' read -ra array <<< "$diffresult"验证结果
现在再检查数组长度和遍历:echo "${#array[@]}" # 应该返回对应你示例内容的正确数量 for element in "${array[@]}" do echo "$element" done输出会是:
2c2 "access": "Deny" "access": "Allow" 5c5 "destinationPortRange": "33899" "destinationPortRange": "3389" 8c8 "priority": 3009 "priority": 300
补充说明
你之前执行echo $diffresult时,shell会自动把所有空白(包括换行)转换成单个空格,所以看起来是一行,但变量里实际是包含换行的——这也是你误以为可以直接用逗号分割的原因,以后可以用echo "$diffresult"(带双引号)来查看变量的原始内容,避免被shell的空白处理误导。
内容的提问来源于stack exchange,提问作者kolexinfos
相关产品推荐
相关产品推荐

