无法解析 awk 的空格分隔输出

Gau*_*ier 4 bash array awk

如果我理解正确,输出的默认分隔符awkspace

但是,以下脚本的行为不符合我的预期。我无法将 的输出解析awk为数组:

#!/bin/bash
echo "------ with input string from awk ------"
ALL_TTY_OWNERS_STR=$(ls -l /dev | grep tty | awk '{print $3}')

read -r -a ALL_TTY_OWNERS_ARRAY <<< "$ALL_TTY_OWNERS_STR"

echo "${#ALL_TTY_OWNERS_ARRAY[@]}" # This says 1
echo "${ALL_TTY_OWNERS_ARRAY[0]}" # "root", as expected
echo "${ALL_TTY_OWNERS_ARRAY[1]}" # empty string, expected "root"
echo "${ALL_TTY_OWNERS_ARRAY[2]}" # empty string, expected "root"


echo "------ with my manually created input string ------"
ALL_TTY_OWNERS_STR="root root root" # only for testing

read -r -a ALL_TTY_OWNERS_ARRAY <<< "$ALL_TTY_OWNERS_STR"

echo "${#ALL_TTY_OWNERS_ARRAY[@]}" # 3, as expected
echo "${ALL_TTY_OWNERS_ARRAY[0]}" # "root", as expected
echo "${ALL_TTY_OWNERS_ARRAY[1]}" # "root", as expected
echo "${ALL_TTY_OWNERS_ARRAY[2]}" # "root", as expected
Run Code Online (Sandbox Code Playgroud)

为什么我不能像我预期的那样解析awkwith的输出read

Ego*_*yev 5

这是关于字段分隔符。

您需要定义记录分隔符以将每个字符串放在一个单独的字符串中。使用ORS参数:

ls -l /dev | grep tty | awk 'BEGIN { ORS=" " }; {print $3}'
Run Code Online (Sandbox Code Playgroud)

没有它,您的输出将:

root
root
root
etc...
Run Code Online (Sandbox Code Playgroud)

当您定义ALL_TTY_OWNERS_STR变量时,您只将第一个输出字符串放在数组的第一个元素中。因此,您的数组将只包含一个元素,这正是您所得到的