如果我理解正确,输出的默认分隔符awk
是space。
但是,以下脚本的行为不符合我的预期。我无法将 的输出解析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)
为什么我不能像我预期的那样解析awk
with的输出read
?
这是关于字段分隔符。
您需要定义记录分隔符以将每个字符串放在一个单独的字符串中。使用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
变量时,您只将第一个输出字符串放在数组的第一个元素中。因此,您的数组将只包含一个元素,这正是您所得到的