感谢支持
我们一直在努力

Linux操作系统学习笔记

第一次接触Linux操作系统,只是知道一些简单的命令,当工作中再次用到时,不得不又重新温故那些知识并做系统的学习,现在将以学习笔记的形式记录,分享一些简单知识和个人拙见,如有错误,欢迎指出。

     基本知识:

    Linux中磁盘分区表示:

    如:/dev/hda5 :/dev/目录是存放硬件设备文件,hd表示IDE设备,sd表示SCSI设备,a表示硬盘的顺序号,即第一块硬盘是a,第二块是b…等,就像windows下的C盘D盘一样,5表示第一个逻辑分区。Linux分区由主分区和扩展分区组成,主分区不超过4个,逻辑分区是在扩展分区中划分的所以逻辑分区从5开始,不管主分区是否满4个分区,反正前4块是划给主分区的。

    同样,一个SCSI设备第二块硬盘的第二块逻辑分区的表示方法为:/dev/sdb6

    文件系统类型:

    Linux中默认使用的文件系统类型是EXT3(EXT4),SWAP,同时也支持其他文件系统类型,如FAT16、FAT32、NTFS、XFS等。

    目录结构:

    最顶层:根目录(/),根目录下几个重要的目录有:/root,/bin,/boot,/etc,/home,/var,/usr,/tmp…..(每个目录存放什么内容很重要)

    图形、字符操作界面的切换:

    图形界面——>字符终端:Ctrl+Alt+Fn   (n取值1~6,之后的笔记中会介绍为什么)

    字符终端——>字符终端:Alt+Fn

    字符终端——>图形界面:Alt+F8

登录后,若是root用户,则提示符为“#”,若是普通用户,则提示符是“$”

     关机及重启命令:

    重启:shutdown -r now

          shutdown -r +15 “警告:系统将于15分钟后重启”

          reboot命令也表示是重启,但是与shutdown的区别是它是强制性重启,而shutdown命令会提示用户保存,所以建议使用shutdown命令。

    关机:shutdown -h now   或    halt

    开始执行一些简单的命令:

    注意Linux中大小写是敏感的,这点与windows不同,windows中的powershell无论是命令还是函数方法等都不区分大小写。

 

[www.linuxidc.com@localhost ~]$ su - root    切换到root用户
口令:
[root@localhost ~]#     切换到root后提示符为#
[root@localhost ~]# date   显示日期与时间
2013年 03月 05日 星期二 21:09:09 CST
[root@localhost ~]# echo $LANG   显示目前支持的语言
zh_CN.UTF-8
[root@localhost ~]# LANG=en_US   设置语言
[root@localhost ~]# echo $LANG
en_US
[root@localhost ~]# cal   查看当前月日历
     March 2013      
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[root@localhost ~]# bc    打开计算器
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
4*3
12
quit     按quit键离开
[root@localhost ~]# 

   另外掌握一些常用的热键有助于提高命令速度,如Tab(自动填充,并且在什么命令都没有的情况下,按两次TAB键会出现所有的命令,这也可以作为一个帮助吧。);Ctrl+C :中断目前运行程序;Ctrl+D:键盘输入结束,同Exit;Ctrl+L:清屏;Ctrl+U  清空至行首;Ctrl+K:清空至行尾;“\”:强制换行。

    Linux命令帮助:

    刚才说的在未打任何命令的情况下按两次TAB键会显示所有可用的命令,这种方法不常用,常用的方法是help ,用法是 :命令  –help ,常用的是man帮助(即手册manual),用法是:man  命令,还有一种帮助方法是info ,用法是info 命令,其实这种不太常用,因为正常情况下man已经可以解决绝大部分问题了。

    另外由于使用man或者是info命令时,会出现多个页面,有时候多的不想看,这时候按q退出帮助,而且由于现实的信息很多,您如何快速找到自己想要的呢,这时,输入“/您想要查找的字符”,按enter即可

    你可以查看一个命令的作用:whatis  命令

    你也可以查看一个命令是存放在哪的:which 命令(除cd,因为cd是内置在内核中的)

    切换执行等级:

    查看运行级别:runlevel

    level 0:关机(关机可用命令 init  0,init进程在后面的笔记会介绍)

    level 3:纯命令行模式,即我们在图形界面右键打开的终端字符模式

    level 5:图形界面模式(作为服务器的话,基本不启用这个级别,直接进入level 3字符模式)

    level 6:重启(重启可用命令 init  6)

   1级别表示单用户模式,2级别表示字符界面多用户模式,4级别未分配使用,这3个级别基本不使用。所以只要知道上述4种级别即可。具体的启动进程和配置文件会在后续笔记中体现。

     Linux命令的分类:

     (Linux命令:用于实现某一功能的指令或程序,命令的执行依赖于解释器程序,如/bin/bash)

      内部命令:属于Shell解释器的一部分(可理解为bin/下包含的命令)

      外部命令:独立于Shell解释器之外的程序(即不需要/bin/bash也可执行,如Vim、LVM)

     Linux命令的格式:

     命令字  [选项] [参数]         选项:用于调节命令的具体功能   参数:命令操作的对象,如文件、目录等。多个段格式的选项可以写在一起而只是用一个“-”来连接。

   最后我觉得要弄清楚的一个问题是linux shell,其实shell就是Kernel和user之间的一个接口,用户不会直接和内核打交道��但是用户输入的命令又会被内核识别,这就是shell的作用。

更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2015-03/114334p2.htm

文件和目录管理 及 VI编辑器的使用

    文件和目录管理,刚开始学这块的时候感觉内容很多很杂,但是学完进行总结后,发现其实很有条理的而且没什么难度,只是熟练掌握这些常用的命令就行了。至于Vim编辑器,不得不说,用了这个编辑器之后,感觉Windows的notepad很没有技术含量了。

  先简单总结一下文件和目录常用到的命令,简单的用法就略过。

     文件操作命令:touch、file、which、find、cp、rm、mv、ln

     文件内容操作命令:cat、more、less,head、tail,wc、grep

     目录操作命令:pwd、cd、ls、mkdir、du

     归档及压缩命令:gzip、bzip2、tar

[linuxidc@localhost ~]$ pwd  ==>显示当前目录
/home/linuxidc
[jzhou@localhost ~]$ mkdir dirtest   ==>创建一个目录
[linuxidc@localhost ~]$ cd dirtest      ==>进入这个目录
[linuxidc@localhost dirtest]$ touch testfile    ==>创建一个文件
[linuxidc@localhost dirtest]$ mkdir dirtest1    ==>创建子目录
[linuxidc@localhost dirtest]$ ls    ==>列出当前目录内容
dirtest1  testfile
[linuxidc@localhost dirtest]$ echo hello linux >>testfile  ==>追加内容到文件
[linuxidc@localhost dirtest]$ cat testfile    ==>显示文件内容
hello linux
[linuxidc@localhost dirtest]$ file testfile  ==>查看文件类型
testfile: ASCII text
[linuxidc@localhost dirtest]$ du -sh testfile  ==>显示文件所占空间
8.0K    testfile
[linuxidc@localhost dirtest]$ wc testfile  ==>统计文件行数、字数、字符数
 1  2 12 testfile
[linuxidc@localhost dirtest]$ echo haha,I love Linux >> testfile   ==>追加内容
[linuxidc@localhost dirtest]$ echo no,no ,I hate C plus plus >> testfile
[linuxidc@localhost dirtest]$ echo OK,the end >> testfile
[linuxidc@localhost dirtest]$ cat testfile   ==>查看内容
hello linux
haha,I love Linux
no,no ,I hate C plus plus
OK,the end
[linuxidc@localhost dirtest]$ head -2 testfile  ==>查看文件前两行内容
hello linux
haha,I love Linux
[linuxidc@localhost dirtest]$ tail -2 testfile  ==>查看文件最后两行内容
no,no ,I hate C plus plus
OK,the end
[linuxidc@localhost dirtest]$ cat testfile | grep "Linux"  查找特定关键字
haha,I love Linux
[linuxidc@localhost dirtest]$ 

以上只是展示部分命令的简单用法,很多选项没有加入,head和tail命令默认是显示前10行和后10行记录,du是查看目录或文件所占的空间,通常比实际大小要大,且通常为4的整数倍。

more和less命令也是查看文件内容的方法,不过less已经渐渐取代more了,因为more的所有功能less都具有,而且less可以向上翻页查看,more则不可以,cat是直接将文件内容一屏显示出来,不管多长,所有如果文件很长时,则使用less命令,同样,也是按q键退出。

[linuxidc@localhost dirtest]$ cd dirtest1    ==>进入到刚才建的子目录
[linuxidc@localhost dirtest1]$ touch testfile1   ==>在子目录中创建一个新文件
[linuxidc@localhost dirtest1]$ echo haha >> testfile1
[linuxidc@localhost dirtest1]$ cd .. ==>返回到上一目录
[linuxidc@localhost dirtest]$ ls 
dirtest1  testfile
[linuxidc@localhost dirtest]$ cp testfile ./dirtest1/ ==>把文件testfile复制到子目录dirtest1下
[linuxidc@localhost dirtest]$ cd dirtest1/   ==>进入到子目录
[linuxidc@localhost dirtest1]$ ls   ==>查看子目录下多了一个刚才复制过来的文件
testfile  testfile1
[linuxidc@localhost dirtest1]$ cd ..
[linuxidc@localhost dirtest]$ ls
dirtest1  testfile
[linuxidc@localhost dirtest]$ rm -f testfile ==>强制删除dirtest目录下的testfile文件
[linuxidc@localhost dirtest]$ ls  ==>testfile文件已经被删除
dirtest1
[linuxidc@localhost dirtest]$ cd ./dirtest1/   ==>进入到子目录
[linuxidc@localhost dirtest1]$ mv testfile ./testfile  ==>这里我尝试移动的目标目录错误
testfile   testfile1  
[linuxidc@localhost dirtest1]$ pwd   ==>所以我要查看当前目录,以使用绝对路径
/home/linuxidc/dirtest/dirtest1
[linuxidc@localhost dirtest1]$ mv testfile /home/linuxidc/dirtest/==>将testfile文件移到dirtest目录下
[linuxidc@localhost dirtest1]$ cd ..
[linuxidc@localhost dirtest]$ ls   ==>很好,testfile文件已经被移动过来了
dirtest1  testfile
[linuxidc@localhost dirtest]$ ln -s testfile linkfile  ==>建立软链接
[linuxidc@localhost dirtest]$ ls -l   ==>注意下面软链接文件的显示方式
总计 20
drwxrwxr-x 2 linuxidc jzhou 4096 03-05 22:43 dirtest1
lrwxrwxrwx 1 linuxidc jzhou    8 03-05 22:45 linkfile -> testfile
-rw-rw-r-- 1 linuxidc jzhou   67 03-05 22:40 testfile
[linuxidc@localhost dirtest]$ 

rm 文件作用在文件与目录的唯一区别就是是否带有-r选项,因为删除目录时,目录里面可能嵌套有文件和目录,所以必须要有-r选项,cp和rm的格式都是: cp/rm  原文件   目标文件(注意这里的路径问题)

ln链接文件:分为软链接和硬链接,软链接又称符号链接,即带有-s选项。软链接即相当于windows下的快捷方式,若原文件损坏,则快捷方式无效,而硬链接则相当于对原文件的一个拷贝,通常情况,硬链接用的很少。所以建立链接文件时,通常加-s选项即建立软链接。链接文件的文件类型位为:l,后续笔记文件权限中会介绍这个位。

  另外要注意的是:不能为目录建立硬链接文件,而且硬链接与原始文件必须位于同一分区(文件系统)中。

[linuxidc@localhost ~]$ cd dirtest/
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  testfile
[linuxidc@localhost dirtest]$ tar cf test.tar dirtest1 testfile  ==>归档目录和文件
[linuxidc@localhost dirtest]$ ls  ==>多了一个刚新建的归档文件test.tar
dirtest1  linkfile  testfile  test.tar
[linuxidc@localhost dirtest]$ rm -rf dirtest1 testfile   ==>删除原文件,方便后面确认文件是否归档
[linuxidc@localhost dirtest]$ ls
linkfile  test.tar
[linuxidc@localhost dirtest]$ pwd  ==>查看一下当前目录,后面要解归档在这个目录
/home/linuxidc/dirtest
[linuxidc@localhost dirtest]$ tar xf test.tar -C /home/linuxidc/dirtest/   ==>解开归档,testfile文件释放了
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  testfile  test.tar
[linuxidc@localhost dirtest]$ rm -f test.tar  ==>删除这个归档包,助于后面测试
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  testfile
[linuxidc@localhost dirtest]$ gzip -9 testfile   ==>将这个文件以gz格式压缩
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  testfile.gz ==>这个就是压缩后自动生成的文件名
[linuxidc@localhost dirtest]$ gzip -d testfile.gz   ==>将刚压缩的包解开
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  testfile    ==>看,testfile被解压出来了
[linuxidc@localhost dirtest]$ bzip2 -9 testfile    ==>将这个文件以bz2格式压缩
[linuxidc@localhost dirtest]$ ls 
dirtest1  linkfile  testfile.bz2  ==>看,这个bz2就是刚生成的
[linuxidc@localhost dirtest]$ bzip2 -d testfile.bz2   ==>解开这个压缩包
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  testfile  ==>看,它被释放出来了
[linuxidc@localhost dirtest]$ tar jcf test.tar.bz2 testfile   ==>这个是bz2格式归档压缩,注意选项是j
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  testfile  test.tar.bz2
[linuxidc@localhost dirtest]$ rm -r testfile
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  test.tar.bz2
[linuxidc@localhost dirtest]$ tar jxf test.tar.bz2 -C /home/linuxidc/dirtest/  ==>解开归档压缩
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  testfile  test.tar.bz2
[linuxidc@localhost dirtest]$ tar zcf test.tar.gz dirtest1   ==>这个是gz格式归档压缩,注意选项是z
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  testfile  test.tar.bz2  test.tar.gz
[linuxidc@localhost dirtest]$ rm -rf dirtest1
[linuxidc@localhost dirtest]$ ls
linkfile  testfile  test.tar.bz2  test.tar.gz
[linuxidc@localhost dirtest]$ tar zxf test.tar.gz -C /home/linuxidc/dirtest/   ==>解开归档压缩
[linuxidc@localhost dirtest]$ ls
dirtest1  linkfile  testfile  test.tar.bz2  test.tar.gz
[linuxidc@localhost dirtest]$ 

上面命令显示格式不太友好,因为在真实环境下,若删除原文件,软链接文件会处于不可用状态背景会变成红底。不过这个不影响理解呵呵。

  注意归档只是将文件或者目录打在一个包里,并不进行压缩,而gzip和bzip2是进行压缩,上述最后几行命令是将二者结合起来使用的,即先归档后压缩。

  tar和gzip  bzip2的命令格式如下: 

                 tar  [选项]…  归档文件名  源文件或目录    ==》制作归档文件

              tar  [选项]…  归档文件名  [-C 目标目录]   ==》解开归档文件

              gzip/bzip2 [-9] 文件名或目录                 ==》制作压缩文件

              gzip/bzip2  -d .gz/.bz2格式的压缩文件    ==》解开压缩文件

     对于上述命令,只是举出最简单的用法,至于要实现更强大的功能,使用时那就要去查每个命令带有哪些选项,或者直接找man命令帮助,那些选项太多,所以我认为只要知道有某个命令,至于具体用法用到时再去查而没必要记住所有的选项含义。

 

                                                       VIM编辑器的常用快捷编辑方式

    文本编辑器可用来创建或修改文本文件,以及维护Linux系统中的各种配置文件。首次接触这个编辑器时会由于不熟练而是影响编辑效率,但是掌握常用快捷键后,非常神速。下面只是简单介绍下Vim编辑器,至于更深入的用法大家可以网上找找。

     Unix和早期的Linux中默认使用的文本编辑器是Vi,现在用的都是vi的增强版vim,由于vi用的比较习惯了,所以现在仍然叫vi,其实是别名 alias vi=’/usr/bin/vim’,这个可以通过命令which vi看到。

     Vim编辑器有3种工作模式:命令模式、输入模式、末行模式,在有的资料中可能说有2中工作模式,不将‘末行模式’列在其中,这个不重要,总之前两种模式确实很重要;因为在这两种模式下可以做很多事。各种模式之间的切换如下图:

     

       这几个模式的转换也要非常熟练。

   命令模式中的基本操作:

   (1)显示行号::set nu     取消行号: :set nonu

       (2)行间快速跳转:#G:跳转到文件中的第#行;G:跳转到文件的末尾行;1G或gg:跳转到文件的行首。

     (3)行内快速跳转:Home  End

   关于删除复制和粘贴:(命令模式下)

删除

x或Del

删除光标处的单个字符

dd

删除当前光标所在行

#dd

删除从光标处开始的#行内容

d^

删除当前光标之前到行首的所有字符

d$

删除当前光标处到行尾的所有字符

复制

yy

复制当前行整行的内容到剪贴板

#yy

复制从光标处开始的#行内容

粘贴

p

将缓冲区中的内容粘贴到光标位置处之后

P

粘贴到光标位置处之前

 在文件内容中查找:

操作键

功能

/word

从上而下在文件中查找字符串“word”

?word

从下而上在文件中查找字符串“word”

n

定位下一个匹配的被查找字符串

N

定位上一个匹配的被查找字符串

   撤销编辑及保存退出:

u

按一次取消最近的一次操作

多次重复按u键,恢复已进行的多步操作

U

用于取消对当前行所做的所有编辑

ZZ

保存当前的文件内容并退出vi编辑器

    保存文件及退出vi编辑器:(末行模式下)

保存文件

   

:w /root/newfile

另存为其它文件

退出vi

:q

未修改退出

:q!

放弃对文件内容的修改,并退出vi

保存文件退出vi

:wq

 

    文件内容替换:(末行模式下)

:s /old/new

将当前行中查找到的第一个字符“old” 串替换为“new”

:s /old/new/g

将当前行中查找到的所有字符串“old” 替换为“new”

:#,# s/old/new/g

在行号“#,#”范围内替换所有的字符串“old”为“new”

:% s/old/new/g

在整个文件范围内替换所有的字符串“old”为“new”

:s /old/new/c

在替换命令末尾加入c命令,将对每个替换动作提示用户进行确认

要想熟练操作Vim编辑器,首先得掌握这些快捷键,这些都是最基本的。

如有错误,欢迎指正,3Q!

文件及目录的权限管理

  上篇简单介绍了下文件和目录的一些简单的操作,接下来介绍用户和文件权限的管理。首先了解用户和组账号的配置文件,然后是管理用户和组账号,最后要会设置文件和目录权限和归属。

     Linux基于用户身份对资源访问进行控制。用户账号分为超级用户root(相当于windows下的Administrator),然后是普通用户。Linux中是不建议使用root登录系统执行管理任务的,因为这很不安全。要是误删了系统中某个重要的文件,那就玩完了。

     用户账号文件——passwd

  用于保存用户的账号的基本信息,文件位置:/etc/passwd,每一行对应一个用户的账号记录,下面是取出最后两行记录的账号信息,然后来分析它每个字段的含义(字段之间用冒号分隔)。

   

    字段1  linuxidc:用户账号的名字;

  字段2  x :密码占位符

  字段3  500:用户账号的UID号(RedHat和CentOS中默认从500开始)

  字段4  500:用户所属主账号的GID号(也是默认从500开始)

  字段5 zhoujie:用户全名

  字段6  /home/linuxidc :用户的宿主目录,即家目录

  字段7  /bin/bash :登录shell信息

  基于系统运行和管理需要,所有用户都可以访问passwd文件中的内容,但只有root用户才能更改

  用户密码文件——shadow

  用于保存密码串、密码有效期等信息,文件位置:/etc/shadow,每一行对应一个用户的密码记录。下面列出最后两行记录并解释每个字段的含义: 

   

  字段1 :用户账号的名称

  字段2 :加密的密码字串信息(采用MD5加密)

  字段3 :上次修改密码的时间

    字段4:密码的最短有效天数,默认值为 0

  字段5:密码的最长有效天数,默认值为 99999

  字段6:提前多少天警告用户口令将要过期,默认值为 7

  字段7:在密码过期后多少天禁用此用户(默认为空)

  字段8:账号失效时间(默认为空)    

  字段9 :保留字段(未使用)

   默认只要root用户能够读取该文件中的内容,并且不允许root直接编辑该文件中的内容。那么添加用户时如何来指定选项以实现这些功能呢?下面将简单介绍如何添加用户、组。

  添加用户账号——useradd 

 

   用户账号的初始配置文件

  文件来源——新建用户账号时,从/etc/skel目录中复制而来

    主要的用户初始配置文件有 :

        ~/.bash_profile:用户每次登录时执行
     ~/.bashrc:每次进入新的Bash环境时执行,默认设置了一些命令的别名
       ~/.bash_logout:用户每次退出登录时执行
 可通过cat命令查看上述文件的内容。
     设置/更改用户口令——passwd

     一般我不会也没有必要解释每个命令的带的参数,但是passwd我会介绍它的参数含义及用法,因为我觉得在系统维护中会常用到。

[linuxidc@localhost ~]$ su - root
口令:
[root@localhost ~]# passwd -l linuxidc ==>锁定用户linuxidc的账号
Locking password for user linuxidc.
passwd: Success
[root@localhost ~]# passwd -S linuxidc  ==>查看用户状态
linuxidc LK 2013-02-03 0 99999 7 -1 (Password locked.)  ==>为锁定状态
[root@localhost ~]# tail -2 /etc/shadow  ==>账号锁定后,有木有发现密码位前面多了两个!!,表示密码不可用
linuxidc:!!$1$XRmjIBM9$SgXA00pPfvhjvxt/9..Lh.:15739:0:99999:7:::
user1:!!:15771:0:99999:7:::
[root@localhost ~]# passwd -u linuxidc  ==>为账号linuxidc解锁
Unlocking password for user linuxidc.   ==>已被成功解锁
passwd: Success.
[root@localhost ~]# passwd -S linuxidc   ==>再次查看用户状态
linuxidc PS 2013-02-03 0 99999 7 -1 (Password set, MD5 crypt.)
[root@localhost ~]# tail -2 /etc/shadow  ==>观察密码位变化,没有了两个!!,表示密码可用
linuxidc:$1$XRmjIBM9$SgXA00pPfvhjvxt/9..Lh.:15739:0:99999:7:::
user1:!!:15771:0:99999:7:::
[root@localhost ~]# passwd -d linuxidc  ==>清楚用户linuxidc的密码
Removing password for user linuxidc.  ==>密码已被成功清除
passwd: Success
[root@localhost ~]# tail -2 /etc/shadow ==>查看密码位有什么变化
linuxidc::15771:0:99999:7:::  ==>密码位变空了。。。
user1:!!:15771:0:99999:7:::
[root@localhost ~]# passwd linuxidc   ==>为用户重新设定密码
Changing password for user linuxidc.
New UNIX password: 
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.  ==>OK,密码已经设置成功了
[root@localhost ~]# 

注意,“未设置密码”的用户账号尚未完成初始化,处于不可登录状态,与“空密码”的情况不同,普通用户可以使用passwd命令,但只能更改自己的密码。另外,被锁定的账号也不能登录系统。

  修改用户账号的属性——usermod

     它的命令有几个功能和passwd是一样的,比如L和U参数就是锁定和解锁账户的,不过要大写。其他选项和useradd的中的一样,就是更改uid,gid等。

  删除用户账号——userdel
      删除账号时直接用”userdel  用户名“就行了,但是这样删除的话,用户的家目录依然存在,这时你若要再建立一个与刚才同名的账号那是不行的,所以我习惯带上-r选项,删的彻底点,即连同家目录一起删除,反正删除账号后家目录也没什么用了。
   还有两个域组账号相关的文件,即/etc/group 和/etc/gshadow,不太常用,尤其是后者,知道下应该就行了。

    添加组账号——groupadd

  添加一个组账号,在新建用户时,若要指定用户的gid和组名称,则必须先保证这个组要存在,所以要先建立组,简单的操作如下:

[root@localhost ~]#groupadd -g 1000 test  ==>创建一个组gid为1000
[root@localhost ~]#tail -3 /etc/group
linuxidc:x:500:
user1:x:504:
test:x:1000:
[root@localhost ~]#

     删除组账号——groupdel 

     很简单,直接接用户名作为参数,删除组账号后,从/etc/group文件中将查不到相应的记录。

  用户和组账号查询:

     id命令——查询用户身份标识

     groups命令——查询用户所属的组

  finger命令——查询用户的详细信息

  users、w、who命令查询已登录到主机的用户信息

              文件/目录的权限和归属

      将ls带上参数l或直接打ll命令,则可以查看用户对文件的使用权。 

           

      第一列权限位由10位(比如d rwx rwx r-x)组成,其中第一位表示文件类型,d表示目录,l表示链接文件,b表示块文件,c表示字符文件,-表示普通文件。关于rwx-分别表示读、写、执行、无权限,r w x – 四个权限字符分别可表示为8进制数字4,2,1,0,即 rwx rwx r-x权限也可表示为775,其中前三位rwx(7)表示文件所有者(owner)对该文件的权限,中间3位rwx(7)表示文件所在的组(group)对该文件的权限,最后三位r-x(5)表示其他用户(other)对该文件的权限,也即ugo权限。

  设置文件/目录的权限——chmod

[linuxidc@localhost dirtest]$ ll
总计 36
drwxrwxr-x 2 linuxidc jzhou 4096 03-05 22:43 dirtest1
lrwxrwxrwx 1 linuxidc jzhou    8 03-05 22:45 linkfile -> testfile
-rw-rw-r-- 1 linuxidc jzhou   67 03-05 22:40 testfile
[linuxidc@localhost dirtest]$ chmod g-w,o+x testfile   ==>设置文件testfile的组权限和其他人权限,注意权限变化
[linuxidc@localhost dirtest]$ ls -l
总计 36
drwxrwxr-x 2 linuxidc jzhou 4096 03-05 22:43 dirtest1
lrwxrwxrwx 1 linuxidc jzhou    8 03-05 22:45 linkfile -> testfile
-rw-r--r-x 1 linuxidc jzhou   67 03-05 22:40 testfile  ==>看,权限变化了
[linuxidc@localhost dirtest]$ chmod 644 dirtest1/    ==>改变目录dirtest1的权限,即读写|读|读
[linuxidc@localhost dirtest]$ ll
总计 36
drw-r--r-- 2 linuxidc jzhou 4096 03-05 22:43 dirtest1   ==>发现它的变化了没
lrwxrwxrwx 1 linuxidc jzhou    8 03-05 22:45 linkfile -> testfile
-rw-r--r-x 1 linuxidc jzhou   67 03-05 22:40 testfile
[linuxidc@localhost dirtest]$ chown linuxidc:root testfile   ==>普通用户没有权限更改
chown: 正在更改 “testfile” 的所有者: 不允许的操作
[linuxidc@localhost dirtest]$ su root  ==>切换到root用户
口令:
[root@localhost dirtest]# ll  
总计 36
drw-r--r-- 2 linuxidc jzhou 4096 03-05 22:43 dirtest1
lrwxrwxrwx 1 linuxidc jzhou    8 03-05 22:45 linkfile -> testfile
-rw-r--r-x 1 linuxidc jzhou   67 03-05 22:40 testfile
[root@localhost dirtest]# chown root:root testfile  ==>将文件testfile的拥有者和属组都改为root
[root@localhost dirtest]# ll
总计 36
drw-r--r-- 2 linuxidc jzhou 4096 03-05 22:43 dirtest1
lrwxrwxrwx 1 linuxidc jzhou    8 03-05 22:45 linkfile -> testfile
-rw-r--r-x 1 root  root    67 03-05 22:40 testfile   ==>看,它的文件拥有者和所属组都变为root了
[root@localhost dirtest]# 

 修改目录的权限和所属组时可以指定-R选项以实现目录里的文件或者目录也可以递归变化。若只修改文件/目录所有者只需指定前者,即chown root testfile,若只修改文件/目录所属组的权限,前面的用户可不写,即chown :root testfile。

  附加权限位

  普通用户并没有权限修改“/etc/shadow”文件,那为什么可以修改自己的登录密码呢?因为passwd命令程序被设置了SUID权限,普通用户在执行该命令时临时获得相当于属主用户(root)的权限。

     set位权限的主要用途:

   为可执行(有 x 权限的)文件设置,权限字符为“s”;

   其他用户执行该文件时,将拥有属主或属组用户的权限。

     set位权限类型:
   SUID:表示对属主用户增加SET位权限;
   SGID:表示对属组内的用户增加SET位权限。
     

[root@localhost ~]# ls -l  /usr/bin/passwd
-rwsr-xr-x 1 root root 19876 2006-07-17 /usr/bin/passwd
==>普通用户以root用户的身份,间接更新了shadow文件中自己的密码

注意:不要轻易为可执行文件设置SET位权限,特别是对于那些属主、属组是root的执行程序,使用SET位权限时更应该慎重。例如,若为vim编辑器程序设置SUID权限,将导致普通用户也可以使用vim编辑器修改系统中的任何配置文件     

      粘滞位(Sticky)

       主要用途:
     为公共目录(例如,权限为777的)设置,权限字符为“t”
     用户不能删除该目录中其他用户的文件
 

  由于系统及服务程序运行的需要, Linux提供了/tmp、/var/tmp等临时目录,允许任意用户、程序写入数据,然而试想一下,若任意一个普通用户都能够删除系统服务运行中使用的临时文件,将造成什么后果?设置粘滞位以后,正好可以保持一种动态的平衡:允许各用户在目录中任意写入、删除数据,但是禁止随意删除其他用户的数据 。

[root@localhost ~]# ls  -ld  /tmp   /var/tmp
drwxrwxrwt 8 root root 4096 09-09 15:07 /tmp    ==>就是将t位代替执行位x
drwxrwxrwt 2 root root 4096 09-09 07:00 /var/tmp

 其实这些特殊权限位用的不多,我认为只不过是为那几种特殊的文件作个解释罢了,不用深究的,知道派什么用的就行了吧。

  使用附加权限

设置SET位、粘滞位权限
使用权限字符
 chmod  ug±s  可执行文件…
 chmod  o±t  目录名…
使用权限数字:
 chmod  mnnn  可执行文件…
 m为4时,对应SUID,2对应SGID,1对应粘滞位,可叠加
 
  SET位标记字符为“s”,若使用8进制数字形式,则SUID对应为“4”、SGID对应为“2”;在权限模式中可采用“nnnn”的形式时,如“4755”表示设置SUID权限、“6755”表示同时设置SUID、SGID权限。

介绍了基本的文件和目录管理之后,接下来就是磁盘和文件系统的管理。如何分区磁盘和创建文件系统呢?

  添加磁盘并进行分区、创建并挂载文件系统

  1、确认系统中的磁盘命令——fdisk

   fdisk  -l  [磁盘设备]

[root@localhost ~]# fdisk -l  ==>查看目前系统内的所有分区 (这里显示的结果与在交互模式下P命令是相同的,后面讲)

Disk /dev/hda: 21.4 GB, 21474836480 bytes   ==>磁盘的文件名与容量
255 heads, 63 sectors/track, 2610 cylinders  ==>磁头、扇区与柱面大小
Units = cylinders of 16065 * 512 = 8225280 bytes   ==>每个柱面的大小

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1288    10241437+  83  Linux
/dev/hda3            1289        1925     5116702+  83  Linux
/dev/hda4            1926        2610     5502262+   5  Extended
/dev/hda5            1926        1989      514048+  82  Linux swap / Solaris      

上述各字段的含义:

Device:分区的设备文件名称    Boot:是否是引导分区,即开机区,若是,则用“*”标识

Start :开始柱面,即该分区在硬盘中的起始位置    End :结束柱面,即该分区在硬盘中的结束位置

Blocks:分区的大小,以Blocks(块)为单位,默认的块大小为1024字节,即1KB

Id:分区类型的ID标记号,对于EXT3分区为83,LVM分区为8e      System:分区类型,即磁盘分区内的系统

 

  2、规划硬盘中的分区——fdisk

  fdisk [磁盘设备]

  使用此命令可进入交互操纵,您可以在下面的交互操纵里面胡作非为,但是切记离开时必须按q命令,不能按w

#找出系统中所在根目录所在磁盘,并查阅该硬盘内的相关信息
[root@localhost ~]# df / <==重点找出磁盘文件名而已 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/hda2 9920624 2968604 6439952 32% / [root@localhost ~]# fdisk /dev/hda ==>进入交互操纵模式,注意这里不要写具体的数字 The number of cylinders for this disk is set to 2610. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): m <==等待输入,m是命令菜单 Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition ==>删除一个分区 l list known partition types ==>创建逻辑分区 m print this menu n add a new partition ==>增加一个分区 o create a new empty DOS partition table p print the partition table ==>在屏幕上显示分区表 q quit without saving changes ==>不存储,直接离开fdisk程序 s create a new empty Sun disklabel t change a partition's system id 变更分区类型 u change display/entry units v verify the partition table w write table to disk and exit ==>将刚才的操作写入分区表,慎重操作 x extra functionality (experts only)

  常见操作有:创建主分区、创建扩展分区(将硬盘的所有剩余空间作为扩展分区)、创建逻辑分区、改变分区的系统代码、保存分区表信息、用partprobe探测硬盘分区变化

 下面举出几例做测试,离开时不保存:

 Command (m for help): p  ==>查看磁盘分区表,和终端命令模式下的fdisk -l 作用相同

Disk /dev/hda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1288    10241437+  83  Linux
/dev/hda3            1289        1925     5116702+  83  Linux
/dev/hda4            1926        2610     5502262+   5  Extended
/dev/hda5            1926        1989      514048+  82  Linux swap / Solaris

Command (m for help): d  
Partition number (1-5): 4   ==>删除第4个分区

Command (m for help): d    ==>删除第3个分区
Partition number (1-4): 3

Command (m for help): p  ==>再次显示时观察下面只显示了前两个分区,第5个没显示

Disk /dev/hda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1288    10241437+  83  Linux

Command (m for help): n  ==>创建一个分区
Command action
   e   extended
   p   primary partition (1-4)
p  ==>选择创建的分区类型为主分区
Partition number (1-4): 4 ==>选择4号做主分区
First cylinder (1289-2610, default 1289): 
Using default value 1289   ==>起始柱面若直接按enter键就是使用默认值
Last cylinder or +size or +sizeM or +sizeK (1289-2610, default 2610): +512M

Command (m for help): p  ==>再次查看分区表,发现多了一个刚从建立的分区4

Disk /dev/hda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1288    10241437+  83  Linux
/dev/hda4            1289        1351      506047+  83  Linux

Command (m for help): n  ==>再建一个分区
Command action
   e   extended
   p   primary partition (1-4)
e   ==>建立扩展分区
Selected partition 3  ==>这个是系统主动选择的分区
First cylinder (1352-2610, default 1352): 
Using default value 1352
Last cylinder or +size or +sizeM or +sizeK (1352-2610, default 2610): 
Using default value 2610

Command (m for help): p

Disk /dev/hda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1288    10241437+  83  Linux
/dev/hda3            1352        2610    10112917+   5  Extended  ==>看,刚新建的扩展分区
/dev/hda4            1289        1351      506047+  83  Linux

Partition table entries are not in disk order

Command (m for help): n  ==>再多建几个分区玩玩,反正后面不保存就行了,,呵呵
First cylinder (1352-2610, default 1352): 
Using default value 1352
Last cylinder or +size or +sizeM or +sizeK (1352-2610, default 2610): +2084
Value out of range.
Last cylinder or +size or +sizeM or +sizeK (1352-2610, default 2610): +2084M

Command (m for help): n   ==>有没有发现,最后建立2个分区的时候根本没有询问我们要建立是主分区还是扩展分区,为啥?因为分区已经超过4了,您别无选择,只能是扩展分区了。。。
First cylinder (1606-2610, default 1606): 
Using default value 1606
Last cylinder or +size or +sizeM or +sizeK (1606-2610, default 2610): 
Using default value 2610

Command (m for help): p

Disk /dev/hda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1288    10241437+  83  Linux
/dev/hda3            1352        2610    10112917+   5  Extended
/dev/hda4            1289        1351      506047+  83  Linux
/dev/hda5            1352        1605     2040223+  83  Linux  ==>这是后面又新建的2个分区
/dev/hda6            1606        2610     8072631   83  Linux

Partition table entries are not in disk order

Command (m for help): q  ==>这里一定要按q啊,因为我刚才仅仅是演示操作,还破坏性的删除了2个分区,你要是真要分区,那就要按w保存了。

[root@localhost ~]# 

  磁盘分好区后,要更新下内核,否则您使用fdisk -l 可能看不到分区后的变化,只有重启才可以。但是使用partprobe强制让内核重新找一次分区表就行了。

[root@localhost ~]# partprobe [/dev/hda ]   <==强制让内核重新找一次分区表,则可以立刻看出分区的变化

     注意:普通用户没有权限进行硬盘分区,只有root用户可以,但最好是在单用户模式下比较安全,此外,在进行分区的时候,若该硬盘某个分区正在使用当中,则很有可能系统内核会无法加载硬盘的分区表,解决的方法就是将该使用中的分区给卸载,然后再重新分区一次,重新写入分区表。

     3、在分区中创建文件系统——mkfs,mkswap

  (1)、mkfs

      用途:make filesystem,创建文件系统,即格式化

  格式:mkfs  -t  文件系统类型   分区设备  (-t选项表示可以接受的文件系统格式,如ext3,ext2,vfat等,通常情况下不需要加次选项,因为系统可自动判断使用的是什么文件系统)

       

  上述由于设备/dev/hda3已经挂载了,所我无法再挂载,但可以卸载后再挂载,不做演示。

      (2)、mkswap

  用途:make swap ,创建文件系统交换系统

  格式:mkswap   分区设备

1)在Linux系统中,SWAP分区的作用类似于Windows系统中“虚拟内存”,可以在一定程度上缓解物理内存不足的情况
2)如果系统没有SWAP交换分区,或者现有交换分区的容量不够用,可以通过mkswap命令创建交换文件系统以增加虚拟内存

3)交换分区空间的启用、停用需要使用swapon、swapoff命令,free命令可以查看物理内存、交换空间的使用情况
4)“swapon -s”命令也可查看交换分区的使用情况

[root@localhost ~]# mkswap /dev/hda5   ==>格式化交换分区
Setting up swapspace version 1, size = 526381 kB
[root@localhost ~]# swapon /dev/hda5  ==>启用交换分区
[root@localhost ~]# free | grep -i swap   ==>查看交换空间
Swap:       514040          0     514040
[root@localhost ~]# swapoff /dev/hda5  ==>停用交换空间
[root@localhost ~]#  free | grep -i swap
Swap:            0          0          0
[root@localhost ~]# 

      将新硬盘分好区以后,还需要对分区进行格式化(即创建文件系统),并挂载到Linux系统中的指定目录下,然后才能用于存储文件、目录等数据。并且挂载点一定是目录,该目录为进入文件系统的入口。因此,并不是您有任何文件都能使用,必须要挂载到某个目录树的某个目录后,才能使用文件系统。

  4、挂载、卸载文件系统——mount,umount

  (1)mount

  用途:挂载文件系统、ISO镜像到指定文件夹

  格式:  mount  [ -t 类型 ]  存储设备  挂载点目录 (”-t 类型“的选项通常可以省略,大多数Linux系统能够自动识别对应的文件系统类型)

                mount  -o loop  ISO镜像文件  挂载点目录

   (2)umount

    用途:卸载已挂载的文件系统
   格式:   umount  存储设备位置

                  umount  挂载点目录

  (3)查看已挂载分区的使用情况(df -hT) 

[root@localhost ~]# df -hT   ==>查看现有已挂在分区使用情况
文件系统      类型    容量  已用 可用 已用% 挂载点
/dev/hda2     ext3    9.5G  2.9G  6.2G  32% /
/dev/hda3     ext3    4.8G  195M  4.3G   5% /home
/dev/hda1     ext3     99M   11M   83M  12% /boot
tmpfs        tmpfs    506M     0  506M   0% /dev/shm
[root@localhost ~]# mount /dev/hda3 /home/jzhou  ==>将设备/dev/hda3挂载到目录/home/jzhou下
[root@localhost ~]# df -hT   ==>再次查看挂载情况
文件系统      类型    容量  已用 可用 已用% 挂载点
/dev/hda2     ext3    9.5G  2.9G  6.2G  32% /
/dev/hda3     ext3    4.8G  195M  4.3G   5% /home
/dev/hda1     ext3     99M   11M   83M  12% /boot
tmpfs        tmpfs    506M     0  506M   0% /dev/shm
/dev/hda3     ext3    4.8G  195M  4.3G   5% /home/jzhou   ==>看,这里多了一个挂载点
[root@localhost ~]# umount /dev/hda3  ==>卸载刚才的挂载
[root@localhost ~]# df -hT    ==>再次查看没有了,已成功卸载
文件系统      类型    容量  已用 可用 已用% 挂载点
/dev/hda2     ext3    9.5G  2.9G  6.2G  32% /
/dev/hda3     ext3    4.8G  195M  4.3G   5% /home
/dev/hda1     ext3     99M   11M   83M  12% /boot
tmpfs        tmpfs    506M     0  506M   0% /dev/shm
[root@localhost ~]# 

  另外光驱和镜像的挂载只是略有不同,语法其实是一样的,光盘设备一般是/dev/cdrom或者/dev/hdc,镜像嘛,很明显是iso格式的压缩包,挂载镜像时要加 -o loop选项,具体用法网上很多。

      5、设置文件系统自动挂载——修改配置文件

  系统中的“/etc/fstab”文件可以视为mount命令的配置文件,它包含了需要开机后自动挂载的文件系统目录。

     

  查看一下这个文件的内容如上,其中各个字段的含义如下(前三个字段很重要):

  第一个字段:设备位置

  第二个字段:挂载点目录

  第三个字段:文件系统类型

  第四个字段:挂载参数,即mount命令“-o”选项后面可使用的参数

  第五个字段:表示文件系统是否需要dump备份(dump是一个备份工具),一般设为1时表示需要,设为0时将被dump所忽略

      第六字段:该数字用于决定在系统启动时进行磁盘检查的顺序,0不进行检查,1优先,2其次。对于根分区应设为1,其它分区设为2

   

  设置自动挂载示例:即每次重新开机后,能自动完成挂载。

  进入vim 编辑内容,将设备proc的挂载点由/proc改为/home/jzhou,并保存退出:

     

  则再次启动时,会自动挂载到相应目录,上述是演示,之后我又改回来了。

   说明:

   (1)在/etc/fstab文件中正确设置了相应分区的自动挂载记录以后,手动挂载、卸载该分区时,仅需指定设备名、挂载点中的任意一个作为参数即可,例如,执行“mount /dev/sdb1”或者“umount /mailbox”都可以完成卸载
  (2)mount命令不带任何选项、参数时,可以显示当前系统中已经挂载的文件系统信息
 
  

        LVM简单介绍

    Logical Volume Manager,逻辑卷管理
     屏蔽了底层磁盘布局,便于动态调整磁盘容量
   (需要注意:p /boot分区用于存放引导文件,不能应用LVM机制)
 
  1、LVM机制的基本概念

  (1)PV(Physical Volume,物理卷)
    整个硬盘,或使用fdisk等工具建立的普通分区
    包括许多默认4MB大小的PE(Physical Extent,基本单元)
  (2)VG(Volume Group,卷组)
   一个或多个物理卷组合而成的整体
  (3)LV(Logical Volume,逻辑卷)
      从卷组中分割出的一块空间,用于建立文件系统
 

  它们的逻辑关系如下:
   
  我想您已经知道了为什么要存在这个LVM机制了,同大多数虚拟化的东西作用相似,最核心的还是PV,即真实的物理卷,将,多个物理卷组成一个卷组,之后是对这些卷组划分卷,这时与PV完全无关了,这能很好的利用容量和空间,而且当有新的物理卷加入时,只需将其加入逻辑卷就行了。这个机制很像网络里面划分VLAN呢。
 
    LVM的管理命令主要有以下:
  

功能

物理卷管理

卷组管理

逻辑卷管理

Scan      扫描

pvscan

vgscan

lvscan

Create    建立

pvcreate

vgcreate

lvcreate

Display  显示

pvdisplay

vgdisplay

lvdisplay

Remove  删除

pvremove

vgremove

lvremove

Extend  扩展

 

vgextend

lvextend

      
   主要命令的用法:
    pvcreate  设备名
    vgcreate  卷组名  物理卷名1 物理卷名2
    lvcreate  -L  大小  -n  逻辑卷名  卷组名
      lvextend  -L  +大小  /dev/卷组名/逻辑卷名 
 
  创建逻辑卷的基本步骤:PV->VG->LV->格式化->挂载使用文件系统
  具体步骤:(我的虚拟机不能演示,bash中没有这个pvcreate命令,简单作下理论说明)
  (1)、转换物理卷
  1)使用fdisk命令规划两个分区   fdisk -l /dev/hda /dev/hdb | grep “LVM”
  2)使用pvcreate命令转换上述分区为物理卷
    pvcreate /dev/hda1      pvcreate /dev/hdb1
  (2)、创建卷组
  vgcreate vg_test /hda1 /dev/hdb1
  (3)、创建逻辑卷
      1)使用lvcreate命令创建逻辑卷lv_test,从卷组vg_test上划出10G空间
      lvcreate  -L  10G  -n  lv_test  vg_test
      2)使用mkfs命令创建ext3文件系统
     mkfs  -t  ext3  /dev/vg_test/lv_test 
  (4)、格式化为ext3文件系统,并挂载到目录/dirtest
       mount   /dev/vg_test/lv_test   /dirtest
  (5)、还可以为逻辑卷扩容
   1)使用lvextend命令为逻辑卷lv_test扩充容量,从卷组vg_test上再划出10G给逻辑卷lv_test
    lvextend  -L  +10G  /dev/vg_test/lv_test
   2)使用resize2fs命令更新系统识别的文件系统大小
    resize2fs  /dev/vg_test/lv_test
  
 

如有错误,请指正,3Q~

管理进程和计划任务

   本次依然介绍Linux系统管理基础部分,内容为Linux的引导过程和运行级别、管理进程和服务、设置任务的计划运行,和前面一样,只是简单介绍,深入的部分我也继续在学习,希望和大家共同学习,如有错误,请指点。

  一、Linux的引导流程

     1、系统启动的引导流程

  首先系统开机自检,然后是计算机开机后访问硬盘并读取首个扇区的MBR(即主引导目录),(备注:主引导扇区内部结构,其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。主引导扇区记录着硬盘本身的相关信息以及硬盘各个分区的大小及位置信息,是数据信息的重要入口。如果它受到破坏,硬盘上的基本数据结构信息将会丢失,需要用繁琐的方式试探性的重建数据结构信息后才可能重新访问原先的数据。)读取MBR记录后,这时进入系统选择界面,选择好某个操作系统后,则开始加载内核,接着从INIT进程获得系统控制权,即进入初始化过程,之后则读相应的配置文件,具体引导过程如下:

                

     系统初始化进程及文件简单介绍

        1)、INIT进程与配置文件:

     INIT进程:由Linux内核加载运行/sbin/init程序,是系统中第一个进程,也是内核加载的第一个程序,PID(进程标识符)永远是1;配置文件是:/etc/inittab  

       INIT进程启动后会启动其它程序,生成新的进程,这些由init启动的进程称之为init进程的子进程,而init进程是这些进程的父进程
     2)、inittab文件结构:
      查看一下/etc/inittab配置文件的内容:

 

[root@localhost ~]# grep -v "^#" /etc/inittab | grep -v "^$" ==>查看这个文件时过滤掉注释行和空行
id:5:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon
[root@localhost ~]# 

 

  各字段的含义:

id

用于在inittab文件中唯一标识一个配置记录

runlevels

用于指定该记录在哪些运行级别中运行

action

用于描述记录将执行哪种类型的动作

process

用于设置启动进程所执行的命令

 
 id,也称标记字段,由1~4个字符组成,用以区别于其他行的配置,所以id标记字段必须是唯一的
 runlevels,运行级别字段,用于指定该记录在哪些运行级别中运行,取值数字0~6,后面会对其进行详细解释
 action ,动作类型字段,动作类型字段描述了该行配置所对应的操作类别,一般为固定值,较常用的类型如下:

      initdefault:设置初始化系统后默认进入的运行级别

      sysinit:设置系统初始化的操作脚本

      wait:init进程将等待该行配置所对应的脚本操作完成后,再继续执行其他操作

      ctrlaltdel:设置当用户按下Ctrl+Alt+Delete组合键后的操作

      powerfail:设置当系统收到断电信号(使用不间断电源)时采取何种动作

      powerokwait:设置当系统收到恢复供电信号时采取何种动作

      respawn:一旦该行配置所对应的进程被终止,则重新启动该进程

 process,程序或脚本字段,此字段用于指定该行配置所对应的实际操作,可以是具体的命令、脚本程序等

    3)、其它系统初始化文件简介

/etc/rc.d/rc.sysinit
由init进程调用执行
完成设置网络、主机名、加载文件系统设置时钟等初始化工作(例如检查并启用磁盘配额功能就是在该脚本中完成的)。
/etc/rc.d/rc脚本文件
由init进程调用执行

rc脚本通过指定不同的级别参数分别加载及终止不同的系统服务,进入到相应的系统运行级别。

/etc/rc.local脚本文件
由rc脚本调用执行

rc.local脚本通常由rc脚本在最后进行加载,其作用主要是为管理员自行设置启动命令提供一种途径,通常都将一些需要随系统启动的命令和脚本添加到该文件中。(保存用户定义的需开机后自动执行的命令
 
2、Linux系统的运行级别
 
1)、运行级别是指运行Linux系统的不同模式,每种模式对应不同的服务程序组合。
 

默认的7种运行级别
0:关机状态
1:单用户模式
2:字符界面的多用户模式(不支持网络)
3:字符界面的完整多用户模式
4:未分配使用
5:图形界面的多用户模式
6:重新启动
(解释:Linux系统在运行时,采用的每一种服务搭配称之为“运行级别”,运行级别类似于Windows系统中的正常启动、安全模式、带网络支持的安全模式……等概念,不同的运行级别使用了不同的服务程序组合,如“套餐”的概念,动感地带手机资费的10元短信套餐、15元音乐套餐
2)、调整默认运行级别
修改/etc/inittab 文件中的 initdefault 配置,一般对于普通用户来说,runlevel设置为5,即为图像化操作,但是对于服务器来说,默认是设置为3,即字符界面,对于服务器来说,加载图形化界面是非常耗资源的,影响服务器性能。

[root@localhost ~]# vi /etc/inittab
进入之后有这样一行:
id:5:initdefault:    ==>这个5的意思就是设置开机后自动进入图形模式

3)、查看运行级别——runlevel
  runlevel:能显示切换前的运行级别和当前运行级别
  若临时切换运行级别,则使用init命令结合0-6的运行级别参数

 

[root@localhost ~]# runlevel   ==>查看当前运行级别
N 5   ==>第一个字符“N”表示之前未切换过运行级别
[root@localhost ~]# init 3   ==>将运行级别改为3
[root@localhost ~]# runlevel   ==>显示之前和改后的级别
5 3
[root@localhost ~]# init 6   ==>重启(这里我按了ctrl + C ,不然系统要重启了)
[root@localhost ~]# init 0   ==>系统关机

 

3、系统服务的启动控制

1)、查看系统服务的启动状态   chkconfig  –list  [服务名称]

如查看network这个服务的启动状态,则使用:chkconfig –list  network

2)、服务脚本位置:/etc/init.d  ——>  /etc/rc.d/init.d

(/etc/init.d是一个符号链接,目标为 /etc/rc.d/init.d,通过这两个目录都可以找到系统服务对应的脚本文件)

3)、设置系统服务的启动状态   chkconfig  –level  级别列表 服务名  on|off

(解释:运行级别列表:可以是235、 35、5等等形式;服务名称:注意名称要正确,如果忘记了可查看/etc/init.d/目录下的脚本名 ;On|off: 启动或关闭启动状态)

如设置network服务在2345级别下为启动状态:chkconfig  –level  2345  network  on

再次查看它的服务时则可以看到network这个服务在各个模式下的启用状态

4)、ntsysv系统服务管理工具——ntsysv  [–level  级别列表]

 此命令进入类似图形化的界面,可以集中对所有的系统服务进行设置

 

使用和chkconfig命令和ntsysv命令跳转服务启动状态的对比说明:

1)当需要设置个别服务在不同运行级别的启动状态时,选择使用chkconfig命令要更有效率

2)当需要同时设置大量服务的启动状态时,选择使用ntsysv配置工具要更加适合

  二、进程管理

  1、程序与进程的区别

   程序:保存在硬盘、光盘等介质中的可执行代码和数据;是静态保存的代码

   进程:在CPU及内存中运行的程序代码; 是动态执行的代码; 
父、子进程:每个进程可以创建一个或多个进程

  2、查看进程信息

  1)、ps命令

    用途:查看静态的进程统计信息
    格式:ps aux   ==>显示系统所有进程

                ps -elf    ==>以长格式显示

  2)、top命令

        用途:查看动态的进程排名信息
       格式:top
    3)、pgrep命令  
    用途:根据特定条件查询进程PID信息   

 

[root@localhost ~]# pgrep "init"
1
[root@localhost ~]# pgrep -l "log"
2538 syslogd
2541 klogd
3221 login
[root@localhost ~]# pgrep -l -U teacher -t tty1
27483 bash
27584 vim

 

   4)、pstree命令

     用途:以树型结构显示各进程间的关系

   格式:pstree [-aup]
 
  3、进程的不同启动方式
   1)手工启动
    前台启动:用户输入命令直接执行程序
    后台启动:在命令行尾加入“&”符号(即把这个命令放在后台执行,执行后,会显示一个后台任务顺序号和一个PID号)

[root@localhost ~]# ls -l &
[1] 28453  ==>后台任务序号为1(这个要记住,因为唤醒时要用到),PID号为28453

   2)调度启动   

      使用at命令,设置在某个特定的时间,执行一次任务

  使用crontab命令,设置按固定的周期(如每天、每周等)重复执行预先计划好的任务
   3)、进程的前后台调度
  ctrl+Z   : 将当前进程挂起,即调入后台并停止执行
  jobs      :查看处于后台的任务列表
  fg        : 将处于后台的进程恢复到前台运行,需指定任务序号
 4)、终止进程的运行
  Ctrl + C :中断正在执行的命令
  kill、killall :  kill 用于终止指定PID号的进程
        killall 用于终止指定名称的所有进程
  -9选项用于强制终止
 
     下面是我使用top命令获取当前正在运行的进程(部分)
   
这里有两条top的进程,是因为我打开了两个terminal,然后都运行了top命令,若我现在要将另一个终端的top命令杀掉,则如下:

[root@localhost ~]# kill 3792 ==>此时另一个额终端将退出top命令
若杀掉所有正在打开的文本文件:killall -9 geidt

终止进程的运行——pkill命令

 

[linuxidc@localhost ~]$ w | grep -v "root" ==>查看除root用户外哪些用户在使用终端
 11:17:38 up  1:18,  3 users,  load average: 0.14, 0.05, 0.01
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
linuxidc    :0       -                10:01   ?xdm?  18.56s  0.22s /usr/bin/gnome-
linuxidc    pts/1    :0.0             11:17    0.00s  0.02s  0.01s w
linuxidc    pts/2    :0.0             11:17   10.00s  0.01s  0.01s bash
[linuxidc@localhost ~]$ 

 

上述pts有2个,是因为我打开了两个terminal,并且都是以linuxidc用户登录的,现在我要停止pts/1里的所有进程:

 

[linuxidc@localhost ~]$ pkill -9 -t pts/1    ==>这个命令一旦运行,则pts/1这个终端将立即关闭
再次查看时只有一个pts/2了:
[linuxidc@localhost ~]$ w | grep -v "root" 
 11:22:13 up  1:22,  2 users,  load average: 0.09, 0.12, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
linuxidc    :0       -                10:01   ?xdm?  18.56s  0.22s /usr/bin/gnome-
linuxidc    pts/2    :0.0             11:17   00.00s  0.01s  0.00s w
[linuxidc@localhost ~]$ 

   三、计划任务管理

    1、at命令——   一次性任务设置

  在指定的日期、时间点自动执行预先设置的一些命令操作,属于一次性计划任务
  服务脚本名称:/etc/init.d/atd
  设置格式:at  [HH:MM]  [yyyy-mm-dd]

 

[root@localhost ~]# service atd start  ==>启动atd服务
[root@localhost ~]# at 11:35 
at> reboot
at> <EOT>   ==>按ctrl + D 提交任务,则自动进入这里
job 1 at 2013-03-16 11:35
[root@localhost ~]# atq   
1       2013-03-16 11:35 a root
==>接下来我郁闷了好久,因为等了3分钟还没有结果,我是11:30分设置的这个计划任务,按道理早应该重启了,之后才发现,原来我虚拟机的时钟和我自己的电脑不同步,我自己的电脑快了5分钟,啊。。。白白等了N个3分钟还在不断找原因,执行了date命令才发现原来现在才11:30。。。

     2、crontab命令

   按照预先设置的时间周期(分钟、小时、天……)重复执行用户指定的命令操作,属于周期性计划任务
  (1)、先来看一下/etc/crontab文件的内容:

 

[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts             ==>这里分别设置了每小时每天每星期每月定期执行的任务脚本分别存放在这些目录中
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

注意:

启用周期性任务有一个前提条件,即对应的系统服务crond必须已经运行;

全局配置和系统默认配置中的内容一般不需要用户去修改,用户只需设置/var/spool/cron/目录下与本帐号同名的文件即可

  (2)、管理cron计划任务

编辑计划任务:crontab  -e  [-u  用户名]
查看计划任务:crontab  -l  [-u  用户名]
删除计划任务:crontab  -r  [-u  用户名]
root用户可以管理指定用户的计划任务;普通用户只能管理自己的计划任务
(备注:用户只需执行“crontab -e”命令后会自动调用文本编辑器(默认为vi)并打开“/var/spool/cron/用户名”文件,无需手动指定文件位置

 
     (3)、crontab应用简单举例
    1)、示例1:root用户
   需求:  每天早上7:50自动开启sshd服务,22点50时关闭
      每隔5天清空一次FTP服务器公共目录/var/ftp/pub
      每周六的7:30时,重新启动httpd服务
      每周一、三、五的17:30时,打包备份/etc/httpd目录

[root@localhost ~]# crontab -e
50 7 * * *  /sbin/service sshd start
50 22 * * *  /sbin/service sshd stop
0 * */5 * *  /bin/rm -rf /var/ftp/pub/*
30 7 * * 6  /sbin/service httpd restart
30 17 * * 1,3,5  /bin/tar jcvf httpdconf.tar.bz2 /etc/httpd 

      2)、示例2:linuxidc用户

    需求:每周日晚上23:55时将“/etc/passwd”文件的内容复制到宿主目录中,保存为pwd.txt文件 

[root@localhost ~]# crontab -e -u linuxidc 
55 23 * * 7  /bin/cp /etc/passwd /home/linuxidc/pwd.txt 

    3)、示例3:

  root用户查看自己的计划任务列表;查看并删除linuxidc用户设置的计划任务

[root@localhost root]# crontab -l
50 7 * * *  /sbin/service sshd start
50 22 * * *  /sbin/service sshd stop
0 * */5 * *  /bin/rm -rf /var/ftp/pub/*
30 7 * * 6  /sbin/service httpd restart
30 17 * * 1,3,5  /bin/tar jcvf httpdconf.tar.bz2 /etc/httpd
[root@localhost root]# crontab -l -u linuxidc
55 23 * * 7  /bin/cp /etc/passwd /home/linuxidc/pwd.txt
[root@localhost root]# crontab -r -u linuxidc
[root@localhost root]# crontab -l -u linuxidc
no crontab for linuxidc
[root@localhost root]#

 

   从上面这3个例子简单总结一下crontab任务的配置格式:

 (1)  时间周期设置:                            任务内容设置:

  50       3      2       1     *       run_command

  分钟   小时   日期 月份   星期      命令

字段

说明

分钟

取值为从0到59之间的任意整数

小时

取值为从0到23之间的任意整数

日期

取值为从1到31之间的任意整数

月份

取值为从1到12之间的任意整数

星期

取值为从0到7之间的任意整数,0或7代表星期日

命令

要执行的命令或程序脚本

 

  前5个字段指定任务重复执行的时间规律,第6个字段用于指定具体的任务内容

crontab任务配置记录中,所设置的命令在“分钟+小时+日期+月份+星期”都满足的条件下才会运行。



  (2)、时间数值的特殊表示方法 

*    表示该范围内的任意时间
,    表示间隔的多个不连续时间点
–    表示一个连续的时间范围
/    指定间��的时间频率
应用示例:
0  17  *  *  1-5          周一到周五每天17:00
30  8  *  *  1,3,5        每周一、三、五的8点30分
0  8-18/2  *  *  *       8点到18点之间每隔2小时
0  *  */3  *  *            每隔3天

  同windows操作系统一样,使用一个操作系统,肯定要安装一些软件,这篇随笔主要介绍Linux上软件的安装。首先我们应该了解Linux应用程序的组成、熟悉RPM软件包的管理机制,接着就是会使用RPM包管理工具,并且从源码包编译安装应用程序。

  一、Linux应用程序简介

  1、Linux命令与应用程序的关系

   (1)、文件位置

系统命令:一般在/bin和/sbin目录中,或为Shell内部指令
应用程序:通常在/usr/bin和/usr/sbin目录中
(2)、主要用途
系统命令:完成对系统的基本管理工作,例如IP配置工具
应用程序:完成相对独立的其他辅助任务,例如网页浏览器
(3)、适用环境
系统命令:一般只在字符操作界面中运行
应用程序:根据实际需要,有些程序可在图形界面中运行
(4)、运行格式
系统命令:一般包括命令字、命令选项和命令参数
应用程序:通常没有固定的执行格式

   (个人理解:在Linux中严格区分命令和程序也并无太大意义,对于“安装软件包”与“安装应用程序”这两种说法,也并不做严格的区分 

  2、Linux应用程序的组成

  这部分与Linux的目录层次有紧密关系,下面列出的是典型应用程序的目录结构:

文件类型

保存目录

普通执行程序文件

/usr/bin

服务器执行程序文件和管理程序文件

/usr/sbin

应用程序配置文件

/etc

日志文件

/var/log

应用程序文档文件

/usr/share/doc

应用程序手册页文件

/usr/share/man

    如果应用程序的配置文件较多,通常会以软件名建立专门的子文件夹来保存,如“/etc/httpd”

    例如查看sendmail软件包时,执行rpm -ql sendmail查看。

  3、软件包的封装类型

  封装类型有多种,常见的是RPM软件包,扩展名为“.rpm”,源代码软件包,一般为“.tar.gz”、“.tar.bz2”等格式的压缩包包含程序的原始代码;这两种较常用。其它的有deb软件包,扩展名为“.deb”,提供安装程序的软件包,一般是install.sh、setup、.bin格式的文件,类似windows中的exe安装文件,还有绿色免安装的软件包,在压缩包内提供已编译好的执行程序文件,解开压缩包后的文件即可直接使用。(备注使用tar命令制作而成的源代码包文件,经常被称为“TarBall,即“Tar包”

  二、使用RPM包管理工具

  1、RPM简介

  PRM:RedHat Package Manager,因为这个RPM格式的关键包格式是由Red Hat公司首先提出并使用的,后得到广泛使用。它建立统一的数据库文件,详细记录软件包安装、卸载等变化信息,能够自动分析软件包依赖关系。

  RPM包的一般格式为:bash3.116.1.i386.rpm(软件名称版本号发布次数硬件平台,扩展名)

    当然这个格式不固定,因为有时候可能还会加上所适用的操作系统信息,如:wget-1.10.2-7.el5.i386.rpm

  2、使用RPM包管理命令

  RPM命令的主要功能是:

(1). 查询RPM软件、包文件的相关信息
查询已安装的RPM软件信息:rpm  -q[子选项]   [软件名]
查询文件/目录属于哪个RPM软件 :rpm  -qf   文件/目录名
(备注:使用“-q”选项时实际上调用了“/usr/bin/rpmquery”程序完成查询工作,对于“-qa”查询选项,命令参数(即软件包名)是非必须的;一般查询时,软件名不需要指定版本号

[root@localhost ~]# rpm -q bash     ==>查询是否已安装有bash软件包
bash-3.1-16.1
[root@localhost ~]# rpm -qa | grep bash
bash-3.1-16.1

[root@localhost ~]# rpm -qf /usr/bin/vim    ==>查询vim是由哪个软件包安装的
vim-enhanced-7.0.109-3

[root@localhost ~]# rpm -ql dhcp   ==>查询dhcp软件包安装的文件列表
/etc/dhcpd.conf
/etc/rc.d/init.d/dhcpd
……

查询未安装的RPM软件包文件:rpm  -qp[子选项]  [RPM包文件] 

用法:结合不同的子选项 完成不同查询
-qpi:通过.rpm包文件查看该软件的详细信息
-qpl:查看.rpm安装包内所包含的目录、文件列表
-qpc:查看.rpm安装包内包含的配置文件列表
-qpd:查看.rpm安装包内包含的文档文件列表 

[root@localhost Server]# rpm -qpl lynx-2.8.5-28.1.i386.rpm
/etc/lynx-site.cfg
/etc/lynx.cfg
……
==>查询lynx安装包中的文件列表

(2). 安装、升级、卸载RPM软件包
安装或升级RPM软件:rpm  [选项]  [RPM包文件]…  

用法:不同选项适用于不同情况
 -i:安装一个新的rpm软件包
 -U:升级某个rpm软件,若原本未装,则进行安装
 -F:更新某个rpm软件,若原本未装,则放弃安装
卸载指定的RPM软件:rpm  -e  软件名 (备注:卸载软件时只需要指定软件名即可,无需指定版本号
 辅助选项简单介绍: 

–force:强制安装所指定的rpm软件包
–nodeps:安装、升级或卸载软件时,忽略依赖关系
-h:以“#”号显示安装的进度
-v:显示安装过程中的详细信息 

 (备注:–force 辅助选项主要应用于以下两种情况:

    1)缺失某个软件包的文件时,需要进行覆盖安装以找回丢失文件

    2)安装一个比现有软件版本陈旧的软件包(多为测试用途)

  当安装、卸载软件包时,提示缺少依赖包无法进行时,如果仍要继续执行,应结合 –nodeps 选项而不   是 –force 选项 

[root@localhost ~]# rpm -ivh lynx-2.8.5-28.1.i386.rpm  ==>安装一个新的RPM包
warning: lynx-2.8.5-28.1.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing...    ########################################### [100%]
   1:lynx       ########################################### [100%]
                          ==>安装lynx软件包同事显示安装进度
[root@localhost ~]# rpm -q lynx
lynx-2.8.5-28.1
[root@localhost ~]# rpm -e lynx  ==>卸载lynx软件包
[root@localhost ~]# rpm -q lynx
package lynx is not installed

 (备注:“warning:……NOKEY……”的警告信息是由于没有导入RedHat提供的公钥所致,但并不影响安装效果,可以忽略,如果需要导入公钥文件,可以参考如下步骤(以后从RHEL5光盘中安装软件时,就不会再出现警告提示了):[root@localhost ~]# cd /media/cdrom

                  [root@localhost cdrom]# rpm –import RPM-GPG-KEY-redhat-release)

[root@localhost ~]# rpm -i wget-1.10.2-3.2.1.i386.rpm
[root@localhost ~]# rpm -q  wget
wget-1.10.2-3.2.1
[root@mail ~]# rpm -Uvh /media/cdrom/wget-1.10.2-7.el5.i386.rpm ==>升级wget软件包
warning: /media/cdrom/wget-1.10.2-7.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
   1:wget    ########################################### [100%]
[root@localhost ~]# rpm -q  wget
wget-1.10.2-7.el5

(备注:在系统中不存在被升级的软件包时,升级命令的功能等同于安装命令

  解决软件包依赖关系:

1)、安装有依赖关系的多个软件时
被依赖的软件包需要先安装
同时指定多个.rpm包文件进行安装
(备注:如果需要同时安装相互依赖的数十个.rpm软件包,可以结合Shell通配符“*”同时指定这些文件作为参数 
2)、卸载有依赖关系的多个软件时
依赖其他程序的软件包需要先卸载
同时指定多个软件名进行卸载
3)、忽略依赖关系

结合“–nodeps”选项,但可能导致软件异常

 (3). 维护RPM数据库信息

     当RPM数据库损坏时,需要进行数据库重建:rpm  –rebuilddb  或者rpm  –initdb  

  三、从源码包编译安装程序

  1、源码编译简介

  既然有了RPM安装,那么为什么需要源码安装呢?首先它能获得最新的软件版本,及时修复bug;然后它那能根据用户需要,灵活定制软件功能。它的应用场合也非常广泛,比如安装较新版本的应用程序时、当前安装的程序无法满足需要时或者需要为应用程序添加新的功能时等。

  Tarball封包:多为.tar.gz或者tar.bz2格式。

  确认源代码编译环境:

  需要安装支持C/C++程序语言的编译器。

[root@localhost ~]# gcc --version  ==>或g++ -v  [--version]
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)
Copyright (C) 2006 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。
[root@localhost ~]# g++ --version
g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)
……

(备注:在实际编译安装软件的操作中,大多数情况是通过 make 来自动调用gcc或g++进行工作,无需用户手动执行gcc等命令)

  2、从源码编译安装程序的基本过程

解包 —— tar
    解包、释放出源代码文件
配置 —— ./configure    configure 一般是位于软件包目录中的可执行脚本文件
    针对当前系统、软件环境,配置好安装参数
编译 —— make
    将源代码文件变为二进制的可执行程序
安装 —— make install
    将编译好的程序文件复制到系统中
  3、源码编译安装程序示例
  1)、解包
习惯上将软件包释放到 /usr/src/ 目录;解包后的源代码文件位置:/usr/src/软件名-版本号/

 

[root@localhost ~]# tar zxvf axel-1.0a.tar.gz -C /usr/src/
[root@localhost ~]# ls /usr/src/axel-1.0a/
API     axelrc.example  configure  CREDITS  gui       nl.po     tcp.c
axel.1  CHANGES         conn.c     de.po    http.c    README    tcp.h
axel.c  conf.c          conn.h     ftp.c    http.h    search.c  text.c
axel.h  conf.h          COPYING    ftp.h    Makefile  search.h

==>configure执行脚本用于下一步的配置,README或INSTALL文件可提供安装方法

  2)、配置

  (需将工作目录切换到软件源码所在目录;使用源码目录中的 configure 脚本;执行“./configure –help” 可以查看帮助;典型的配置选项: –prefix=软件安装目录)

[root@localhost ~]# cd /usr/src/axel-1.0a
[root@localhost axel-1.0a]# ./configure --prefix=/usr/local/axel 
==>若不指定任何配置选项,将采用默认值

(备注:不同的应用程序其配置参数会存在区别,因此学会使用“./configure –help”非常重要(“./”表示当前目录);用户应用程序习惯上安装到“/usr/local/软件名”文件夹中;编译过程中如果出现错误,通常是由于缺少依赖软件包所致;根据软件大小不同,配置过程可能会需要不同的时间)

  3)、编译  :执行make命令

  4)、安装  :执行make  install命令 

[root@localhost axel-1.0a]# make
[root@localhost axel-1.0a]# make install

    验证已编译安装完成的程序:

 

[root@localhost axel-1.0a]# ls /usr/local/axel/  /usr/local/axel/bin/
/usr/local/axel/:
bin  etc  share
/usr/local/axel/bin/:
axel
[root@localhost axel-1.0a]# /usr/local/axel/bin/axel –help
Usage: axel [options] url1 [url2] [url...]
--max-speed=x      -s x    Specify maximum speed (bytes per second)
……

 

   如有错误,欢迎指正,谢谢!

初识Shell——bash

  Linux中的shell有点类似Windows下的cmd.exe或者.bat。管理整个计算机硬件的其实是操作系统的内核(Kernel),用户无法与内核直接交互,所以通过shell来跟内核通信。即shell介于操作系统(Kernel)和用户之间,它是用户与内核的翻译官,是一个命令解释器。

  常见的shell种类有:Bsh、Csh、Ksh、Bash、Zsh

Bsh和Csh出现的较早,Ksh继承了它两的功能,Bash继承了Bsh和Ksh的升级版,而且是Linux系统中默认的shell,Zsh则兼具了各种shell的程序有点,交互式操作效率更高,但仍不及bash应用广泛。

  Shell环境的切换:

  登录Shell:指用户每次登录系统后自动加载的Shell程序,大多数Linux系统采用 /bin/bash 作为默认登录Shell;/etc/shells 文件记录了系统支持的有效登录Shell

 

[root@localhost ~]# cat /etc/shells   ==>使用chsh -l命令也可查看
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh 
[root@localhost ~]#

  默认的shell是bash,那么如何切换shell环境呢?分为两种,一种是临时切换,即当此终端关闭时,下次启动仍然是bash,方法很简单,直接在终端输入shell名称;第二种则是更改用户登录Shell,需要修改/etc/passwd文件中用户记录的最后一个字段,或者像前面讲到的使用修改用户的命令:usermod  -s  shell程序路径   用户名,也可以使用chsh命令,下次登录有效。

  查看当前shell可以通过/etc/passwd来查看,要查看系统默认使用的shell,可以使用echo $SHELL。

  bash的常用功能:

1)Tab键自动补齐
这个功能可以让您少打很多字,并且确定输入是正确的。tab键接在一串命令的第一个字后面,则为命令补全;若接在一串命令的第二个字后面,则为文件补全;直接在bash提示符后面按两下tab键,则能显示所有可执行的命令。
2)命令编辑快捷键
如之前提到的ctrl+D,ctrl+L,ctrl+U等
3)命令历史
 保存用户曾经执行过的命令操作;存放位置是:~/.bash_history隐藏文件;查看历史命令只需使用history命令就行了。
 调用历史命令:
  !n:执行历史记录中的第n条命令
  !str:执行历史记录中以“str”开头的命令
 设置记录历史命令的条数:修改HISTSIZSE参数即可(在/etc/profile文件里),默认为1000条。
(备注:正确使用历史命令可以有效提高命令行输入的效率,例如:如果之前不久执行过“service network restart”命令,则重新修改了网卡的配置文件以后,通常只需要执行“!ser”操作即可调用该历史命令,以重启network服务。合理控制历史命令的条数可以提高安全性,root用户的命令历史一般建议设置为少于100条
4)命令别名
 为使用较高的复杂命令行设置间断的调用名称,存放位置是:~/.bashrc隐藏文件。查看命令别名只需用alias命令即可。
(备注:手动使用alias命令设置的别名只在当前Shell环境中有效,如alias rm=’rm -i’;若需每次登录Shell环境时设置的别名都有效,需要修改宿主目录中的“.bashrc”文件,添加相应别名设置
5)标准输入输出
交互式硬件设备: 

标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息

类型

设备文件

文件描述编号

默认设备

标准输入

/dev/stdin

0

键盘

标准输出

/dev/stdout

1

显示器

标准错误输出

/dev/stderr

2

显示器

(备注:/dev/stdin、/dev/stdout、/dev/stderr这三个文件是一个符号链接,输入输出与重定向关系紧密)

6)重定向操作
改变标准输入、标准输出、标准错误的方向:

类型

操作符

用途

重定向标准输入

<

将命令中接收输入的途径由默认的键盘更改为指定的文件

重定向标准输出

>

将命令的执行结果输出到指定的文件中,而不是直接显示在屏幕上

>>

将命令执行的结果追加输出到指定文件

重定向标准错误

2>

清空指定文件的内容,并将标准错误信息保存到该文件中

2>>

将标准错误信息追加输出到指定的文件中

重定向标准输出和

标准错误

&>

将标准输出、标准错误的内容全部保存到指定的文件中,而不是直接显示在屏幕上

7)管道操作

  管道操作符号是“|”,连接左右两个命令,将左侧的命令输出的结果,作为右侧命令的输入(处理对象)。管道是脚本语言的特色,它可以讲多个功能连接起来形成一个大的功能,这点与面向对象有很大的不同。

  例如我现在要查看历史记录命令的第4行:则可先将前4条命令显示出来,在显示前4条命令的最后一条:history | head -4  |  tail  -1   这样即取出了第四条命令。

Shell变量

Shell变量和其他语言的变量含义大同小异,就是可以存放不同的内容,它也为灵活管理Linux系统提供特定参数。一般有两层意思:变量名:使用固定的名称,由系统预设或用户定义;变量值:能够根据用户设置、系统环境变化而变化。

Shell变量的种类:

用户自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置用户的Shell工作环境,只有极少数的变量用户可以修改
预定义变量:Bash预定义的特殊变量,不能直接修改
位置变量:通过命令行给程序传递执行参数,如ls -l  /etc/httpd,其中后面两个参数可视为位置参数。

变量的赋值与引用:

定义新的变量名要以英文字母或下划线开头,区分大小写,格式为:变量名=变量值

查看变量的值echo  $变量名

[root@localhost ~]# DAY=Sunday 
[root@localhost ~]# echo $DAY   ==>通过$符号引用指定名称的变量值
Sunday 
[root@localhost ~]#

(注意:在查看变量时,如果变量名容易和后边的字符串连在一起导致混淆,则应该使用大括号将变量名括起来,使用形式为:${变量名}  ,例如:  若已知变量Var的值为Benet,则执行“echo $Var3.0”命令后将显示结果“.0”而不是“Benet3.0”,因为在该命令中,会将“Var3”当成变量名(默认未定义此变量)。若希望正确显示“Benet3.0”的输出结果,则需要执行“echo ${Var}3.0”)

[root@localhost ~]# Var =Benet
[root@localhost ~]# echo $Var
Benet
[root@localhost ~]# echo $Var3.0
.0
[root@localhost ~]# echo ${Var}3.0
Benet3.0
[root@localhost ~]# 

   从键盘输入内容为变量赋值,格式为:read  [-p  “输入信息”]  变量名

[root@localhost ~]#read var
haha    ==>这里等待输入
[root@localhost ~]#echo $var
haha
[root@localhost ~]#

    在给变量赋值时,使用不同的引号操作的区别:

1)使用双引号时,允许在双引号的范围内使用“$”符号引用其他变量的值(变量引用)
2)使用单引号时,将不允许在单引号的范围内引用其他变量的值,“$”符号或者其他任何符号将作为普通字符看待

 

[root@localhost ~]#name=linuxidc
[root@localhost ~]#echo $name
linuxidc
[root@localhost ~]#myname="$name is me"  ==>这里使用的是双引号
[root@localhost ~]#echo $myname
linuxidc is me   ==>将$name这个变量执行出来了
[root@localhost ~]#myname='$name is me'   ==>这里使用的是单引号
[root@localhost ~]#echo $myname
$name is me   ==>原样显示出来了,$name没有执行
[root@localhost ~]#

 

3)使用反撇号时,允许将执行特定命令的输出结果赋值给变量(命令替换),反撇号中的内容要求是可执行的命令。需要嵌套使用时,可以将反撇号改为 $( … ) 的形式
     这么说吧,在一串命令中,在`之内的命令会被先执行,然后将其执行出来的结果作为外部的输入信息。

 

[linuxidc@localhost ~]$ locate crontab
/etc/anacrontab
/etc/crontab
/usr/bin/crontab
/usr/share/man/man1/crontab.1.gz
.....
[linuxidc@localhost ~]$ ls -l `locate crontab`    ==>先执行locate crontab,再执行ls -l
-rw-r--r-- 1 root root    298 2006-12-18 /etc/anacrontab
-rw-r--r-- 1 root root    255 2006-07-15 /etc/crontab
-rwsr-sr-x 1 root root 315416 2008-07-15 /usr/bin/crontab
-rw-r--r-- 1 root root   1846 2008-07-15 /usr/share/man/man1/crontab.1.gz
.....
[linuxidc@localhost ~]$ 

 

 设置变量的作用范围,格式:export  变量名

 一般情况下,父进程的自定义变量是无法在子进程中使用的,但是通过export将变量变成环境变量后,就能够在子进程下使用了。

 

[root@localhost ~]#name=linuxidc
[root@localhost ~]#echo $name
linuxidc
[root@localhost ~]# export name ==>输出为全局变量
[root@localhost ~]# zsh
[root@localhost]~# echo $name
linuxidc
[root@localhost]~# exit
[root@localhost root]# unset  name==>消除变量内容
[root@localhost root]# echo $name

[root@localhost ~]#

变量还有一个好处,当您经常访问一个目录时,而且这个目录比较长,可以将它付给一个简单的变量,这样进入这个目录时候只需cd  变量就行了。如work=”~/temp/2013/test/”,则进入这个目录只需cd  work。

数值变量的运算:

之前讲到过可以使用命令bc来打开一个计算器,其实Bash程序并不适合进行强大的数学运算,例如小数或指数运算的,一般只能进行简单的整数运算,若不使用bc,则也可以使用下列格式来进行简单数值计算:

格式:expr  变量1  运算符  变量2  [..运算符  变量n…]

expr命令常用的运算符有:+、-、\*(注意要有\)、/、%

[linuxidc@localhost ~]$ expr  10 * 2
expr :语法错误
[linuxidc@localhost ~]$ expr 10 \* 2
20
[linuxidc@localhost ~]$expr 10 + 2
12
[linuxidc@localhost ~]$

环境变量

   环境变量配置文件:全局配置文件:/etec/profile

          用户配置文件:~/.bash_profile

 查看环境变量:env  

    set    (set命令可以查看所有的Shell变量,其中包括环境变量)

 常见的环境变量:

$USER、$LOGNAME变量表示当前用户的登录名称
$UID变量表示当前用户的UID号
$SHELL变量表示用户使用的登录Shell
$HOME变量表示用户的宿主目录
$PWD变量表示用户当前的工作目录
$PS1和$PS2变量分别代表了当前用户的主提示符(命令行提示符)和辅助提示符(例如,执行at命令后的“>”)

 位置变量:

    表示为$n,n为1~9之间的数字,$n的作用就是为脚本文件传递执行参数。

    在使用ls命令的时候,ls命令程序如何知道用户是否输入了“-l”、“-a”选项?如何知道用户要查看的是哪个目录?位置变量正是用来解决这个问题的,它可以将用户在命令行输入的参数复制给特定的变量,然后交给程序去处理
例如当执行“service network restart命令行时,第1个位置参数用“$1”表示,对应的值为“network”,第2个位置参数用“$2”表示,对应的值为“restart”;当用户输入的位置参数超过9个时,位置变量 $9 将自动包含最后部分的所有字符串(即使有空格分隔)

[linuxidc@localhost ~]ls -a -l -l  ==>a就是第1个位置变量,依次类推,其实这个命令就是ls -al

 预定义变量:

[root@localhost ~]# bash 
[root@localhost ~]# echo  $0  $$  ==>查看当前所执行进程的名称、PID号
-bash 32484
[root@localhost ~]# exxit   ==>执行一条错误的命令
bash: exxit: command not found
[root@localhost ~]# echo $?   
127    ==>返回非0值,表示上一条命令异常
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $? 
0    ==>返回0,说明上一条命令正常

   灵活使用这些变量,将大大增强Shell脚本程序的功能,$0作为预定义变量,表示当前执行的程序名,需要与$1~$9的位置变量区分开。

  引入shell脚本 

     shell脚本:

用途:完成特定的、较复杂的系统管理任务
格式:集中保存多条Linux命令,普通文本文件
执行方式:按照预设的顺序依次解释执行
Shell脚本类似于Windows系统中.bat批处理文件,只需要有相应的命令解释器即可,不需要编译
  Shell脚本是为了完成一定的管理任务才创建的,因此脚本文件中的各条命令并不是杂乱无章随便放置的,需要用户进行组织和设计 
 
 建立包含执行语句的脚本文件:

[root@localhost ~]# vi repboot.sh
#!/bin/bash  ==>声明使用的shell环境,根据执行的方式不同可加可不加
# To show usage of /boot directory and mode of kernel file.
echo "Useage of /boot: "
du -sh /boot
echo "The mode of kernel file:"
ls -lh /boot/vmlinuz-*
[root@localhost ~]# chmod a+x repboot.sh 

Shell脚本文件的扩展名并无严格的约束,不一定非得是“.sh”结尾,只是便于识别
 
运行Shell脚本程序:

直接执行具有“x”权限的脚本文件
    例如:./repboot.sh
使用指定的解释器程序执行脚本内容
    例如:bash  repboot.sh、sh  repboot.sh
通过source命令(或 . )读取脚本内容执行
    例如:souce  repboot.sh  或  .  hello.sh

(说明:
在调试阶段可以使用Shell程序直接调用脚本文件,不要求脚本具有可执行权限,格式是:bash 脚本名
为脚本文件设置了可执行属性后,在Shell命令行中可以直接通过脚本文件的路径执行脚本程序
使用Bash的内部命令“.”脚本文件执行时,将不会开启新的Shell环境。使用这种方式时,脚本文件作为“.”命令的参数,因此同样不要求具备可执行权限。
 
 

如有错误,欢迎指正。

编写Shell脚本的简单语法

  提到编程,条件、分支、循环等语法肯定少不了。shell脚本编程亦是如此,下面只是结合最近学习的一些简单语法做的笔记,如有错误,欢迎指正。

  if条件语句

  条件测试操作

    test命令:

      用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其它值

      格式:test  条件表达式   或者

         [  条件表达式  ](注意:方括号[]和条件表达式语句之间至少需要一个空格)

  常见的测试类型:测试文件状态;字符串比较;整数值比较;逻辑测试

测试文件状态:[  操作符   文件或目录  ]

常用的测试操作符
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否可执行(Excute)该文件
-L:测试是否为符号连接(Link)文件

如何判断当前所在的工作目录是否为 /usr/src?
[ $PWD = “/usr/src” ] && echo “YES” || echo “NO”
[root@localhost ~]# [  -d /etc/vsftpd  ]
[root@localhost ~]# echo $?
0   ==>返回值为0,表示上一步测试的条件成立
[root@localhost ~]# [  -d /etc/hosts  ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -e /media/cdrom ] && echo "YES"   ==>如果测试的条件成立则输出“YES”
YES 
[root@localhost ~]# [ -e /media/cdrom/Server ] && echo "YES“
[root@localhost ~]#

    上述&&是“与”的意思,“… && echo YES”表示如果没有输出,则表示前面执行的测试条件不成立或命令出错。备注:l测试文件是否可写(-w)时,不要以root用户(特权用户)的身份执行测试,否则可能会无法准确判断)

整数值比较:[  整数1  操作符  整数2  ]

常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)

 

[root@localhost ~]# who | wc -l
5
[root@localhost ~]# [ `who | wc -l` -le 10 ] && echo "YES"  ==>如果登录用户数小于或等于10则输出YES
YES 
[root@localhost ~]# df -hT | grep "/boot" | awk '{print $6}'
12% 
[root@localhost ~]# BootUsage=`df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f 1`

解释: df -hT                查看所有分区的磁盘空间使用情况
grep “/boot”          过滤出关于/boot分的数据行
awk ‘{print $6}’      以空格为分隔符,只取第六个字段数据
cut -d “%” -f1        以%为分隔符,只取第一个字段数据

[root@localhost ~]# echo $BootUsage
12
[root@localhost ~]# [ $BootUsage -gt 95 ] && echo "YES"  ==>如果/boot分区的磁盘使用率超过95%则输出YES

条件测试操作:[  字符串1 =  字符串2  ]

常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空

[root@localhost ~]# read -p "Location:" FilePath
Location:/etc/inittab
[root@localhost ~]# [ $FilePath = "/etc/inittab" ] && echo "YES" ==>如果键入路径与指定的目录一致则输出YES
YES 
[root@localhost ~]# [ $LANG != "en.US" ] && echo $LANG  ==>如果当前的语言环境不是en_US,则输出LANG变量的值
zh_CN.UTF-8 

(字符串比较可以用于检查用户输入,例如在提供交互式操作时,判断用户输入的选择项是否与指定的变量内容相匹配)

逻辑测试:[  表达式1  ]  操作符  [  表达式2  ]

     常用的测试操作符
-a或&&:逻辑与,“而且”的意思前后两个表达式都成立时整个测试结果才为真,否则为假)
-o或||:逻辑或,“或者”的意思操作符两边至少一个为真时,结果为真,否则结果为假)
!:逻辑否 当指定的条件不成立时,返回结果为真)

[root@localhost ~]# echo $USER
root
[root@localhost ~]# [ $USER != "teacher" ]  &&  echo "Not teacher" ==>如果发现用户不是teacher,则提示“Not teacher”
Not teacher
[root@localhost ~]# [ $USER = "teacher" ]  ||  echo "Not teacher"
Not teacher  

逻辑测试指的是:同时使用两个(或多个)条件表达式时,判断它们之间的关系

  if语句结构——当“条件成立”时执行相应的操作

      单分支:

if  条件测试命令 

    then   命令序列

fi                                      

  if语句简单应用示例

#!/bin/bash
temp=2
if [  $temp -eq 2  ]
then 
    echo 'temp is 2'
fi

   保存为test文件,并将它设置为可执行(+x)

[jzhou@localhost ~]# chmod 775 test
[jzhou@localhost ~]# bash test
temp is 2

     (备注:lthen可以写到与if一行,但要用分号隔开,例如: if  [  $RATE  -gt  80  ]  ;  then)

  单分支:

if  条件测试命令 

    then  命令序列1 

    else  命令序列2

fi

 
判断mysqld是否在运行,若已运行则输出提示信息,否则重新启动mysqld服务

#!/bin/bash
service mysqld status &> /dev/null 
if  [  $?  -eq  0  ]   ==>判断上句是否执行成功
    then
        echo  "mysqld service is running."
    else
        /etc/init.d/mysqld  restart
fi

 

 

提示用户输入一个整数,如何判断该值是否小于100?
read  “Input an integer:” NUM ; 
           if  [ $NUM  -lt  100 ] ; then
               echo “小于100”
           else
              echo  “大于或等于100”
           fi

 

  多分支: 

if  条件测试命令1  ;  then

    命令序列1

elif  条件测试命令2  ;  then

    命令序列2

elif  …

else

    命令序列n

fi

  for循环语句——根据变量的不同取值,重复执行一组命令操作

   for语句的结构

for  变量名  in  取值列表

do

    命令序列

done

   for语句简单应用示例

 

依次输出3条文字信息,包括一天中的“Morning”、“Noon”、“Evening”字串
[root@localhost ~]# vi showday.sh
#!/bin/bash
for TM in "Morning" "Noon" "Evening"
do
    echo "The $TM of the day."
done 

 

[root@localhost ~]# sh showday.sh
The Morning of the day.
The Noon of the day.
The Evening of the day 

 

 示例2:获得用户的满足条件的文件数
#!/bin/bash DIR="/opt" LMT=100 ValidUsers=`grep "/bin/bash" /etc/passwd | cut -d ":" -f 1` ==>获得使用bash作为登录shell的用户名列表 for UserName in $ValidUsers do Num=`find $DIR -user $UserName | wc -l` if [ $Num -gt $LMT ] ; then echo "$UserName have $Num files." fi done

 

[root@localhost ~]# sh chkfileown.sh
root have 6737 files.
teacher have 344 files. 

  while循环语句——重复测试指定的条件,只要条件成立则反复执行对应的命令操作

  while语句的结构

 while  命令或表达式 

 do 

      命令列表

 done

  while语句简单应用示例

批量添加20个系统用户帐号, 用户名依次为“stu1”、“stu2”、……、“stu20”
#!/bin/bash
i=1
while  [  $i  -le  20  ]
do
    useradd stu$i
    echo "123456" | passwd --stdin stu$i &> /dev/null
    i=`expr $i + 1`
done 

 

 

批量删除上述添加的20个系统用户帐号
#!/bin/bash
i=1
while  [  $i  -le  20  ]
do
    userdel -r stu$i
    i=`expr $i + 1`
done 

  分支控制语句

  case语句——根据变量的不同取值,分别执行不同的命令操作

case  变量值  in

    模式1)

          命令序列1

          ;;

    模式2)

          命令序列2

          ;;

  ……

    * )

          默认执行的命令序列

esac

(当遇到双分号“;;”后跳转至esac表示结束分支。如果一直找不到相匹配的值,则执行最后一个模式“*)”后的默认命令序列,直到遇到esac后结束分支)

#!/bin/bash 
case   $1   in
    start)
        echo  "Start MySQL service."
        ;;
    stop)
        echo  "Stop MySQL service."
        ;;
    *)
        echo  "Usage:$0  start|stop"
        ;;
esac

(/etc/init.d/ 目录下的各类脚本中,大量使用了case分支语句结构)

#!/bin/bash
read  -p  "Press some key, then press Return:“  KEY
case  "$KEY“  in
  [a-z]|[A-Z])
      echo "It's a letter."
      ;;
  [0-9])
      echo "It's a digit."
      ;;
  *)
      echo "It's function keys、Spacebar or other keys. "
esac

匹配模式中可以使用方括号表示一个连续的范围,例如“[0-9]”;使用竖杠符号“|”表示或,例如“A|B”A或者B

  unitl语句——根据条件执行重复操作

until  条件测试命令

do

      命令序列

done

(•until 循环的结构与while命令类似,“until通过检测其后接命令的返回值“$?”来判断是否退出循环

   •until:直到”测试条件“成立时终止循环,而while是:当”测试条件“成立时进行循环

   •即:until在测试条件为假(非0)时执行循环,条件为真时(0)退出循环,正好与while循环相反)

 

  shift语句——用于迁移位置变量,将 $1~$9 依次向左传递(不常用)

例如,若当前脚本程序获得的位置变量如下:
 $1=file1、$2=file2、$3=file3、$4=file4
则执行一次shift命令后,各位置变量为:
 $1=file2、$2=file3、$3=file4
再次执行shift命令后,各位置变量为:
 $1=file3、$2=file4

通过命令行参数传递多个整数值,并计算总和
[root@localhost ~]# vi showday.sh
#!/bin/bash
Result=0
while  [  $#  -gt  0  ]  ==> $# 为预定义变量,表示位置参数的个数
do
    Result=`expr $Result + $1`
    shift
done
echo "The sum is : $Result"

 

[root@localhost ~]# ./sumer.sh  12  34  56
The sum is : 102 

  循环控制语句

    break:在for、while、until等循环语句和case中用于跳出当前的循环体,执行循环体后的语句;并不退出程序。执行break命令后将跳到done语句之后。

 

    continue:在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环

  shell函数应用

  定义新的函数:

   

  调用已定义的函数: 函数名

  向函数内传递参数:函数名   参数1   参数2 ……

#!/bin/bash
adder() {
    echo `expr $1 + $2`
}
adder 12 34
adder 56 789
[root@localhost ~]# sh adderfun.sh
46
845 

(在脚本内部,已经定义的函数就好比“内部命令”一样,可作为执行语句直接使用)

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-03/114334.htm

赞(0) 打赏
转载请注明出处:服务器评测 » Linux操作系统学习笔记
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏