Board logo

标题: [分享] Linux Shell程序设计(一) [打印本页]

作者: marquis    时间: 2013-4-20 23:25     标题: Linux Shell程序设计(一)

4.1.1  shell的特点和主要版本
作为命令解释程序
一种高级程序设计语言,它有变量,关键字,有各种控制语句,如if、case、while、for等语句,支持函数模块,有自己的语法结构

1.shell的特点

☆组合新命令               
☆提供了文件名扩展字符

☆直接使用shell的内置命令     
☆灵活地使用数据流

☆结构化的程序模块         
☆在后台执行命令

☆可配置的环境                     
☆高级的命令语言


2.shell的种类

(1)Bourne  shell(简称sh)

(2)C shell(简称csh)

(3)Korn  shell(简称ksh)

(4)Bourne Again shell(即bash)


4.1.2  shell程序示例
由三条简单命令组成的shell程序(文件名为ex1)。

$ cat  ex1

date

pwd

cd  ..
带有控制结构的shell程序(文件名为ex2)。
$ cat ex2
#!/bin/bash
# If no arguments, then listing the current directory.
# Otherwise, listing each subdirectory.
if  test  $# = 0
then  ls  .
else
    for  i
    do
      ls  -l  $i | grep  '^d'
    done
fi


4.1.3  shell脚本的建立和执行
1、shell脚本的建立

2、执行shell脚本的方式
     执行shell脚本的方式基本上有三种:
       (1)输入定向到shell脚本
           $ bash < 脚本名
       (2)以脚本名作为参数
       其一般形式是:  $ bash  脚本名  [参数]
如果以目前shell(以·表示)执行一个shell脚本,则可以使用如下简便形式:
            $ · 脚本名 [参数]
       (3)将shell脚本的权限设置为可执行,然后在提示符下直接执行它。
        $ chmod  a+x  ex2
        $ PATH=$PATH:.
        $ ex2
注意,此时该脚本所在的目录应被包含在命令搜索路径(PATH)中



4.2.1  显示历史命令
语法格式是:history  [option] [arg…]
如果不带任何参数,则history命令会显示历史命令的清单
如果history 后给出一个正整数(如50),就只显示历史表中的最后50行命令  
如果history后给出一个文件名,就把它作为历史文件名

常用的选项有:
  -a  在历史文件中添加“新”历史命令行。
  -n  从历史文件中读取尚未读入的历史命令行,添加到当前历史清单中。
  -r  读取历史文件的内容,并把它作为当前的历史命令。
  -w  把当前的历史写到历史文件中,覆盖原有内容。
  -c  删除历史清单中所有的项。


4.2.2  执行历史命令
执行历史命令是命令替换之一,它以字符“!”开头、后随1个或多个字符来定义用户所需的某种类型的历史命令
                      基本的事件指定字格式
图片1.png



4.2.3  配置历史命令环境
在默认方式下,bash使用用户主目录下面的文件“.bash_history”来保存命令历史
改变存放历史命令的文件
    $ HISTFILE="/home/mengqc/.myhistory"
重新设定能够保留的命令个数
    $ HISTSIZE=600

图片附件: 图片1.png (2013-4-20 23:24, 200.78 KB) / 下载次数 6796
http://wdlinux.cn/bbs/attachment.php?aid=2845&k=1f48e62b28bbb64ea80fe0c510103c41&t=1732269724&sid=O246Ie


作者: marquis    时间: 2013-4-20 23:26

本帖最后由 marquis 于 2013-4-20 23:41 编辑

4.3  名称补全
可以输入目录名或文件名的开头部分,然后按Tab键,
Linux根据输入的字母查找以这些字母开头的目录或文件,并自动补全剩余的部分。


4.4.1  定义别名
一般语法格式为: alias [name[=value]]…
如果没有指定参数,将在标准输出(屏幕)上显示别名清单
定义别名时,往往用单引号将它代表的内容括起来,从而防止shell对其中的内容产生歧义,如对空格和特殊字符另作解释


4.4.2  取消别名
如果想取消先前定义的别名,可使用如下命令:
        unalias name…

可以一次将所有的别名都从别名表中删除,使用如下命令:
        unalias -a


4.5.1  通配符
1.一般通配符
*(星号),它匹配任意字符的0次或多次出现,不能匹配文件名前面的.和/
?(问号),它匹配任意一个字符
[ ](一对方括号),其中有一个字符组。其作用是匹配该字符组所限定的任何一个字符
!(惊叹号),如果它紧跟在一对方括号的左方括号([)之后,则表示不在一对方括号中所列出的字符
例:chapter[0-9]*,-a[*?]abc, f[!1-9].c

2.模式表达式 ——是那些包含一个或多个通配符的字
*(模式表)——匹配给定模式表中“模式”的0次或多次出现,各模式之间以“|”分开(下同)
+(模式表)——匹配给定模式表中“模式”的1次或多次出现
?(模式表)——匹配模式表中任何一种“模式”的0次或1次出现
@(模式表)——仅匹配模式表中给定“模式”的一次出现
!(模式表)——除给定模式表中的一个“模式”之外,可以匹配其他任何东西
例:file*(.c|.o),file+(.c|.o) ),file?(.c|.o) ),file@(.c|.o)


4.5.2  引号
1.双引号
由双引号括起来的字符(除$、倒引号(`)和反斜线(\)外)均作为普通字符对待。

2.单引号
由单引号括起来的字符都作为普通字符出现

3.倒引号
倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。
倒引号还可以嵌套使用。但应注意,嵌套使用时内层的倒引号必须用反斜线(\)将其转义。
作者: marquis    时间: 2013-4-20 23:27

本帖最后由 marquis 于 2013-4-20 23:44 编辑

4.5.3  输入/输出重定向符
自动打开三个标准文件,即标准输入文件(stdin),标准输出文件(stdout)和标准出错输出文件(stderr)。
1.输入重定向符   
一般形式是:命令 < 文件名        如:$  score < file1

2.输出重定向符
一般形式是:命令 > 文件名         如:$ who > abc

3.输出附加定向符
一般形式是:命令>>文件名         如:$ ps -l >> psfile

输入和输出重新定向可以连在一起使用。例如:
    $ wc  -l < infile > outfile

4.即时文件定向符
即时文件的形式是:
   命令  [参数]<< 标记符
    输入行
    …
   标记符
  注意:标记符要成对出现
例如:
  mail  $1 << !!
  Best  wishes  to  you  on  your  birthday .
  !!

5.与文件描述字有关的重定向
系统为每个进程自动打开三个标准文件(即标准输入、标准输出和错误输出),其文件描述字分别为0,1和2。
标准错误输出也可重定向到一个文件中,其一般形式是:
      命令  2> 文件名
      命令  2>> 文件名
标准输出和标准错误输出可以重定向到同一个文件,一般形式是:
      command  $>file
等价于下面形式的命令:
     command > file  2>& 1


4.5.4  注释、管道线和后台命令
1.注释
    #!/bin/bash
    # If no arguments, then listing the current directory.
    # Otherwise, listing each subdirectory.
2.管道线
    ls -l  $HOME | wc –l
    ls  | grep  m?.c | wc –l
3.后台命令
    $ gcc  m1.c&


4.5.5  命令执行操作符
1.顺序执行
    在执行时,以分号隔开的各条命令从左到右依次执行
pwd ;  who | wc  -l ;  cd  /usr/bin
2.逻辑与
命令1 && 命令2
其功能是,先执行命令1,如果执行成功,才执行命令2;否则,若命令1执行不成功,则不执行命令2。
3.逻辑或
命令1 || 命令2
其功能是,先执行命令1,如果执行不成功,则执行命令2;否则,若命令1执行成功,则不执行命令2。


4.5.6  成组命令
1.{ }形式
以花括号括起来的全部命令可视为语法上的一条命令,出现在管道符的一边。
    $ {  echo  “User  Report  for  ` date ` . ”; who ; } | pr
    使用花括号时在格式上应注意:左括号 “{ ”后面应有一个空格;右括号“}”之前应有一个分号( ;)
2.( )形式
    (echo  "Current  directory  is  ` pwd ` . "
    cd  /home/mengqc ;  ls -l ;
    cp  m1  em1 && rm  m1
    cat  em1) | pr
二者存在重要区别:用花括号括起来的成组命令只是在本shell内执行命令表,不产生新的进程;而用圆括号括起来的成组命令是在新的子shell内执行,要建立新的子进程。




欢迎光临 WDlinux官方论坛 (http://wdlinux.cn/bbs/) Powered by Discuz! 7.2