shell中将egrep匹配结果赋值给变量后换行变空格如何解决?
问题原因
- 用
$()捕获命令输出时,命令输出的中间换行符实际是保留在变量中的,你观察到换行变成空格,本质是输出变量时没有添加双引号触发了Bash的字段拆分逻辑:
Bash默认的内部字段分隔符(IFS)包含空格、制表符、换行符,直接执行echo $pathsText时,变量内容会被按IFS拆分为独立字段,再用空格拼接输出,最终所有换行就被替换为了空格。
解决方法
仅需输出时保留换行
赋值逻辑无需修改,输出变量时用双引号包裹即可:
pathsText=$(system_profiler SPApplicationsDataType | egrep '^\s+Location:\s+.*$') # 加双引号保留原始换行格式 echo "$pathsText"
需要逐行处理匹配结果(兼容路径含空格的场景)
建议将匹配结果按行存入数组,后续操作不会因为路径含空格出现拆分错误:
# mapfile将每行结果读入数组,-t参数自动移除每行末尾的换行符 mapfile -t pathsArray < <(system_profiler SPApplicationsDataType | egrep '^\s+Location:\s+.*$') # 逐行处理示例 for line in "${pathsArray[@]}"; do echo "$line" done
旧版本macOS的默认bash不支持
mapfile,可以用以下写法生成数组:pathsArray=() while IFS= read -r line; do pathsArray+=("$line") done < <(system_profiler SPApplicationsDataType | egrep '^\s+Location:\s+.*$')
内容的提问来源于stack exchange,提问作者T. Reed
相关产品推荐
相关产品推荐

