Bash/KSH:使用read命令时定义定界符(IFS)

时间:2020-01-09 10:45:54  来源:igfitidea点击:

在bash循环中使用read命令时,如何设置IFS(内部字段分隔符)?
IFS变量用作输入字段分隔符。如果将IFS设置为| (即IFS = |),|分割输入行时,将被视为单词/字段之间的分隔符。 在读取命令中,IFS用于拆分输入行,以便每个变量都获得输入的单个字段。
默认值为。
您可以使用以下命令打印它:

cat -etv

输出示例:

^I$
$

在此示例中,使用read命令读取名字和姓氏,并将IFS设置为空白:

IFS=' ' read -p 'Enter your first and last name : ' first last 
echo "Hello, $first $last"

输出示例:

Enter your first and last name : 
Hello, 

在此示例中,将IFS设置为|。并读取数据:

IFS='|' read domain ip4 ip6 <<< 'google.com|74.125.236.65|2404:6800:4007:801::1008'
echo "$domain has $ip4 IPv4 and $ipv6 IPv6 address."

输出示例:

google.com has 74.125.236.65 IPv4 and  IPv6 address.

IFS和read命令的while循环示例

创建一个文本文件(名为foo.txt),如下所示:

$ cat foo.txt

输出示例:

google.com|74.125.236.65|2404:6800:4007:801::1008
i.theitroad.com|58.27.86.81|2600:807:320:305::3f6e:f648
theitroad.local|75.126.153.206|2600:807:320:305::3f6e:f649

创建一个bash shell脚本,如下所示:

#!/bin/bash
_input="foo.txt"
# set IFS (internal field separator) to |
# read file using while loop
while IFS='|' read -r domain ip4 ip6 
do
   echo "$domain has $ip4 IPv4 and $ip6 IPv6 address."
done < "$_input"