学习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:

