首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IFS设置为非空白字符的Bash中的分字

将IFS设置为非空白字符的Bash中的分字
EN

Stack Overflow用户
提问于 2017-04-01 23:54:10
回答 1查看 1.8K关注 0票数 8

我正在学习一个Bash 教程,特别是单词分裂的主题。

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

代码语言:javascript
复制
#!/usr/bin/env bash
printf "%d args:" $#
printf " <%s>" "$@"
echo

举个例子:

代码语言:javascript
复制
$ ./args hello world, here is "a string of text!"
5 args: <hello> <world,> <here> <is> <a string of text!>

到目前一切尚好。我明白这是怎么回事。

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

代码语言:javascript
复制
$ ./args one:two:three
1 args: <one:two:three>

但是,如果我(1)将字符串分配给一个变量,然后(2)通过参数展开将字符串传递给脚本,那么脚本就会在同一字符串上执行分词操作。

代码语言:javascript
复制
$ IFS=:
$ variable="one:two:three"
$ ./args $variable
3 args: <one> <two> <three>

为什么?具体来说,如果IFS未设置,分隔符是空格字符,而IFS设置为非空白字符,那么为什么将字符串作为参数进行分词呢?

当我使用read代替这个脚本时,相同的字符串也会像预期的那样经历分词。

代码语言:javascript
复制
$ IFS=:
$ read a b c
one:two:three
$ echo $a $b $c
one two three
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-02 00:20:38

您可以阅读更多关于分字这里的内容。

shell扫描参数展开、命令替换和算术扩展的结果,这些结果没有出现在双引号内,用于分词。

当将空字符串one:two:three作为参数传递给:时,Bash不会进行分词,因为裸字符串不是参数扩展、命令替换或算术扩展上下文。

但是,当同一个字符串被赋值给一个变量,并将该变量传递给未引用的脚本时,确实会发生分词,因为它是参数展开的情况。

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

代码语言:javascript
复制
$ ./args $(echo one:two:three)
3 args: <one> <two> <three>

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

记录在案一样,read命令在读取的每一行中都会进行分词操作,除非IFS被设置为空字符串。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43163225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档