字段分隔符
内部字段分隔符(Internal Field Seprator,IFS),是当前shell环境使用的默认定界字符串。对于 IFS 的定义如下:
The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read builtin command. The default value is
<space><tab><new-line>
.
IFS 的作用如下:
- IFS作为Shell的内置变量,是一个用于分割字段的字符列表。
- Shell把变量IFS内的每一个字符都当做是一个分割符(delimeter),用这些字符作为每一个字段的结束符来进行分割。
- 如果IFS没有设置,或者IFS的值被设置为“ \t\n”(space, tab和 newline),那么操作对象的开始和结束处的所有space, tab和newline序列都将被忽略,但是操作对象中间的space, tab和newline序列会作为界定符工作。
- 如果IFS值不是默认值(例如程序中对IFS进行设置过),只有出现在IFS内的空白字符(可能是space, tab或newline中的一个或几个)才会在单词开始和结束处被忽略,这里说的是单词,而不是整个操作对象。
- IFS内的非空白字符多个连续出现时,每个非空白字符会被当做单独的分隔符看待,但是多个连续的空白字符会被当做一个分隔符看待。
- 如果IFS为空(“null”),则不会进行单词分割。
以上几点参考了网上的这篇文章《详细解析Shell中的IFS变量》
查看 IFS 的默认值
$ echo -n "$IFS" | hexdump
0000000 20 09 0a #0x20, 0x09和0x0a分别对应于空格(space), 水平制表符(tab)和换行符(newline)的值
0000003
演示 IFS 的用法
#!/bin/bash
line="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS
IFS=":"
count=0
for item in $line; do
[ $count -eq 0 ] && user=$item;
[ $count -eq 6 ] && shell=$item;
let count++
done
IFS=$oldIFS
echo $user\'s shell is $shell
输出:
root's shell is /bin/bash
迭代器
for 循环
for…in
for var in list; do #list可以是一个字符串,也可以是一个序列(如:{a..z})
#循环体
done
C 风格 for 循环
for((i=0;i<10;i++)) {
#循环体
}
while 循环
while condition; do #condition为真,则进入循环;否则退出
#循环体
done
until 循环
x=0;
until [ $x -eq 9 ]; do #x的值等于9时退出循环
let x++; echo $x;
done
网友评论