Linux-Linux:关于IFS,思路遇到瓶颈了,求大神指点
IFS=:
set x y z
echo $*
x y z
echo "$*"
x:y:z
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
IFS=:
set x y z
echo $*
x y z
echo "$*"
x:y:z
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
类似的其实还有数组:
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