cp test[1-5] /tmp --test1, test2, test3, test4, test5若存在,就将其复制到/tmp下 还有如:cp *[A-Z]*等,如果有大写字母,就把文件copy下来
command1 && command2 --第一个command1 的执行结果如果有错误,第二个就不被执行
command1 || command2 --第一个command1 的执行结果如果有错误,第二个才被执行
7、绝对路径和相对路径
系统默认是不主动搜寻当前目录下的执行文件。所以执行当前目录的命令,需要用到./command --安全性考虑
8、命令重定向
重定向(redirect):将您目前的所得数据转到其他地方
例:ls -l / > test,大于号“>”就是将输出结果导向到test文件的意思。
该文件(就是test)若不存在,系统会自动建立它;
若这个文件存在,系统会先将这个文件内容清空,然后再将数据写入。也就是说,若以 > 将内容输出到一个已有文件中,该文件的原有内容就会被覆盖掉。
< --由 < 的右边读入参数文件 将原本需要由键盘输入的数据经由文件读入
> --将原本由屏幕输出的正确数据输出到 > 右边的file(文件名称)或device(设备,如printer)
>> --将原本由屏幕输出的正确数据输出到 >> 右边,与 > 不同的是,该文件将不会被覆盖,而新的数据将以累加方式添加到文件的最后面
2> --将原本应该由屏幕输出的错误数据输出到2>的右边 标准输出:代码为1
1> --标准输出:代码为1,或称为stdout
/dev/null --可以视为垃圾设备,垃圾处理机
ls -al 1> list.txt 2> list.err --将显示数据正确输出到 list.txt,错误的数据输出到list.err
ls -al 1> list.txt 2>&1 --将显示数据不论正确或错误均输出到list.txt中。注意,错误与正确信息输出到同一个文件中,则必须以上面的方法来写,不能写成其他格式
ls -al 1> list.txt 2> /dev/null --将显示的数据,正确的输出到list.txt,错误的数据予以丢弃!
mail -s "test" root < /root/.bashrc --将.bashrc内容寄给root
9、管线命令
管线(pipe)命令使用的是“|”界定符号,管线命令“|”仅能处理经由前一个指令传来的正确信息,也就是标准输出(Stdout)信息,对于标准错误信息并没有直接处理能力。每个管线部分都是指令,而后一个指令的输入乃是前一个指令的输出。
常用管线命令:
cut -d "分隔字符" [-cf] fields
-d后面接为分割字符,默认为空格符
-c后面接的是第几个字符
-f后面接的是第几个区块
sort [-t 分隔符] [(+起始)(-结束)] [-nru]
-t 分隔符 使用分隔符隔开不同区块,默认是tab
+start -end 由start区块排序到end区块
-n 使用纯数字排序(否则使用字母排序)
-r 反向排序
-u 相同出现的行只列出一次
wc [-lmw]
-l 多少行
-m 多少字符
-w 多少字
uniq --删除重复的行只显示一个 uniq所认为的重复行是指连续出现的重复行
tree --以树状图列出目录的内容
tr [-ds] SET1 -- d删除SET1这个字符串 s取代重复字符 例:tr '[a-z]' '[A-Z]' 将小写改成大写
split [-bl] n 输入文件 输出文件前导字符 -- b以文件size来分 l以文件行数来分 n多少行或字节为一个文件
xargs
awk awk [-参数 变量] 'BEGIN{初始化}条件类型1{动作1}条件类型2{动作2}。。。。END{后处理}'
其中:BEGIN和END中的语句分别在开始读取文件(in_file)之前和读取完文件之后发挥作用,可以理解为初始化和扫尾。
三、压缩指令与正规表示法
1、压缩指令
compress [-d] --用来压缩与解压缩后缀名为*.Z的指令 d为解压缩参数,也可以用uncompress代替
bzip2 [-dz] filename --压缩解压缩后缀名为*.bz2的指令 d为解压缩参数,也可以用bunzip2代替 z为压缩参数 .bz,.bz2,.tbz,.tbz2也可尝试用该命令解压
bzcat --读取*.bz2的内容
gzip [-d#] --用来压缩与解压缩后缀名为*.gz的指令 -#压缩等级,1最不好,9最好,6默认值
zcat --这个指令可以同时读取compress与gzip的压缩文件
tar [-zxcvfpP] filename
-z --是否同时具有gzip 例tar -zcvf directory.tar.gz directory
-x --解开一个压缩文件
-t --查看*.tar里面的文件
-c --建立一个压缩文件
-v --压缩过程中显示文件
-f --使用文件名
-p --使用原文件的原有属性(属性不会依据用户而变)
-P --可以使用绝对路径
-N --比后面接的日期(YY/MM/DD)还要新的文件才会被打包进新建的文件中 例tar -N '2002/06/25' -zcvf home.tar.gz /home
--exclude FILE --在压缩过程中,不将FILE打包 例tar -zcvf host.tar.gz / --exclude /mnt --exclude /proc 不将/mnt和/proc 打包
cpio -covB > [file|device] --备份
cpio -icduv < [file|device] --还原
cpio无法直接读取文件,需要每个文件或目录的路径连同文件名一起才可以被记录下来,因此,cpio最常跟find指令一起使用。可以备份任何文件,包括/dev下的任何设备文件。
-o --将数据复制输出到文件或设备上
-i --将数据自文件或设备复制出到系统中
-t --查看CPIO建立的文件或设备的内容
-c --以一种较新的便携格式(portable format)储存
-v --让储存过程中文件名称可以在屏幕上显示
-B --让默认的Blocks可以增至5120bytes,默认为512bytes。这样的好处是可以让大文件的储存速度加快
-d --自动建立目录,由于cpio的内容可能不在同一目录内,如此在反备份过程会有问题。这个时候加上-d,就可以将需要的目录自动建立起来。
-u --自动用较新的文件覆盖较旧的文件
2、正规表示法
grep "word" filename 将文件中包含word的那一行显示出来
常见通配符及含义
^ --句首字符相符
$ --句尾相同的字符
? --任何一个单一字符
* --随意几个任意字符
--跳转符号,将特殊字符变成普通字符
[list] --列表中的字符
[range] --列表中范围内的字符
[^list] --反向选择,与 [list] 相反
[^range] --反向选择,与 [range]相反
{n} --与前一个相同字连续n个
{n,m} --与前一个相同字连续n-m个
示例:
grep ^[w-z] /etc/* 只要句首是W-Z就把它列出
grep [XYZ] /etc/* 只要含有XYZ中任何一个字符就把它列出
四、学习使用Shell Scripts
1、脚本的执行
执行脚本,bash根据以判断执行的步骤为:
如果执行到一个Enter符号(CR),就尝试开始执行该行命令。
指令间多个空白将被忽略;空白行也将被忽略,且Tab也不会被理会。
如果一行内容太多,则可以使用延伸至下一行。
此外,使用最多的#可做为注释。任何加在#后的字,将全部被视为注释文字而被忽略。
在撰写脚本时,最好养成如下良好的习惯:
先宣告使用的shell为何(特别留意这一点,在某些情况下,例如/etc/crontab,如果没有宣告使用的shell,常会出现错误信息而导致脚本无法被执行)。
在 # 之后加上 ! 与 shell 的名称,用来宣告使用的 shell。
注明该脚本的内容功能、版本信息、作者、文件创建日期等。
每一个大步骤的主要功能(也顺便供自己未来做修改之用)。
2、卷标与运算符declare
declare [-afirx] --声明变量 例declare -i number2=2*3+5*13-32+25
-a --定义为数组 array
-f --定义为函数 function
-i --定义为整数 integer
-r --定义为只读
-x --定义为通过环境输出变量
例:
declare -i a=3
declare -i b=5
declare -i c=$a*$b
echo $c
3、交互式脚本
read 变量名 --把输入的内容放到变量中
myscript opt1 opt2 opt3 opt4 --定义一个脚本的参数代号 注:通过实践,$0只能用来定义脚本名称
$0 $1 $2 $3 $4
4、脚本逻辑判断式与表达式
逻辑判断式
逻辑卷标 含义
1. --关于文件与目录的逻辑卷标
-f --常用!检测文件是否存在
-d --常用!检测目录是否存在
-b --检测是否为一个block文件
-c --检测是否为一个character文件
-S --检测是否为一个socket标签文件
-L --检测是否为一个符号链接文件
-e --检测某个东西是否存在!可以是任何东西
2. --关于程序的逻辑卷标
-G --检测是否由GID所执行的程序拥有
-O --检测是否由UID所执行的程序拥有
-p --检测是否为程序间传送信息的name pipe或FIFO
3. --关于文件的属性检测
-r --检测是否为可读属性
-w --检测是否为可写入属性
-x --检测是否为可执行属性
-s --检测是否为非空白文件
-u --检测是否具有SUID属性
-g --检测是否具有SGID属性
-k --检测是否具有sticky bit属性
4. --两个文件之间的判断与比较。例如test file1 -nt file2
-nt --第一个文件比第二个文件新
-ot --第一个文件比第二个文件旧
-ef --第一个文件与第二个文件为同一个文件(诸如链接文件)
5.--逻辑与(and)和或(or)
&& --逻辑与
|| --逻辑或
运算符
= --等于
!= --不等于
< --小于
> --大于
-eq --等于
-ne --不等于
-lt --小于
-gt --大于
-le --小于或等于
-ge --大于或等于
-a --双方都成立(and)
-o --单方成立(or)
-z --空字符串
-n --非空字符串
6、条件判断
if...then...fi
if [ 条件判断一 ] && (||) [ 条件判断二 ]; then --if 是起始,后面可以接若干个判断式,使用 && 或 ||执行判断
elif [ 条件判断三 ] && (||) [ 条件判断四 ]; then --第二段判断,如果第一段不符合要求就转到此搜寻条件,执行第二段程序
else --当前两段都不符合时,就执行这段内容
fi --结束 if then 的条件判断
上面的意思是:中括号[]里的是条件表达式,如果是复合条件判断(如若A及B则C之类的逻辑判断),那么就需要在两个中括号之间加&&(and)或| |(or)这样的逻辑运算符。如果是多重选择,那么需要以elif(可选的,需要时才加上)新增另一个条件;如果所有的条件都不适用,则使用else(可选的)执行最后的内容。
注意:
在 [ ] 中,只能有一个判断式;
在 [ ] 与 [ ] 间,可以使用&&或| |结合判断式;
每一个独立的组件之间需要用空格键隔开。
例:
echo "Press y to continue"
read yn
if [ "$yn" = "y" ] || [ "$yn" = "Y" ]; then
echo "script is running..."
else
echo "STOP!"
fi