我有一些与此类似的代码:
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
可能更准确。