Linux-Linux:关于IFS,思路遇到瓶颈了,求大神指点

发布于 2016-11-17 07:17:38 字数 86 浏览 1433 评论 1

IFS=:
set x y z  

echo $*  
x y z 

echo "$*"  
x:y:z

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

归属感 2017-03-09 22:45:26

类似的其实还有数组:

arr[0]=Hello
arr[1]=World

IFS=,

echo "${arr[*]}"
Hello,World

echo ${arr[*]}
Hello World

${数组[*]} 和 $* 都代表着多个变量,展开的时候就要考虑分隔元素的问题,这时IFS的第一个字符就被用上了,假设c是IFS的第一个字符

"$*" 相当于 "$1c$2c$3..."
"${数组[*]}" 相当于 "${数组[1]}c${数组[2]}c"

这是展开阶段双引号、*、IFS的特殊作用。$@,和${数组[@]}不会有这种行为。

说双引号括起不进行IFS替换,那是指在完成展开阶段之后的分词阶段。

arr[0]=A,B
arr[1]=C,D

IFS=,

echo ${arr[*]}
A B C D
# 过程: ${arr[*]} --> ${arr[0]} ${arr[1]} --展开--> A,B C,D --分词--> A B C D
# echo有A、B、C、D四个参数

echo "${arr[*]}"
A,B,C,D
# 过程: "${arr[*]}" --> "${arr[0]},${arr[1]}"
# --展开-> "A,B,C,D" --分词--> A,B,C,D
# echo只有一个参赛A,B,C,D

# 同理
echo "${arr[@]}"
A,B C,D
# 过程: "${arr[@]}" --> "${arr[0]} ${arr[1]}" --> "A,B C,D" --> A,B C,D

echo ${arr[@]}
A B C D
# 过程: ${arr[@]} --> ${arr[0]} ${arr[1]} --> A,B C,D --> A B C D

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文