新版本bash(可能从3.0以后)内置了运算符 =~ 来支持正则表达式匹配。请注意此运算符只能用在[[...]]表达式中,而不能用在[...] 中。bash内置支持的好处在于使用方便和效率提升,不需要fork一个process即可以进行正则表达式匹配。但是似乎bash对正则表达式的支持不很完善,比如用 转义符\d无法匹配单个数字,必须用 [0-9]来匹配才行,比较罗嗦。
下面是在bash脚本中用正则表达式对IP地址和端口号进行检查的代码:
33 #check arguments
34
35 #check ip
36 pattern_ip="^(([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))$"
37 #pattern_ip="^((1?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}(1?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))$"
38
39 if [[ !(($1 =~ $pattern_ip) && ($3 =~ $pattern_ip)) ]] ; then
40 echo "from_ip or to_ip has errors!"
41 exit 0
42 fi
43
44 #check port
45 pattern_port="^([0-9]{1,4}|[1-5][0-9]{4}|6[0-5]{2}[0-3][0-5])$"
46 if [[ !($2 =~ $pattern_port) ]]; then
47 echo "port has erros!"
48 exit 0;
49 fi
当我们说到sticky位时,一般都是在说“在设置了sticky位的目录下,用户只能删除属于自己的文件”,其实这样说并不确切。在网上找了几篇文章后 还是没有找到比较权威的解释,man一下chmod可以发现一段对该位的详细解释,说的很明白。翻译如下以备忘。原文见man chmod(1)。
” 限制删除标志和粘滞位共用一个位,系统依赖于文件类型来解释此位。对于目录,该位阻止非授权用户删除或重命名本目录下的文件除非该用户是文件或目录的属 主,这就是所谓的目录的限制删除标志,通常在所有人都可写的目录/tmp上可以发现该标志。在一些老旧系统的普通程序文件上,该位使系统在交换设备上保存 程序的映像从而使程序可以更快的再次运行,这就是所谓的粘滞位。”
所以当该位用于目录权限设置时,叫做“限制删除标志位”更合适。
PS:此文最早发表于cppblog.
前几天刚安装了ubuntu 9.04,在分区的时候,先从磁盘的最后面划出大约2G的空间做了swap,然后再分的/,/var,/tmp,/home。安装好了才发现,虽然swap在磁盘的最后面,其设备号却为/dev/sda6,排在其他分区的前面,sda1和sda5为XP使用的分区。虽然看着有些不爽,但是不影响使用,也就没管它。
今天用sudo fdisk -l查看分区表的时,在打印的分区列表最后面有一句话:Partition table entries are not in disk order,又勾起了我的洁癖,决定把分区表顺序调整过来。
sudo fdisk /dev/sda进入fdisk的shell,然后输入f回车就可以把分区顺序调整过来了,然后输入w保存退出。因为root分区的设备号从(hd0,6)变成了(hd0,5),所以grub就会无法找到root分区,从而无法进行引导。
用ubuntu 9.04的livecd引导进入系统,进入grub,然后root (hd0,5),setup (hd0) 就可以了。
ubuntu9.04是用uuid来标示分区的,所以/etc/fstab和/boot/grub/menu.lst不用更改就可以顺利的启动系统了。