IFS (Internal Field Separator)输入字段分隔符,Bash 会根据 IFS 中定义的字符来进行字符串拆分。默认情况下,IFS包含空格,制表符tab和回车,这也是Bash 读取数据都是在空格处拆分的原因。
IFS变量通常用于读取命令、参数扩展和命令替换。
cat -A <<< "$IFS"
^I$
$
# " "是空格,^I$是Tab,下一行$是换行符
echo "$IFS" | od -b
0000000 040 011 012 012
0000004
# 查看$IFS,直接查看不会显示,转换成二进制显示
# 040是空格,011是Tab,012是换行符"\n",最后的012是echo的默认换行
示例:
建一个文件,内容包含|分割的字段,定义IFS为“|”,然后read读取看看怎么拆分的。
vim file.txt
cyberciti.biz|202.54.1.1|/home/httpd|ftpcbzuser
nixcraft.com|202.54.1.2|/home/httpd|ftpnixuser
vim ifstest.sh
#!/bin/bash
file=/home/hadoop/file.txt
IFS='|'
while read -r domain ip webroot username;
do
printf "%s \n" $domain
printf "%s \n" $ip
printf "%s \n" $webroot
printf "%s \n\n" $username
done < "$file"
执行
chmod +x ifstest.sh
./ifstest.sh
结果
cyberciti.biz
202.54.1.1
/home/httpd
ftpcbzuser
nixcraft.com
202.54.1.2
/home/httpd
ftpnixuser