在这里,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.根据以上所述,我有以下猜测/问题:
IFS=. echo "${a[*]}"这会改变回显环境,但不会改变引用扩展环境,所以它不是工作吗?IFS=. b=($v)成功地创建了数组?echo "${c[*]}"会加入?IFS应该是默认空格。发布于 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并运行相同的扩展,它将无法工作。
为了进一步澄清何时将变量传递给命令的本地环境,就可以了。如果不是
var=val echo "$var"如果你写了
var=val sh -c 'echo "$var"'您可以看到写入的var值,因为在本例中,您要在环境中传递var的值,因此运行sh shell。但是与echo不同的是,sh从环境中读取并看到var的值,并将其用于变量扩展。
https://stackoverflow.com/questions/57247828
复制相似问题