bash读取外部命令/文本文件的多行输出到数组

bash处理外部命令的多行输出

使用场景
bash调用外部命令产生多行输出,有时候我们需要处理这些多行处理,比如按照数组的方式处理,也就是说把命令输出存储到数组变量里面,然后循环处理数组的每一个元素。

#!/bin/bash
  
A=$(cat data.txt)     # A is a general variable, lines are merged into a single line separated with whitespace
B=($(cat data.txt))   # B is an array variable

echo $A
echo $B
echo ${#A[@]}    # equal 1
echo ${#B[@]}    # equal line number in file data.txt

for (( i=0; i<${#B[@]}; i++ )); do    # iterate the array
  if [[ i -lt ${#B[@]}-1 ]]; then     # if not the last line, merge with next line
    B[$i]=${B[$i]}:${B[$i+1]}
  else                                # the last line, just double itself
    B[$i]=${B[$i]}:${B[$i]}
  fi
  echo $i "${B[$i]}"
done

这里例子中使用了

  1. 导出多行输出到一个数组变量
  2. 获取数组变量的长度
  3. 遍历数组
  4. 读取数组元素
  5. 更新数组元素

这个脚本是有一个问题的,即如果文本行包含数组,例如:

$ cat data.txt 
a
b1  b2

执行的输出是:

a b1 b2
a
1
3
0 a:b1
1 b1:b2
2 b2:b2

文本只有两行,但是脚本把他处理成了三行,空格也算行分隔符了。
解决办法是指定IFS

#!/bin/bash
...
IFS=$'\r\n' eval 'B=($(cat data.txt))'
...

再次运行:

a b1 b2
a
1
2
0 a:b1  b2
1 b1  b2:b1  b2

你可能感兴趣的:(bash读取外部命令/文本文件的多行输出到数组)