工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

awk的环境变量

Table 1. awk的环境变量

变量 描述
$n 当前记录的第n个字段,字段间由FS分隔。
$0 完整的输入记录。
ARGC 命令行参数的数目。
ARGIND 命令行中当前文件的位置(从0开始算)。
ARGV 包含命令行参数的数组。
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环境变量关联数组。
ERRNO 最后一个系统错误的描述。
FIELDWIDTHS 字段宽度列表(用空格键分隔)。
FILENAME 当前文件名。
FNR 同NR,但相对于当前文件。
FS 字段分隔符(默认是任何空格)。
IGNORECASE 如果为真,则进行忽略大小写的匹配。
NF 当前记录中的字段数。
NR 当前记录数。
OFMT 数字的输出格式(默认值是%.6g)。
OFS 输出字段分隔符(默认值是一个空格)。
ORS 输出记录分隔符(默认值是一个换行符)。
RLENGTH 由match函数所匹配的字符串的长度。
RS 记录分隔符(默认是一个换行符)。
RSTART 由match函数所匹配的字符串的第一个位置。
SUBSEP 数组下标分隔符(默认值是\034)。

 

http://man.lupaworld.com/content/manage/ringkee/awk.htm

awk 列变行实例

[root@asmboy ~]# more tes
1        sldj
1        sldfjf
2        lsdf
1        sdsl
2        ls
[root@asmboy ~]# awk '$1==1{if(i++)printf ","$2;else printf $2}END{print ""}' tes
sldj,sldfjf,sdsl
[root@asmboy ~]# awk '$1==2{if(i++)printf ","$2;else printf $2}END{print ""}' tes
lsdf,ls

dz72 伪静态规则

        <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2
        RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3
        RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$3&page=$3
        RewriteRule ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3
        RewriteRule ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2
        </IfModule>

改源码解决php跨站问题(转)

vi main/fopen_wrappers.c

/* {{{ php_check_open_basedir
*/
PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
{
        /* Only check when open_basedir is available */
        if (PG(open_basedir) && *PG(open_basedir)) {
                char *pathbuf;
                char *ptr;
                char *end;
                // add by anxsoft.com
                char *env_doc_root;
                if(PG(doc_root)){
                        env_doc_root = estrdup(PG(doc_root));
                }else{
                        env_doc_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
                }
                if(env_doc_root){
                        int        res_root = php_check_specific_open_basedir(env_doc_root, path TSRMLS_CC);
                        efree(env_doc_root);
                        if (res_root == 0) {
                                return 0;
                        }
                        if (res_root == -2) {
                                errno = EPERM;
                                return -1;
                        }
                }
                // add by anxsoft.com


                pathbuf = estrdup(PG(open_basedir));

                ptr = pathbuf;

                while (ptr && *ptr) {
                        end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
                        if (end != NULL) {
                                *end = '\0';
                                end++;
                        }

                        if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
                                efree(pathbuf);
                                return 0;
                        }

                        ptr = end;
                }
                if (warn) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));
                }
                efree(pathbuf);
                errno = EPERM; /* we deny permission to open it */
                return -1;
        }

        /* Nothing to check... */
        return 0;
}
/* }}} */

 

然后在 php.in的open_basedir配置
open_basedir = "/tmp/:/var/tmp/"

---------------------------

出现错误:

PHP Warning: Unknown: open_basedir restriction in effect. File() is not within the allowed path(s): (/www/:/tmp/) in Unknown on line 0

下载eaccelerator 0.9.6后先不要安装,解包后找到eaccelerator.c这个文件,打开第1156行,这样的:
if (PG(open_basedir) && php_check_open_basedir(realname TSRMLS_CC)) {
修改成:
if (PG(open_basedir) && php_check_open_basedir(file_handle->filename TSRMLS_CC)) {

Linux 系统在单用户模式,修复模式,跨控制台登录在系统修复中的运用(转)

一、单用户模式;

单用户模式要求我们输入root用户的密码,否则您无法登录单用户模式;如果您丢失了root用户的密码,并不能用单用户模式来重设您的root密码;

另外单用户模式还有一个前提是您的grub 或者lilo 是能正常工作的;并且您知道您的系统问题发生在哪里,当以单用户模式登录时,您能打开文件系统的写操作,然后进行您想要进行的系统修复;

可能有的弟兄会说“我真的不知道系统哪块出了问题”,呵,如果真的不知道,那我也无能为力了,因为本文档主要讲述登录模式,并不是讲述如何修复系统的;


1、以grub 系统引导管理器,单用户登录方法;

在grub 启动后,移动键盘到Linux的启动项;按e键;然后再移动键盘到类似下面的一行,也就是kernel的那行:

kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/1 rhgb quiet

 

把光标移动这行后,再按一下e键,进入编辑这行;在行尾条一个空格 ,然后输入 linux single,也就是类似如下的:

kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/1 rhgb quiet linux single


结束编辑,按回车返回;

 

接着我们要启动系统,按一下b键启动;

当进入单用户模式运行后,系统提示我们输入root密码;输入正确后会进入系统;您可以用df -h 来查看文件系统挂载位置等,也可以用fdisk -l 来查看分区等;但对文件系统的写操作,可能还要看下面的;

单用户进入系统后,可能系统是只读的;要运行下面的命令;

 

#mount -o remount,rw /

 


2、lilo 引导管理器单用户模式;

在boot:处输入

 

linux single

 

当进入单用户模式运行后,系统提示我们输入root密码;输入正确后会进入系统;您可以用df -h 来查看文件系统挂载位置等,也可以用fdisk -l 来查看分区等;但对文件系统的写操作,可能还要看下面的;

单用户进入系统后,可能系统是只读的;要运行下面的命令;

 

#mount -o remount,rw /

 


二、linux rescue 修复模式;

Linux的修复模式就是 linux rescue;修复模式并不需要系统密码,当进入修复模式后,系统会提示我们要挂载哪个分区上的文件系统,我们根据自己的系统情况来选择就就是了。登录完成后,系统也会提示所在分区的文件系统会被挂载到哪个目录;如果您不知道挂载在哪里,请通过 df -h 来查看;

修复模式需要安装盘的第一张或独立的修复盘;比如 Fedora 就有专门的修复盘;其实修复盘在一定意义上来说类似livecd,是不需要安装到硬盘也能运行系统;然后通过mount 来挂载文件系统;其实当我们执行linux rescue 时,象Fedora 这类的系统,会有一些提示,比如他提示他要mount 哪个分区,我们选择一下就行了;

执行修复模式时,需要以下几个步骤;

其一:在BIOS中,设置首个启动驱动器为CDROM;
其二;找出系统安装盘的第一张;放入CDROM ;当光盘运行时,会提示安装的界面;

在boot:后面输入 linux rescue ,然后按回车;

 

boot:linux rescue

 

进入修复模式,我们能做些什么呢??什么都可以做,比如挂载usb盘进行数据备份;修改系统中的配置文件... ... 重新设置root密码、挂载文件系统 ... ... 只要能想到,大多都可以完成;


三、跨越控制台登录;

真正的跨越控制台登录是不需要输入root密码的,如果您把root密码丢失,就要想到跨越控制台登录;我们前面所说的linux rescue 从本质上来说,就是跨越控制台登录,因为无需要密码验证就能登录系统;

跨越控制台登录主要包括:借grub和lilo 跨越控制台登录; linux rescue 模式;第三方livecd 系统和第三方Linux系统;

1、通过grub和lilo 引导,跨越控制台登录;


1)如果您用的是grub进行系统引导;

在grub 启动后,移动键盘到Linux的启动项;按e键;然后再移动键盘到类似下面的一行,也就是kernel的那行:

kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/1 rhgb quiet

 

把光标移动这行后,再按一下e键,进入编辑这行;在行尾条一个空格 ,然后输入 linux single,也就是类似如下的:

kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/1 rhgb quiet linux init=/bin/bash


结束编辑,按回车返回;

 

接着我们要启动系统,按一下b键启动;

可能系统是只读的;要运行下面的命令;

 

#mount -o remount,rw /

 

然后我们可以通过 df -h 来查看文件系统的加载情况;既然都把文件系统挂载了,有什么活干不了的呢?重设root密码,备份文件... ...

比如重设root密码;

 

#passwd



2)如果您用lilo 进行系统引导;

 

在boot:处输入

 

boot:linux init=/bin/bash

 

当进入系统后,您可以用df -h 来查看文件系统挂载位置等,也可以用fdisk -l 来查看分区等;但对文件系统的写操作,可能还要看下面的;

可能系统是只读的;要运行下面的命令;

#mount -o remount,rw /

 


2、linux rescue ;

请参考前面第二点所说的修复模式;


3、借linux的livecd光盘 或第三方linux系统;

linux的livecd版本是无需安装的linux 系统,在光盘上就可以运行的linux 系统; livecd 大多是用来修复之用,livecd 集成了常用的系统操作工具;

第三方Linux系统是指你的机器上安装一个以上的Linux系统,如果其中一个发生问题,我们就可以用另一个来修复;

livecd 和第三方linux系统来修复已经被破坏的Linux ,常用的工具有mount 和chroot等等 ;如果您只是简单的更改存在问题的系统文件,用mount 就足够了。chroot 工具可以改变/,进而进入另一个系统,这个工具的确有用。

我们还是举个例子来说明如何通过用mount和chroot;

至于机器中第三方Linux和Livecd的使用比较简单,这里就不多说了;

livecd就是在光盘上运行的linux ,您可以找一个livecd的发行版本刻录一下就能用了,使用简单方便;

下载地址:

http://www.frozentech.com/content/livecd.php

常用的有 SLAX,Knoppix,Damn Small Linux,Ubuntu ... ...

大体都差不多,下载一个小的备用也行,就看您怎么用了;

通过livecd linux 或其它linux 来修复已经破坏的Linux步骤如下:

1)mount 挂载文件系统;

注:执行mount 及chroot时,要以root权限运行,以下同;

比如存在问题的系统位于 /dev/hda5 ,如果您不知道哪个分区是linux的,您可以通过fdsik -l 来查看;

[root@localhost ~]# fdisk -l 注:查看分区情况;
[root@localhost ~]# pwd 注:确定当前工作目录;
/root 注:当前工作目录为/root
[root@localhost ~]# mkdir systmp 注:在当前工作目录下创建一个临时目录;
[root@localhost ~]# mount /dev/hda5 systmp/ 注:挂载hda5到tmpsys目录中;
[root@localhost ~]# df -h 注:查看是否已经挂载;
Filesystem 容量 已用 可用 已用% 挂载点
/dev/hda8 11G 9.8G 581M 95% /
/dev/shm 236M 0 236M 0% /dev/shm
/dev/hda5 7.9G 5.9G 2.0G 76% /root/systmp 注:看好了,是挂载到了/root/systmp目录中;

 

既然把/dev/hda5分区的文件系统已经挂载了,我们就能对已经挂载的文件系统进行写操作;如果是简单的备份和文件修改,是完全能行的;

注意:在写操作的过程中,要倍加不心,在操作某个文件的时候,要先备份;当出现不能mount的情况,可能是您的当前所用的内核不支持相应的文件系统;如果系统要求指定文件系统的时候,请看如下的例子;

mount -t 文件系统类型 磁盘分区 挂载目的目录

对于linux的文件系统类型主要有:reiserfs,ext3,ext2;具体用什么文件系统类型,你最明白;如果您还是不知道,就一个一个的尝试;比如我的hda5是reiserfs的,可以用下面的命令来挂载;

[root@localhost ~]# mount -t reiserfs /dev/hda5 systmp/

 


2)chroot 到已经挂载的文件系统;

chroot这个工具很有用,很多Linux都支持chroot切换到另一个文件系统中,然后进行一系列系统包的安装和系统配置;这并不是说任何文件系统都能chroot切入 ,首先这个文件系统中得具备系统运行的一定的工具和环境,比如/bin和/sbin 目录是拥有等....

用中文表达不清楚,还是举例来说明;

比如我的机器中有两个Linux系统,一个运行正常,另一个有点问题(比如是root密码忘记了),我想通过正常的系统来修复另一个;首先我们进行的是mount ,也就是前面所说的,然后下一步就是chroot ;通过chroot 切换到要修复的文件系统中;

比如存在问题的系统位于 /dev/hda5

 

[root@localhost ~]# fdisk -l
[root@localhost ~]# pwd
/root
[root@localhost ~]# mkdir systmp
[root@localhost ~]# mount /dev/hda5 systmp/
[root@localhost ~]# df -h
Filesystem 容量 已用 可用 已用% 挂载点
/dev/hda8 11G 9.8G 581M 95% /
/dev/shm 236M 0 236M 0% /dev/shm
/dev/hda5 7.9G 5.9G 2.0G 76% /root/systmp
[root@localhost ~]# chroot systmp 注:chroot到hda5分区的系统中;
bash-3.00# 注:已经登录;
bash-3.00# df -lh 注:查看文件系统挂载情况;
Filesystem 容量 已用 可用 已用% 挂载点
/dev/hda5 7.9G 5.9G 2.0G 76% /
proc 7.9G 5.9G 2.0G 76% /proc
sysfs 7.9G 5.9G 2.0G 76% /sys

 

上面我们就通过chroot 命令完成了通过一个系统到另一个系统的跨控制台登录;Livecd 如果要完成此任务,也是通过这样过程完成的。

我们既然已经登录到有问题的系统了,可以进行相应的修复工作,比如对root密码的恢复,软件包的安装,相应文件的修改... ... 我想您应该知道怎么做,对不对???

有些发行版的安装盘类似livecd ,比如slackware 的安装盘的第一张,当他启动到让你输入用户名和密码进行安装时,我们不必输入什么,或者直接输入root ,就能进入cdrom 虚拟环境了;这时我们就用前面所说mount加载文件系统,然后chroot挂载的文件系统;

四、后记; 正在写文件系统的管理,可能要花几天时间;努力之中;

五、关于本文;

看到论坛的弟兄还在大呼丢了root密码怎么恢复,虽然坛里也有不少文档,但大多没有形成系统,为了解决问题而重写此文,可能有的弟兄需要这样的文档;既然有“市场”,我就写,没有什么大不了的;有的弟兄认为是小题大作,就当我锻炼身体好了;这样的文档谁都会写,没有什么难的;

linux 下制作二进制 .bin 的文件

制做方法是使用cat 命令将执行脚本和打包文件同时放到一个.bin的文件里
这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。
例:制作安装apache、mysql的安装脚本包
1.将源码包先打包
#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz

2.编写脚本如下:
# cat install.sh
#!/bin/bash
dir_tmp=/root/installapache
mkdir $dir_tmp
sed -n -e '1,/^exit 0$/!p' $0 > "${dir_tmp}/packages.tar.gz" 2>/dev/null
cd $dir_tmp
tar zxf packages.tar.gz
tar jxf httpd-2.0.63.tar.bz2
cd  httpd-2.0.63
./configure --prefix=/tmp/apache2
make
make install
cd $dir_tmp
tar zxf mysql-5.0.33.tar.gz
cd mysql-5.0.33
./configure --with-charset=gbk --with-extra-charsets=binary,latin1,gb2312 --localstatedir=/home/db --with-mysqld-ldflags=-all-static -enable-assembler --with-innodb --prefix=/tmp/mysql5
make
make install
exit 0


#cat install.sh packages.tar.gz >install.bin

这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到
最主要的是下面这句,是将二进制文件从.bin文件里分离出来
sed -n -e '1,/^exit 0$/!p' $0 > "${dir_tmp}/packages.tar.gz" 2>/dev/null

安装的时候直接执行
sh install.bin
安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。

xen hypervm

虽说hypervm在年中的时候由于安全漏洞引起了轩然大波,但做为免费的VPS管理工具,还是很方便的。自己注意一些安全配置,也应该无大障。另外,目前hypervm已经开源,相信未来会更光明的。

hypervm的安装还是很简单的,下面是官方的命令说明:

 

  • $ setenforce 0
  • $ wget http://download.lxcenter.org/download/hypervm/production/hypervm-install-master.sh
  • $ sh ./hypervm-install-master.sh –virtualization-type=xen/openvz/NONE
  • You have to explicitly specify which virtualization type you want using the option –virtualization-type as either xen or openvz or NONE. If you want to install hypervm on an existing system, just use virtualization-type=NONE, which will install just hyperVM components, and skip the virtualization componetns entirely. When you run the command, you will presented with a menu from up2date, on which you can press <Enter>
    值的一提的是,hypervm安装时会下载一些的操作系统的安装模板,下载时间会比较长,如果暂时不需要这些模板,可以通过在安装命令行加入skip-ostemplate参数。比如:

    # sh ./hypervm-install-master.sh –virtualization-type=openvz –skip-ostemplate=true

     

    --------------------------------------

    HyperVM安装手记(XEN篇)

    http://download.lxlabs.com/?software=hypervm选择下载需要的安装脚本(master的地址为http://download.lxlabs.com/download/hypervm/production/hypervm-install-master.sh),在服务器上运行sh ./hypervm-install-master.sh –virtualization-type=xen
    安装过程是会自动完成的,但在这之前,需要先将需要的虚拟化软件装好。安装完HyperVM后init 6重启,然后通过浏览器访问http://<server address>:8888就能操作虚拟机了。
    需要注意的是,HyperVM需要一个未建立分区的LVM卷来存放XEN虚拟机,并且这个操作要在安装HyperVM之前完成,虽然可以在安装后通过管理界面添加,但那比较麻烦。
    对于fedora 6/centos 5,其xen安装可能会有些后遗症,因此,在这些系统中安装完HyperVM后应根据http://lxlabs.com/software/hypervm/install-xen/中的方法对系统进行一些调整。
    推荐一个建立LVM卷的方法:http://book.51cto.com/art/200909/149041.htm

    ---------------------------------------

    HyperVM安装手记(OpenVZ篇)

    首先要说一说OpenVZ的安装
    cd /etc/yum.repos.d
    wget http://download.openvz.org/openvz.repo
    yum install ovzkernel

    即可完成安装。重启后,从
    http://download.lxlabs.com/?software=hypervm选择下载需要的安装脚本(master的地址为http://download.lxlabs.com/download/hypervm/production/hypervm-install-master.sh),在服务器上运行sh ./hypervm-install-master.sh –-virtualization-type=openvz
    安装过程是会自动完成的,安装完HyperVM后init 6重启,然后通过浏览器访问http://<server address>:8888就能操作虚拟机了。

    最后,推荐个关于OpenVZ安装的页面http://linux.chinaunix.net/docs/2006-11-13/3187.shtml

    shell的字符替换

    变量替换:
    一:简单赋值和替换
    a=bcd
    $ echo $a  
    bcd
    $ echo ${a}
    bcd

    二:变量扩充
    除了shell中的meta,其它的[^a-zA-Z0-9_]几乎都可以作单词边界。
    同sed中关于单词边界[^a-zA-Z0-9_]的描述。
    http://bbs.chinaunix.net/forum/24/20040825/393964.html
    这些功能有时候会在程序中有意想不到的作用!
    例如:
    $ a=bcd
    $ echo ${a}.b
    bcd.b
    $ echo $a.php
    bcd.php
    $ echo $a%b
    bcd%b
    $ echo /$a/bc
    /bcd/bc
    对于shell中的meta字符,则backslash。
    $ echo $a\*b
    bcd*b

    三:变量中的变量
    $ a=bcd
    $ b=efg
    $ c=$a$b
    $ echo $c
    bcdefg
    $ d=$c.ghi
    $ echo $d
    bcdefg.ghi

    思考:若变量互相嵌套,会怎样呢?

    四:变量的特异功能
    到网中人的啦!(ps:重写真是没激情啊)
    file=/dir1/dir2/dir3/my.file.txt
    我们可以用 ${ } 分别替换获得不同的值:
    ${file#*/}:从变量file的字符串左边开始,删除字符直到第一个“/”:dir1/dir2/dir3/my.file.txt
    ${file##*/}:从变量file的字符串左边开始,删除字符直到最后一个“/”:my.file.txt
    ${file#*.}:从变量file的字符串左边开始,删除字符直到第一个“.”:file.txt
    ${file##*.}:从变量file的字符串左边开始,删除字符直到最后一个“.”:txt

    其实,在“#”后面,无非就是一个匹配问题,不限于两个,你可以放任意个字符,还可以用shell中另外的通配符“?”“[…]”“[!…]”,例如:
    $ echo ${file#????}
    1/dir2/dir3/my.file.txt
    $ echo ${file#*[0-9]}
    /dir2/dir3/my.file.txt
    $ echo ${file#/dir1/dir[0-9]}
    /dir3/my.file.txt

    “#”:相当于最小匹配,遇到一个最小的符合其后表达式的字符串(单个或多个)即中止匹配动作;
    “##”:相当于最大匹配,它尽可能的匹配更多的字符。
    我们可以拿“*”来说明:  
    *  在shell中表示匹配任何符号包括空。当它在只有一个 # 的变量替换中,受最小匹配的影响,它不会匹配任何可打印字符,只匹配一个空,也就是什么也不匹配,你完全可以忽略它的存在;
    当在有两个 ## 的变量替换中,受最大匹配的影响,一个 * 表示匹配整个字符串。
    如果想匹配字符“*”时,要在“*”前加一个“\”,其后的“*”失去通配符的功能。
    但是还有一种例外情况(请接着看)


    例:
    $ file2=abcd.efgh.ijkl.oopp
    $ echo ${file2#*.*.*.*}
    $ echo ${file2##*.*.*.*}

    想想上面两个的输出是什么?
    $ echo ${file2#*.*.*.*}
    oopp
    $ echo ${file2##*.*.*.*}

    ??知道为什么吗?因为:“*”匹配任何符号包括空。遇到一个“#”时,最后一个“*”就匹配“空”去了。看下面的:
    $ echo ${file2#*.*.*.?}
    opp
    $ echo ${file2#*.*.*.?*}
    opp
    $ echo ${file2##*.*.*.?}
    opp
    $ echo ${file2##*.*.*.?*}

    do you know?

    $ echo $file3
    *ab*de*cd
    看看下面将输出什么?
    $ echo ${file3#*ab}      
    *de*cd
    $ echo ${file3#**}
    *ab*de*cd
    $ echo ${file3##**}

    $ echo ${file3#\*ab}
    *de*cd
    $ echo ${file3#\**}
    ab*de*cd
    $ echo ${file3##\**}

    $ echo ${file3#*a}
    b*de*cd
    $ echo ${file3#\*a}
    b*de*cd

    不知各位有没有发现,“*”在一个“#”中时,并不一定代表“空”,它可能代表一个字符“*”也可能代表其他的什么字符,如上例的:
    “$ echo ${file3#*a}”输出为“b*de*cd”,其实这还是符合最小匹配理论的。这个表达式的意思是:从变量file3的字符串左边开始删除字符,直到遇到第一个字符“a”。所以不要和“$ echo ${file3#\*a}”混淆,虽然两个结果是一样,但意思是不一样的。

    再举几个例子,相信大家更容易理解这段话:
    $ echo $file3
    *ab*de*cd*ab*de                     //注意:出现两个“*ab”
    $ echo ${file3#*a}
    b*de*cd*ab*de                         //删除字符,直到出现第一个“a”,“*”为通配符
    $ echo ${file3##*a}
    b*de                                           //删除字符,直到出现第二个“a”,“*”为通配符
    $ echo ${file3##\*a}
    b*de*cd*ab*de                         //删除字符串“*a”,“*”在“\”表示字符“*”

    除了通配符“*”比较难理解一点,其他的shell通配符就都很容易了。

    至于“%”,和“#”不同的地方,就是从变量字串右部开始。
    ${file%/*}:从右部开始拿掉字符,直到遇到(从右部数起的)第一个“/” :/dir1/dir2/dir3
    ${file%%/*}:从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“/”:(空值)
    ${file%.*}:从右部开始拿掉字符,直到遇到(从右部数起的)第一个“.”:/dir1/dir2/dir3/my.file
    ${file%%.*}:从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“.”:/dir1/dir2/dir3/my
    单匹配格式${var/被替换字符/替换字符}
    全匹配格式${var//被替换字符/替换字符}
    例子:
    [test]# echo ${ip/./@}
    324@2354.329.5324
    [test]# echo ${ip/./,}
    324,2354.329.5324
    [test]# echo ${ip/./ }
    324 2354.329.5324
    [test]# echo ${ip//./ }
    324 2354 329 5324
    [test]# echo ${ip//./,}
    324,2354,329,5324
    [test]# echo ${ip//./@}
    324@2354@329@5324
    总结一点结果.${}中:
    /代表字符串的替换.
    :代表字符串的提取.
    #和%公别代表左截和右截.