如何使用mapfile/readarray

如何使用mapfile/readarray

我有一些与此类似的代码:

while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do 
        echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done< <(ll | tail -n+2 | head -2)

(我实际上并没有使用ls/ll但我相信这个经过编辑的示例显示了我遇到的相同问题)

问题是如果ll | tail -n+2 | head -2失败我需要一个条件语句,所以我尝试创建一个映射文件,然后read在脚本中通过它。地图文件已正确创建,但我不知道如何重定向它以便正确读取。

代码

if ! mapfile -t TEST_ARR < <(ll | tail -n+2 | head -2); then
        exit 1
fi
while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do 
        echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done<<<"${TEST_ARR[@]}"

地图文件内容

declare -a TEST_ARR=(
        [0]="drwxr-xr-x@ 38 wheel   1.2K Dec  7 07:10 ./" 
        [1]="drwxr-xr-x  33 wheel   1.0K Jan 18 07:05 ../"
)

输出

$ while read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH; do
>             echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
>     done<<<"${TEST_ARR[@]}"
drwxr-xr-x@
38
wheel
1.2K
Dec
7

在这种情况下,字符串重定向显然是错误的,但我不确定如何重定向我的数组。

答案1

在我看来,您想要循环遍历数组,将元素读入列中:

for ele in "${TEST_ARR[@]}"
do
  read -r col1 col2 col3 col4 col5 col6 col7 col8 TRASH <<< "$ele"
  echo -e "${col1}\n${col2}\n${col3}\n${col4}\n${col5}\n${col6}\n"
done

答案2

mapfile将文件的内容读取到数组中,如果您"${array[@]}"在诸如赋值之类的上下文中使用或<<<仅使用单个字符串,则会将所有数组元素连接到单个字符串。有点像"${array[*]}", 除了@与空格连接,并*与 的第一个字符连接IFS

现在,您说您“创建了一个映射文件”,但我不认为这就是命令名称应该被解释的方式。它更像是将文件“映射”到数组。 (只不过它是一个副本,而不是像某些语言中那样的双向映射。) 的替代名称readarray可能更准确。

相关内容