Bash
無法解析 awk 的空格分隔輸出
如果我理解正確,輸出的預設分隔符
awk
是空格。但是,以下腳本的行為與我預期的不同。我沒有設法將輸出解析
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
為什麼我不能像我預期的那樣解析
awk
with的輸出?read
這是關於欄位分隔符的。
您需要定義記錄分隔符以將每個字元串放在一個中。使用
ORS
參數:ls -l /dev | grep tty | awk 'BEGIN { ORS=" " }; {print $3}'
沒有它,您的輸出將:
root root root etc...
當你定義
ALL_TTY_OWNERS_STR
變數時,你只把輸出的第一個字元串放在數組的第一個元素中。因此,您的數組將僅包含一個元素,而這正是您所得到的
輸出的預設欄位分隔符是空格。但是記錄分隔符是一個新行。包含由換行符分隔
ALL_TTY_OWNERS_STR
的一堆s:root
$ printf "%q\n" "$ALL_TTY_OWNERS_STR" $'root\nroot\nroot\n....
並且
read
預設讀取到第一個換行符。如果您只想要所有使用者
ALL_TTY_OWNERS_ARRAY
,則執行以下操作可能更簡單:ALL_TTY_OWNERS_ARRAY=( $(stat -c '%U' /dev/*tty*) )