什么是 Bash 中的'field'?

  • 本文关键字:field 中的 Bash bash
  • 更新时间 :
  • 英文 :

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

相关内容

  • 没有找到相关文章

最新更新