学习shell

上一篇 / 下一篇  2008-10-11 22:32:05 / 个人分类:linux

    4.1  vi处理器

    4.1.1 vi简易说明
   
    vi分为三种模式,分别是"一般模式","编辑模式","命令行模式".
 
    一般模式是指用vi处理文件时,一进入该文件就是一般模式,可以处理删除,复制,粘贴等动作,但文法编辑
   
    编辑模式是指在一般模式下按下i,I,o,O,a,A,r,R等字母后才进入的模式,这种情况下才能输入字符写入文件中.在编辑模式下
 
按下ESC键后,才退出编辑模式

    命令行模式是指在一般模式下,输入":","/"就可以将光标移动到最后一行,在这个模式下,可以搜寻数据,读取,存盘,字

符替换、退出vi等动作

   4.1.2 简易范例

   4.1.3 常用指令
  
   一般模式(光标移动):

   nG 光标移至第 n 行首
   n+ 光标下移 n 行
   n- 光标上移 n 行
  
   一般模式(查找与替换):

   /word 在光标之后查找一个名为word的字符串
   ?word 在光标之前查找一个名为word的字符串

  一般模式(删除、复制与粘贴):
 
  dd   删除光标所在行的整行
  ndd  删除光标所在行的向下n行
  dG   删除光标所在行到最后一行的所有数据
  yy   复制光标所在行的整行
  nyy  删除光标所在行的向下n行的数据
  p,P  p,将缓冲区的内容粘贴到光标的后面;P,将缓冲区的内容粘贴到光标的前面

  编辑模式:

  i               在光标左侧输入正文
  a               在光标右侧输入正文
  o               在光标所在行的下一行增添新行
  O               在光标所在行的上一行增添新行
  I               在光标所在行的开头输入正文
  A               在光标所在行的末尾输入正文

 命令行模式:

:q             在未作修改的情况下退出
:q!            放弃所有修改,退出编辑程序
:w             将编辑的数据写到文件中
:w!            若文件属性为只读,强制写入该文件
:w [filename]  将编辑的数据保存为另外的文件
:wq            保存后退出,若为:wq!,则为强制保存后退出


 4.2 学习BASH

 4.2.1 什么是SHELL

 Shell是一种具备特殊功能的程序,它是介于使用者和 UNIX/Linux 操作系统之核心程序(kernel)间的一个接口,简单的说,使

计算机主机工作是核心的任务,但是操作核心来替用户工作,却是shell的工作.

4.2.2 BASH Shell

  输入指令的方式:

   [root@test /root]# command [-options] parameter1 parameter2 ...
                    指令     选项      参数(1) 参数(2)
    1. command为指令的名称,例如变换路径的指令为cd
    2. 中括号[]并不存在于实际的指令中,在加入参数时,通常为“-”符号,
    有时候完整名称会输入“--”符号。例如ls --help
    3. parameter1 parameter2为依附在option之后的参数,或者是  command的参数
    4. command, -options, parameter1这几项之间以空格分隔, 不论空几格shell都视为一格
    5. 指令太长的时候,可以使用 \ 符号来跳转Enter,使指令连续到下一行


4.2.3 变量与变量的设定
 
    我们在执行程序的时候,系统怎么知道您的ls指令放在哪里?这是因为有PATH变量。系统通过这个变量中设定的路径依序寻

找该指令系统,如果找不到,屏幕上会显示command not found字样。这些是系统默认的变量,还可以自定义变量

    简单地说,变量就是以一组文字或符号取代一些设定或一串数据.

4.2.3.1 echo

   要显示当前的PATH变量,可以使用echo指令,而为了要分辨其是否为变量,Linux系统预设变量名称前会加一个$符号,所以就

写成echo $PATH的形式。

4.2.3.2 env

   既然环境变量很重要,那么在Linux系统中到底有多少环境变量呢?简单地使用env指令就可以知道了。

4.2.3.3 set

  set的使用方法就是直接输入set。它除了会显示当前的环境变量,也会显示您的自定义变量

  比较有趣的是$与?变量,尤其是?变量,如果您上一个命令执行过程中没有发生错误,那么这个变量会被设为0,如果上个命令

出现错误信息,那么这个变量会变成1

4.2.3.4 变量设定规则

   设定变量的规则如下:

   1. 变量与变量内容以等号“=”连结;
   2. 等号两边不能直接接空格符;
   3. 变量名称只能是英文字母与数字,其中数字不能是开头字符;
   4. 若有空格符,可以使用双引号或单引号将变量内容结合起来,但要特别留意,双引号内的特殊字符可以保留变量特性,单引号内的特殊字符则仅为一般字符;
   5. 必要时以跳转字符“\”将特殊符号(如Enter,$,\,空格符,'等)变成一般符号;
   6. 在一串指令中,还需要借助其他指令提供的信息,这时可以使用quote“` command`”;
   7. 若该变量为扩增变量内容时,则需以双引号及$变量名称(如"$PATH":/home)继续累加内容;
   8. 若该变量需要在其他子程序执行,则以export使变量可以动作,如export PATH;
   9. 通常大写字符为系统预设变量,自定义变量可以使用小写字符,方便判断(纯粹依照用户兴趣与嗜好);
   10. 取消变量的方法为:unset 变量名称。

4.2.3.5 export
 
   当您取得一个bash之后,即得到了一个程序,但是若您再次执行bash,那么将进入子程序,程序的概念我们放在第16章详谈,

这里您有个概念即可。由于您已经进入了该子程序,所以父程序中的变量设定将不继续存在。如果想让该变量内容继续在子程序

中使用,请执行export 变量

   在引用他人的文件或其他程序时,export相当重要,尤其在需要两三个文件互相引用时,如果忘记设定export,那么不同文件

中的相同变量值将需要一再地重复设定。所以,只要在头一个文件使用export,那么后续的文件引用该变量时,将会自动读取该

变量内容

4.2.3.6 unset

   直接取消该变量内容。
 
   unset 变量


4.2.4 命令别名与历史命令

4.2.4.1 alias与unalias

 alias的定义规则与变量定义规则几乎相同.

 所以在输入命令alias + 别名=' 指令 参数'后,输入别名,就是执行的'指令+参数',如要取消,使用unalias.

4.2.4.2 history

 history 查询曾经输入的指令

使用history命令来显示列表,可以跟一个整数表示希望显示最后的多少条命令。如下:
$  history 10
  526  ls web/
  527  clear
  528  ls -a
  529  history 10
  530  date
  531  make -v
  532  sudo apt-get --help
  533  history 10
  534  gcc -v
  535  history 10

    每条命令前都有一个序号标示,你可以使用下面的方法回忆出以前执行过的命令。

    !n    这个n表示序号,假如你想重新执行第528条命令ls -a,那么你可以使用!528

    !!     这将会重新执行上一条命令

    !?String?   这个String可以随便输,Shell会从最后一条历史命令向前搜索,最先匹配的一条命令将会得到执行。比如你输入 !?gc? 那第534条命令gcc -v就会执行。

    fc n    这个n表示某个历史命令的序号,这将打开一个文本编辑窗口并显示这条命令。然后你可以编辑修改这条命令,让它满足你的需要。当你退出这个编辑窗口时,该命令就会得到执行。

4.2.4.3 bash shell的配置文件

 分为两部分,系统设定值与个人设定值

 所谓的系统设定值,也就是每个用户进入到bash shell之后先读取的配置文件。默认的配置文件有下列几个:
     /etc/profile:这个文件设定了几个重要变量,例如PATH,USER,MAIL,HOSTNAME,HISTIZE,umask等,也同时规划出/etc/inputrc这个针对键盘热键设定的文件数据内容。您可以在这里设定总体的PATH等信息。同时这个 文件还规划出/etc/profile.d及/etc/inputrc这两个文件,其中,inputrc作用于history(历史指令)。修改这个文件时需要小心,因为所有的用户都会用到这个文件的信息。此外,最好将HISTIZE改为比较小的一个值,这样安全些。
    /etc/bashrc:这个文件用于规划humask,同时规划提示符的内容。这个文件在各个不同版本的Linux里摆放的位置不一样,所以需要查询。
   /etc/man.config:这个文件或许根bash shell没有太大相关性,但是对于系统管理员来说,确实很重要的一个文件!这个文件的内容规范了使用man时man page的路径到哪里寻找。当自己安装程序时,可能需要手动将程序的manual路径放到/etc/man.config中,否则man不能找到相关的说明文档.

  个人的自定义设置在个人目录下的几个隐藏文件中,分别会用到下面的几个文件(注意,下面的文件都是隐藏文档,需要使用ls -al才能都显示出来)。

    ~/.bash_profile:里面定义了个人路径(PATH)与环境变量的文件名称。您可以修改您的个人路径,当然,也可以在          .bashrc这个个人设定变量文件中修改。有的时候可以使用~/.profile或者~/.bash_login等文件在取代这个文件
    ~/.bashrc:这个文件对于个人喜好的bash设定是最重要的,因为我都是在这里设定我的个人变量,例如命令别名的设定,路径的重新定义等。
     ~/.bash_history:这个文件用于将您曾经用过的命令记录下来,而当您再次以上下键搜寻或者直径以history搜寻时,就可以找到曾经用过的指令。需要注意的是:
在这一次执行过程中用到的指令,将在您推出shell之后才会被记录到这个文件中,否则将先被写到高速缓存中;
可以通过history指令将其中的记录搜寻出来
这个文件的指令记录笔数与HISTIZE有关,您可以自行在~/.bashrc中设定,或者直接由root在/etc/profile中设定。
     ~/.bash_logout:这个文件则是在您注销shell的时候BASH为您所做的事情。通常默认是只有清除屏幕这件事,不过,您也可以将一些备份或其他您认为重要的工作的写在这个文件中(例如清空暂存空间),那么当您退出出Linux时,就可以解决一些烦人的事情。
      当修改完个人文件后,配置不能生效,需要使用source 变量配置文件来使配置生效。这样就不用每次重新登录了。

  source 直接读入变量配置文件,既将当前的文件内容读入,不需要重新注销后登陆.

4.2.4.4 通配符与特殊符号

   ?,匹配任意单个字符。

   *,匹配任意字符串。

  [set],匹配set中的任意字符。[!set]是取反操作,匹配不在set中的任意字符,如:


     [a-z]          匹配所有小写字符

     [0-9]          匹配所有数字

     [akz]          匹配a,k,z三个字符

     [.,;]          匹配句点,逗号和分号

     [!abc]         匹配除a,b,c之外的所有字符

     ` `            两个`中间的为先执行的指令
  
    连续输入指令的方式:

   指令间用分号";",command1;command2 意思是不论command1执行结果为何,command2都会被执行
  
   指令间用"&&",command1&&command2 意思是command1成功执行,command2才会被执行

   指令间用"||",command1||command2 意思是command1执行失败,command2才会被执行

4.2.4.5 绝对路径和相对路径

4.2.4.6 命令重定向

   什么是重定向(redirect),就是把你目前的所得数据转到其他地方.

 I/O概念:

  a、 I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9;
 
  b、 常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、 

monitor、monitor有关;

  c、 用 < 来改变读进的数据信道(stdin),使之从指定的档案读进;

  d、 用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;

  e、 0 是 < 的默认值,因此 < 与 0<是一样的;同理,> 与 1> 是一样的;

  f、 在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;

 基本IO

cmd > file 把 stdout 重定向到 file 文件中;

cmd >> file 把 stdout 重定向到 file 文件中(追加);

cmd 1> fiel 把 stdout 重定向到 file 文件中;

cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;

cmd 2> file 把 stderr 重定向到 file 文件中;

cmd 2>> file 把 stderr 重定向到 file 文件中(追加);

cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加);

cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;

cat <>file 以读写的方式打开 file;

cmd < file cmd 命令以 file 文件作为 stdin;

cmd << delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符。


/dev/null  垃圾设备.收集垃圾

4.2.4.7   管线命令

管线命令"|"仅能处理经由前一个指令传来的正确信息,也就是标准输出信息,对于标准错误信息并没有直接处理能力。


4.2.4.7.1 cut
#cut -d '分隔字符' -f fields

参数

-d: 后面接分隔字符,与-f一起使用

-f: 依据-d的分隔字符将一段信息分割成为数据,用-f取取第几段的意思

-c: 以字符(characters)的单位取出固定字符的区间

eg:
cat /etc/passwd|cut -d ":" -f 1

cat /etc/passwd|cut -c1-20


4.2.4.7.2 sort

 sort命令的功能是对文件中的各行进行排序

  Sort [选项] 文件

说明:Sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用"- ",则表示排序内容来自标准输入。

Sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。缺省情况下以整行为关键字按ASCII字符顺序进行排序。

改变缺省设置的选项主要有:
 
- u 对排序后认为相同的行只留其中一行。
 
- f 将小写字母与大写字母同等对待。

- r 按逆序输出排序结果。

+posl - pos2 指定一个或几个字段作为排序关键字,字段位置从posl开始,到pos2为止(包括posl,不包括pos2)。如不指定pos2,则关键字为从posl到行尾。字段和字符的位置从0开始。

- b 在每行中寻找排序关键字时忽略前导的空白(空格和制表符)。

- t separator 指定字符separator作为字段分隔符。

eg: cat /etc/passwd|sort -t: +2n
将个人帐号以用户ID排序,(以:为分隔符,第三个为ID,但第一个代号为0,即ID的代号为2)


4.2.4.7.3 wc
wc    计算文件内容的一个工具

参数说明:
-l 多少行
-m 多少字符
-w 多少字(一个字包括多个字符)

eg:cat /etc/passwd|wc -l

这个文件里有多少行

cat /etc/passwd|wc -w

这个文件有多少字

4.2.4.7.3 uniq
uniq   删除重复的行只取一个

tee   使用tee,数据会同时现在屏幕上和文件中
eg:last |tee last.list

last命令的结果同时会出现在屏幕上和last.list文件中

4.2.4.7.4 tr
tr     替换文本
tr [-ds] SET1

-d 删除SET1这个字符串
-s 取代重复的字符

eg:last |tr '[a-z]' '[A-Z]'
将小写改成大写

cat /etc/passwd |tr -d :
将/etc/passwd中的:符号才删除

4.2.4.7.5 split
split  分割文件

split [-bl] 输入文件 输出文件前导字符

-b  以文件size来分
-l  以文件行数来分

eg:split -l 5 /etc/passwd test

会产生testa,testb,tesc等文件.


4.3 压缩指令与正规表示法

4.3.1 压缩指令

4.3.1.1  compress

   解压:uncompress FileName.Z 或compress -d FileName.Z
  压缩:compress FileName

  以compress压缩后,不带其它参数,那么原始文件会被后来的*.Z文件取代

4.3.1.2 bzip2,bzcat

  压缩:bzip2 -z FileName
  解压缩:bzip2 -d FileName.bz2 或bunzip2 FileName.bz2
  读取文件数据: bzcat FileName.bz2(不会解压缩)
 
  以.bz,.bz2,.tbz,.tbz2为后缀的文件都可以用bzip2解压

4.3.1.3 gzip,zcat

 压缩:gzip [-#] FileName -----#为数字,指压缩等级,1最不好,9为最好,6为默认值
 解压缩:gzip -d FileName.gz 或gunzip  FileName.gz
 读取文件数据:zcat FileName.gz(不会解压缩)

4.3.1.4 tar

 tar [-cxtzjvfpPN] 文件与目录 ....
参数:
-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!
因为不可能同时压缩与解压缩。
-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
   例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成
   『 tar -zcvPf tfile sfile』才对喔!
-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
--exclude FILE:在压缩的过程中,不要将 FILE 打包!

eg:
范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc<==仅打包,不压缩!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc<==打包后,以 gzip 压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc<==打包后,以 bzip2 压缩
# 特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。
# 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~
# 如果加 j 参数,则以 .tar.bz2 来作为附档名啊~
# 上述指令在执行的时候,会显示一个警告讯息:
# 『tar: Removing leading `/" from member names』那是关於绝对路径的特殊设定。

范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
# 由於我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时,
# 就得要加上 z 这个参数了!这很重要的!

范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
# 在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说,
# 我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,
# 则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc
# 则会发现,该目录下的文件属性与 /etc/ 可能会有所不同喔!

范例四:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -cvf - /etc | tar -xvf -
# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!

4.3.1.4 cpio

cpio 命令
[root@linux ~]# cpio -covB > [file|device] <==备份
[root@linux ~]# cpio -icduv < [file|device] <==还原
参数:
-o :将资料 copy 输出到文件或装置上
-i :将资料自文件或装置 copy 出来系统当中
-t :查看 cpio 建立的文件或装置的内容
-c :一种较新的 portable format 方式储存
-v :让储存的过程中文件名称可以在萤幕上显示
-B :让预设的 Blocks 可以增加至 5120 bytes ,预设是 512 bytes !
   这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念)
-d :自动建立目录!由於 cpio 的内容可能不是在同一个目录内,
如此的话在反备份的过程会有问题! 这个时候加上 -d 的话,
就可以自动的将需要的目录建立起来了!
-u :自动的将较新的文件覆盖较旧的文件!

范例:
范例一:将所有系统上的资料通通写入磁带机内!
[root@linux ~]# find / -print | cpio -covB > /dev/st0
# 一般来说,使用 SCSI 介面的磁带机,代号是 /dev/st0 喔!
范例二:检查磁带机上面有什么文件?
[root@linux ~]# cpio -icdvt < /dev/st0
[root@linux ~]# cpio -icdvt < /dev/st0 > /tmp/content
# 第一个动作当中,会将磁带机内的档名列出到萤幕上面,而我们可以透过第二个动作,
# 将所有的档名通通纪录到 /tmp/content 文件去!

范例三:将磁带上的资料还原回来~
[root@linux ~]# cpio -icduv < /dev/st0
# 一般来说,使用 SCSI 介面的磁带机,代号是 /dev/st0 喔!

范例四:将 /etc 底下的所有『文件』都备份到 /root/etc.cpio 中!
[root@linux ~]# find /etc -type f | cpio -o > /root/etc.cpio
# 这样就能够备份啰~您也可以将资料以 cpio -i < /root/etc.cpio
# 来将资料捉出来!!!!


4.3.2 正规表示法

grep

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被

看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

^

锚定行的开始 如:'^grep'匹配所有以grep开头的行。

$

锚定行的结束 如:'grep$'匹配所有以grep结尾的行。

匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。

*

匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。

[]

匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。

[^]

匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

\(..\)

标记匹配字符,如'\(love\)',love被标记为1。

\<

锚定单词的开始,如:'\\>

锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。

x\{m\}

重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。

x\{m,\}

重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。

x\{m,n\}

重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。

\w

匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。

\W

\w的反置形式,匹配一个或多个非单词字符,如点号句号等。

\b

单词锁定符,如: '\bgrepb\'只匹配grep。


4.4  学习使用SHell scripts

4.4.1 为什么学习脚本

4.4.2 脚本的执行

   1.将文件改为可以执行的属性即x属性,然后执行改文件
   2.文件后缀名为.sh,用sh来执行

   "和'最大的不同在于能不能保存变量内容,单引号里的内容都将变成单纯的字体,而不是特殊的字体.

4.4.3 卷标与运算符declare

   不定义变量,那么该变量是呈现字符串的形式,所以任何变量都是字符串

  number1=2*3+5*13-32+25
 declare number2=2*3+5*13-32+25

在最后输出结果时,$number1为2*3+5*13-32+25,而number2为64

4.4.4 交互式脚本

  最简单的交互式指令是read指令,read功能就是将键盘上输入的内容放到变量中.

  eg:[root@test test]# read name
     VBird
     [root@test test]# echo $name
     VBird

 怎么样定义脚本的参数代号
     [root@test test]myscript. opt1 opt2 opt3 opt4
                       $0      $1   $2   $3   $4
  从上面的例子可以看出,只要变量名称为$0,就表示为myscript也就是说 :

  $0:myscript. 亦即脚本的文件名
  $1:opt1,亦即第一个附加参数
  $2:opt2,
  $3:opt3

  eg:
 root@wwwvbird_shells]# cat parm.sh
#!/bin/bash
echo "This script's nmae => $0"
echo "parameters $1 $2 $3"

[root@www vbird_shells]# sh parm.sh hello1 hello2 hello3
This script's nmae => parm.sh
parameters hello1 hello2 hello3

4.4.5 脚本逻辑判断式与表达式

  逻辑判断式:
关于文件目录:
-f      常用!检测文件是否存在
-d      常用!检测目录是否存在
-b      检测是否为一个block文件
-c      检测是否为一个character文件
-S      检测是否为一个socket标签文件
-L      检测是否为一个符号链接文件
-e      检测某个东西是否存在!可以是任何东西.

关于程序
-G      检测是否由GID所执行的程序拥有
-O      检测是否由UID所执行的程序拥有
-p      检测是否为程序间传送信息的name pipe 或FIFO

关于文件的属性的检测
-r      是否为可读
-w      是否为可写
-x      是否为可执行
-s      是否为非空白文件
-u      是否具有SUID属性
-g      是否具有SGID属性
-k      是否具有sticky bit 属性

两个文件之间的判断比较
-nt    第一个文件比第二个文件新
-ot    第一个文件比第二个文件旧
-ef    第一个文件与第二个文件为同一个文件(如链接文件)

与或非
&&     逻辑与
||     逻辑或

运算符:
=      等于
!=     不等于
<      小于
>      大于
-eq    等于
-ne    不等于
-lt    小于
-gt    大于
-le    小于或等于
-ge    大于或等于
-a     双方都成立(and)
-o     单方成立(or)
-z     空字符串
-n     非空字符串

4.4.6 条件判断

4.4.6.1 if then fi

if [ 条件一 ] &&(||) [ 条件二 ]; then
elif [ 条件三 ] &&(||) [ 条件四 ]; then

else
fi

这里有强调的是
1.在[]中。只能有一个判断式
2.在[]和[]中,可以使用&&或||结合判断式
3.每一个独立的组件之间需要用空格键隔开


4.4.6.2 case .. esac

语法:
case 种类方式(string) in
      种类式一)
            程序执行段
            ;;
      种类式二)
            程序执行段
            ;;
        *)
          echo "Usage: {种类方式一|种类方式二}"
          exit 1
esac

种类方式(string)的格式有两种:

     直接输入与交互式(先read 变量名,在用$变量名)

4.4.6.3 循环

for:
for((条件1;条件2;条件3))

eg:
[root@www vbird_shells]# cat for.sh
#!/bin/bash

declare -i s
for ((i=1; i<=100;i=i+1))
do
        s=s+i
done
echo "The count is ====> $s"


for variable in variable1 variable2 ...

root@wwwvbird_shells]# cat foruser.sh
#!/bin/bash

account=`cut -d ":" -f1 /etc/passwd |sort`
echo "The following is your linux server's account "
for i in $account
do
        echo $i
done


while:
[root@www vbird_shells]# cat while.sh
#!/bin/bash

declare -i i
declare -i s
while [ "$i" != "101" ]
do
        s=s+i
        i=i+1
done
echo "The count is ====> $s"

until:
[root@www vbird_shells]# cat unitl.sh
#!/bin/bash

echo "Press Y/y to stop"
until [ "$yn" = "Y" ] || [ "$yn" = "y" ]
do
        read yn
done

4.4.6.3  调试脚本

#sh [-nvx] scripts
-n :不执行脚本,查询脚本内的语法,若有错则列出
-v :在执行脚本之前,先将脚本的内容输出在屏幕上
-x :将用到的脚本内容显示在屏幕上,与-v稍有不同.

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 


    

 

 

 


 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2009-01-09  
    123
45678910
11121314151617
18192021222324
25262728293031

数据统计

  • 访问量: 320
  • 日志数: 7
  • 建立时间: 2008-09-16
  • 更新时间: 2008-10-23

RSS订阅

Open Toolbar