Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2373382
  • 博文数量: 298
  • 博客积分: 7876
  • 博客等级: 准将
  • 技术积分: 5500
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-23 13:39
文章存档

2013年(2)

2012年(142)

2011年(154)

分类: Python/Ruby

2012-04-20 21:02:18

通配符’*’的使用

 

1.      /etc/profile文件里面有两段脚本

(1)         查看字符串是否为另一字符串的字串

pathmunge(){

    case ":${PATH}:" in

        *:"$1":*) exec;;

        *)

}

由于PATH环境变量格式为/usr/local/bin:/sbin:/usr/bin;为了找出$1时候在PATH路径中,我们使得STR=:/usr/local/bin:/sbin:/usr/bin:,在路径前后都增加冒号,然后利用shell的通配符*,如果$1=/sbin,那么*:"$1":*可以匹配到,第一个*扩展为:/usr/local/bin,第二个*扩展为/usr/bin:,在PATH路径两边加:就是为了防止$1出现在PATH路径的两边。

而最后一个选项*可以扩展任何值,所以无论怎样都可以执行,如果前面的case选项都没有匹配到那么执行最后的*选项。

注:在case选择中可以使用通配符匹配

 

(2)         匹配某文件夹下文件

if [ -d /etc/profile.d ]; then

  for i in /etc/profile.d/*.sh; do

    if [ -r $i ]; then

      . $i

    fi

  done

  unset i

fi

 

在判断目录/etc/profile.d存在的时候,要执行该目录下的shell脚本,默认shell脚本文件后缀为sh,所以/etc/profile.d/*.sh可以在shell通配符*的帮助下,扩展为该目录下的所以shell脚本,然后判断是否可读,使用’.’命令来执行脚本。

问题1:我们知道””在shell为引用,在双引号里面的除了”、`、$、\四个要使用原始意义的时候需要转义之外,其他字符都保持原始意义,那么*也不再作为shell的通配符了,可是下面的脚本一样能够正常执行:

#! /bin/bash

if [ -d /etc/profile.d ]; then

  for i in "/etc/profile.d/*.sh "; do

   echo $i

  done

  unset i

fi

 

但是下面的脚本不能够正常运行

#! /bin/bash

ls "/etc/profile.d/*.sh "

是否仅仅在for i in "/etc/profile.d/*.sh "的时候能够正常执行呢??

问题2:在使用交互式shell的时候,命令

$ ls " *"

不能够正常使用,但是

$ ls *

能够正常使用表明shell的双引号引用发挥了作用。

 

阅读(3798) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~