field
A unit of text that is the result of one of the shell expansions. After expansion,
when executing a command, the resulting fields are used as the command name and
arguments.
这是什么意思?如果我这样做ls /etc/*
我会得到一堆字段(文件名),例如:motd,passwd - 在这种情况下,带有空格的文件呢?这是通配,你会得到一堆保留空格的单词。
自由节点上的 #bash 的人提到:
<geirha> The term field is mainly only used when talking about the read command
<geirha> read -r foo bar <<< "$line" splits line on IFS and assigns the first field (word) to foo, and the rest of the line to bar
<geirha> # line='Hello, World!'; read -r foo bar <<< "$line"; echo "$foo is $foo. $bar is $bar"
<shbot> geirha: $foo is Hello,. $bar is World!
<[arx]> # touch foo 'bar baz' $'quxnquux'; printf '<%s>' *; echo
<shbot> [arx]: <bar baz><foo><qux
<shbot> [arx]: quux>
<[arx]> veek: globbing generates WORDs, the whitespace is preserved.
但我不是很清楚... <<<word
就像一个HERE,所以单词是根据IFS扩展的,你得到的是字段??但是在另一个例子中,由[arx]。这是怎么回事?
你所说的"一堆保留空格的单词"基本上是一个字段的定义。将字段视为信息边界,由 IFS 变量(单词拆分)分隔。
使用 awk可能更容易可视化,因为 awk 具有明确的字段用法。
考虑一下:
echo foo + bar + haz | awk '{print $3}'
awk 也使用 IFS 进行拆分,这里我们要求打印字段 $3。如果我们将回声字符串分成单独的单元,我们会得到这些:
value field #
foo $1
+ $2
bar $3
+ $4
haz $5
因此,该行将打印"条形"。
现在,假设我们告诉awk使用"+"作为分隔符而不是IFS进行拆分:
echo foo + bar + haz | awk -F+ '{print $3}'
然后,这些字段将如下所示:
value field #
foo $1
bar $2
haz $3
因此,输出将为"haz"。
也许您可以将字段视为数据列,以便更好地掌握它。有关 bash 中的单词拆分字段的更深入阅读,我建议看看 http://mywiki.wooledge.org/WordSplitting