gpt4 book ai didi

bash - Bash 中的单词拆分,IFS 设置为非空白字符

转载 作者:行者123 更新时间:2023-11-29 08:57:08 25 4
gpt4 key购买 nike

我正在参加 Bash tutorial ,特别是分词的主题。

这个名为“args”的脚本有助于演示分词示例:

#!/usr/bin/env bash
printf "%d args:" $#
printf " <%s>" "$@"
echo

一个例子:

$ ./args hello world, here is "a string of text!"
5 args: <hello> <world,> <here> <is> <a string of text!>

到目前为止一切顺利。我了解这是如何工作的。

但是,当我用非空白字符替换 IFS 时,比如 :,如果我直接将字符串作为参数传递,脚本不会执行分词。

$ ./args one:two:three
1 args: <one:two:three>

但是,如果我 (1) 将字符串分配给变量,然后 (2) 通过参数扩展将字符串传递给脚本,则脚本确实对同一字符串执行分词。

$ IFS=:
$ variable="one:two:three"
$ ./args $variable
3 args: <one> <two> <three>

为什么?具体来说,为什么当 IFS 未设置且定界符为空白字符时,将字符串作为参数传递会进行分词,而当 IFS 设置为非空白字符时则不会?

当我使用 read 而不是这个脚本时,同一个字符串也会按预期进行分词。

$ IFS=:
$ read a b c
one:two:three
$ echo $a $b $c
one two three

最佳答案

您可以阅读有关分词的更多信息 here .

The shell scans the results of parameter expansion, command substitution, and arithmetic expansion that did not occur within double quotes for word splitting.

当您将裸字符串 one:two:three 作为 IFS 设置为 : 的参数传递时,Bash 不会进行分词,因为裸字符串是 < em>不是参数扩展、命令替换或算术扩展上下文之一。

但是,当将相同的字符串分配给一个变量并且该变量不加引号地传递给脚本时,确实会发生分词,因为这是参数扩展的情况。

同样的事情也适用于这些(命令替换):

$ ./args $(echo one:two:three)
3 args: <one> <two> <three>

$ ./args "$(echo one:two:three)"
1 args: <one:two:three>

作为documented , read 命令确实对读取的每一行进行分词,除非 IFS 已设置为空字符串。


关于bash - Bash 中的单词拆分,IFS 设置为非空白字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43163225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com