gpt4 book ai didi

arrays - 神秘 IFS 行为

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

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

在这里https://stackoverflow.com/a/9429887我了解到我可以通过 IFS 定界符加入数组。

但在我下面的测试中:

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[*]}" 这改变了 echo 环境,但没有改变引用扩展环境,所以它不起作用?
  2. 如果 1 为真,为什么 IFS=。 b=($v) 成功创建数组?
  3. 为什么 echo "${c[*]}" 由 . 加入? IFS 应该是默认的空格。

最佳答案

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

所以回答你的问题

IFS=. echo "${a[*]}" this change the echo environment, but not change the quoting expanding environment, so it's not work?

你错了,尽管你将 IFS 传递给 echo 接收的环境。但是,echo 不会对其环境列表执行任何操作。出现这种结果是因为您之前将 IFS 的值设置为

if 1 is true, why IFS=. b=($v) successful create the array?

此命令的运行就像您分别执行这两个命令一样。将IFS修改为.,将未加引号的字符串v的结果展开到数组中,用IFS的值进行分词。由于您之前已将其定义为 .,因此该字符串被拆分为单独的组件并存储到数组中。

why echo "${c[*]}" joined by .? the IFS should be default whitespace.

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


只是为了澄清一点,即何时将变量传递到命令的本地环境将起作用。如果不是

var=val echo "$var"

如果你写过

var=val sh -c 'echo "$var"'

您看到写入的 var 的值,因为在这种情况下,您在环境中传递 var 的值,即 sh外壳运行。但与 echo 不同的是,sh 从环境中读取并查看 var 的值并将其用于变量扩展。

关于arrays - 神秘 IFS 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57247828/

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