Bash数组输出带空格字符串时被截断的问题解决
解决Bash脚本中带空格字符串的提取与输出问题
你的问题核心是bash默认的空格分词机制搞砸了时间字符串的存储和读取,咱们一步步拆解解决:
问题根源
你用testing=($(grep ...))把命令输出存到数组时,bash会把9 Jun 11:32:24 GMT按空格拆成4个数组元素:
testing[0] = 9testing[1] = Juntesting[2] = 11:32:24testing[3] = GMT
这就解释了为什么${testing[$counter]}(counter=1)只会输出Jun,直接用$testing只会取第一个元素9——因为bash把完整的时间拆碎了。另外你的counter变量其实完全没用,每次循环它都是1,而且数组索引从0开始,逻辑上也不对。
修复方案
既然你只取匹配结果的第一行,完全不需要用数组,直接用变量存储整个字符串就行,同时要注意加引号避免分词:
优化后的完整脚本
for y in "${DeviceName[@]}" do echo "Device: $y" for z in "${LocationName[@]}" do # 直接把提取的时间字符串存为单个变量,避免拆分 testing=$(grep "$y\.$z\-.*\%$" hacker.txt | cut -d "-" -f2 | cut -d "%" -f1 | head -n 1) # 判断是否获取到有效时间(非空即存在匹配) if [[ -n "$testing" ]]; then echo "$z" echo "$testing" fi done done
关键改进点
- 数组遍历加引号:
"${DeviceName[@]}"和"${LocationName[@]}"确保数组元素里如果有空格(比如设备名带空格)也能正确遍历,不会被拆分。 - 用单个变量存储结果:放弃数组,直接用
testing=$(...)把完整的时间字符串存起来,bash不会拆分它。 - 简化判断逻辑:用
[[ -n "$testing" ]]判断是否获取到有效时间(非空就说明有匹配的日志),替代原来的正则判断,逻辑更清晰。
这样修改后,就能正确输出9 Jun 11:32:24 GMT这种带空格的完整时间了。
内容的提问来源于stack exchange,提问作者Term Grecos
相关产品推荐
相关产品推荐

