首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >神秘IFS行为

神秘IFS行为
EN

Stack Overflow用户
提问于 2019-07-29 05:52:02
回答 1查看 161关注 0票数 4

在这里,https://stackoverflow.com/a/19915925/4673197我了解到,我可以通过设置IFS将字符串拆分为数组。

在这里,https://stackoverflow.com/a/9429887我了解到我可以通过IFS分隔符加入一个数组。

但在我下面的测试中:

代码语言:javascript
复制
0:~ $ a=(1 2 3)
0:~ $ echo "${a[*]}"
1 2 3
0:~ $ IFS=. echo "${a[*]}" # IFS=. not work
1 2 3
0:~ $ (IFS=.; echo "${a[*]}") # this works
1.2.3
0:~ $ echo $IFS # the original IFS is not change

0:~ $ v=1.2.3
0:~ $ IFS=. b=($v) # change string to array
0:~ $ echo ${b[*]}
1 2 3
0:~ $ echo "${b[*]}" # the array join by `.`!
1.2.3
0:~ $ echo ${b}
1
0:~ $ (IFS=,; echo "${b[*]}") # this still work
1,2,3
0:~ $ IFS=, echo "${b[*]}" # this not work, b array still join by .
1.2.3
0:~ $ c=(1 2 3)
0:~ $ echo "${c[*]}" # a new array join by '.' !
1.2.3
0:~ $ IFS=, echo "${c[*]}" # IFS=, not work, still join by '.'
1.2.3
0:~ $ (IFS=,; echo "${c[*]}") # this works
1,2,3
0:~ $ echo $IFS # original IFS is space

0:~ $ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

根据以上所述,我有以下猜测/问题:

  1. IFS=. echo "${a[*]}"这会改变回显环境,但不会改变引用扩展环境,所以它不是工作吗?
  2. 如果1为真,为什么IFS=. b=($v)成功地创建了数组?
  3. 为什么echo "${c[*]}"会加入?IFS应该是默认空格。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-29 06:15:36

问题在于,当您执行IFS时,IFS=. b=($v)设置会在当前shell的上下文中执行两个shell赋值。将IFS修改为.将使所有后续的"${arr[*]}"类型数组扩展都能利用这个新值。注意这里的双引号,没有引号的相同的数组扩展将不使用IFS,即${arr[*]}

所以回答你的问题

IFS=. echo "${a[*]}"这会改变回显环境,但不会改变引用扩展环境,所以它不是工作吗?

您错了,尽管您正在将IFS传递给echo接收的环境。但是,echo不会对其环境列表做任何事情。之所以会出现这种情况,是因为您之前已经将IFS的值设置为.

如果1为真,为什么IFS=. b=($v)成功地创建了数组?

这个命令的运行就像您单独执行这两个命令一样。将IFS修改为.,并将未引号的字符串v的结果展开到数组中,该数组使用IFS值进行分字。因为您以前已经将它定义为.,所以字符串被分割成单独的组件并存储到数组中。

为什么echo "${c[*]}"会加入?IFS应该是默认空格。

第一个答案已经解释了这一点。您已经在当前的shell中进行了修改,使其使用IFS作为.,随后的数组扩展将用于连接字符串。如果启动一个新的shell并运行相同的扩展,它将无法工作。

为了进一步澄清何时将变量传递给命令的本地环境,就可以了。如果不是

代码语言:javascript
复制
var=val echo "$var"

如果你写了

代码语言:javascript
复制
var=val sh -c 'echo "$var"'

您可以看到写入的var值,因为在本例中,您要在环境中传递var的值,因此运行sh shell。但是与echo不同的是,sh从环境中读取并看到var的值,并将其用于变量扩展。

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

https://stackoverflow.com/questions/57247828

复制
相关文章

相似问题

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