在这里https://dev59.com/JGIj5IYBdhLWcg3wwHtr#19915925我了解到可以通过设置IFS将字符串拆分为数组。
在这里https://dev59.com/Q3I_5IYBdhLWcg3wF_F3#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[*]}"
这个命令改变了echo环境,但没有改变引用扩展环境,所以它不起作用了吗?- 如果1是正确的,为什么
IFS=. b=($v)
能够成功创建一个数组? - 为什么
echo "${c[*]}"
会通过"."连接? IFS应该是默认的空格。
IFS=.
,然后是一个 echo 命令,这样它就能正常工作了。 - gregorya=b cmd
仅在 cmd 运行期间设置并导出 a,但a=b c=d
永久设置 a 和 c。注意,即使已设置 IFS,echo $IFS
始终为空,因为 $IFS 的扩展使用相同的字符“分割”,不会留下任何字符供 echo 使用;使用echo "$IFS"
或更好地使用printf '%s\n' "$IFS"
,或者可能使用declare -p IFS
。 - dave_thompson_085