Shell脚本如何将命令执行结果按行存入数组?
问题原因
你遇到的拆分问题是由Bash默认的内部字段分隔符(IFS)规则导致的:默认IFS包含空格、制表符、换行符三种分隔符,直接用return_data_arr=($(MY_COMMAND))赋值时,会把所有符合IFS规则的字符都作为拆分依据,所以行内的空格也会把内容拆成独立的数组元素。
解决方案
方案1:Bash 4.0及以上版本(推荐)
直接使用内置的mapfile(也叫readarray)命令实现按行读取到数组,语法最简单:
# -t 参数用于自动去除每行末尾的换行符 mapfile -t return_data_arr < <(MY_COMMAND) for data in "${return_data_arr[@]}"; do echo -e "data: ${data}" done
方案2:兼容低版本Bash
如果运行环境的Bash版本低于4.0不支持mapfile,可以用read配合循环实现:
return_data_arr=() # IFS= 临时清空字段分隔符,避免read自动丢弃行首尾的空白;-r 禁止转义反斜杠 while IFS= read -r line; do return_data_arr+=("$line") done < <(MY_COMMAND) for data in "${return_data_arr[@]}"; do echo -e "data: ${data}" done
注意不要用
MY_COMMAND | while ...的管道写法,这种写法会让while循环在子Shell中执行,循环内给数组的赋值在循环外无法获取,使用上面的进程替换写法可以规避这个问题。
内容的提问来源于stack exchange,提问作者user14820698
相关产品推荐
相关产品推荐

