processLine() { line="$@" echo $line } FILE="" if [ "$1" == "" ]; then FILE="/dev/stdin" else FILE="$1" if [ ! -f $FILE ]; then echo "$FILE : does not exists" exit 1 elif [ ! -r $FILE ]; then echo "$FILE : can not read" exit 2 fi fi BAKIFS=$IFS IPS=$(echo -en "nb") exec 3<&0 exec 0<$FILE while read line do processLine $line done exec 0<&3 IFS=$BAKIFS exit 0
使用IFS来进行文件分析,或者是对文件特定的字符进行分割
#shell environment $IFS useage # S : Internal Field Separator IFS=: a=Hello:World echo $a #OutPut is Hello World #IFS save Key Value, maybe space\tab\'\n'\other token #sparse input or output key value # The following code segment will only work in ksh, # and it will fail in bash IP=192.168.0.254 IFS="." TMPIP=$(echo $IP) IFS=" " #space echo $TMPIP | read ip1 ip2 ip3 ip4 INVIP=$ip4.$ip3.$ip2.$ip1 echo $INVIP我们将IFS的内容输出来,但是由于一些内容是不能直接显示出来,但是我们可以将使用一些格式化将内容输出:
echo $IFS | od -d echo $IFS | od -b echo $IFS | od -x分别是使用不同进制的表示出来:
如果是用冒号("")引起来,表示这个变量不用IFS替换!!所以可以看到这个变量的"原始值"。反之,如果不加引号,输出时会根据IFS的值来分割后合并输出! $* 是按照IFS中的第一个值来确定的!下面这两个例子还有细微的差别!
原文地址:http://blog.csdn.net/berguiliu/article/details/43059841