字符转换命令
tr col join paste expend
tr可以用来删除一段信息当中的文字,或者进行文字信息的替换
tr -d str 删除信息当中的str这个字符
-s取代掉重复的字符
col
-x 将tab键转换成对等的空格键
expend
将tab转换成8个空格键
-t 后接数字n,自定义将tab键转换成n个空格
join
-tjoin预设以空格符分隔数据,并且比对第一个字段的数据,如果两个档案相同,则将两个数据联成一行,且第一个字段放在第一个
-i忽略大小写的差异
-1这个是数字1,代表第一个档案要用那个字段来分析的意思
-2第二个档案要用那个字段来分析的意思
paste
-d后面可以接分隔字符
-如果file部分写成-
split
-b后面接欲分割的档案的大小,可加单位 split -b 200 filename grep
-l以行数来进行分隔
参数代换xargs
xargs command
-e是eof的意思。后面可以接一个字符串,当xargs分析到这个字符串时,就会停止工作
-p在执行每一个命令的参数时,都会询问用户的意思
-n后面接次数,每次command命令执行时,要使用几个参数
当xargs后面没有接任何命令时,默认为echo输出
12.3 善用判断式
12.3.1 利用test命令的测试功能-pg395
测试的参数 代表意义
1.关于某个文件名的【文件类型】判断,如test -e filename
-e 该【文件名】是否存在(常用)
-f 该【文件名】是否存在且为文件(file)(常用)
-d 该【文件名】是否存在且为目录(dictionary)(常用)
-b 该【文件名】是否存在且为一个 block device 设备
-c 该【文件名】是否存在且为一个 character device 设备
-S 该【文件名】是否存在且为一个socket文件
-p 该【文件名】是否存在且为一个FIFO(pipe)文件
-L 该【文件名】是否存在且为一个链接文件
2.关于文件的权限检测,如test -r filename
-r 检测该文件名是否存在且具有【可读】的权限
-w 检测该文件名是否存在且具有【可写】的权限
-x 检测该文件名是否存在且具有【可执行】的权限
-u 检测该文件名是否存在且具有【SUID】的属性
-g 检测该文件名是否存在且具有【SGID】的属性
-k 检测该文件名是否存在且具有【Sticky bit】的属性
-s 检测该文件名是否存在且为【非空文件】
3.两个文件之间的比较,如test file1 -nt file2
-nt (newer than)判断file1是否比file2新
-ot (older than)判断file1是否比file2旧
-ef 判断file1与file2是否为同一文件,可用在判断hard link的判定上。主要意义在判定,两个文件是否均指向同一个inode
4.关于两个整数之间的判定,如test n1 -eq n2
-eq 两数值相等(equal)
-ne 两数值不等(not equal)
-gt n1大于n2(greater than)
-lt n1小于n2(less than)
-ge n1大于等于n2(greater than or equal)
-le n1小于等于n2(less than or equal)
5.判定字符串的数据
test -z string 判定字符串是否为0?若string为空字符串,则为true
test -n string 判定字符串是否非为0?若string为空字符串,则为false。注:-n亦可忽略
test str1 == str2 判定str1是否等于str2,若相等,则返回true
test str1 != str2 判定str1是否不等于str2,若相等,则返回false
6.多重条件判定,例如:test -r filename -a -x filename
-a (and)两条件同时成立。例如tset -r file -a -x file,则file同时具有r与x权限时,才返回true
-o (or)两条件任何一个成立。例如tset -r file -o -x file,则file同时具有r与x权限时,就可返回true
! 反相状态,如test ! -x file,当file不具有x时,返回true
由于root在很多权限的限制上面都是无效的,所以使用root执行这个脚本时,常常会发现与ls -l观察到的结果并不相同。
12.3.2 利用判断符号-pg397
还可以利用判断符号【[]】(就是中括号)来进行数据的判断。
注意:中括号两端需要有空格符来分割,比如: [ -z $() ]
在中括号[]内的每个组件都需要有空格来分割;
在中括号内的变量,最好都以双引号括号起来;
在中括号内的常数,最好都以单或双引号括号起来。
12.3.3 shell脚本的默认变量-pg399
比如:
/path/to/scriptname opt1 opt2 opt3 opt4
(第一列是$0,第二列是$1,以此类推)
$# : 代表后接的参数【个数】,以上表为例这里显示为【4】;
$@ : 代表【“$1"”$2"“$3"”$4"】之意,每个变量是独立的(用双引号括起来);
$* : 代表【“$1c$2c$3c$4c”】,其中c为分割字符,默认为空格,所以本例中代表【“$1 $2 $3 $4”】之意。
注意:shift可以移动变量,而且shift后面可以接数字,代表拿掉前面几个参数的意思。
12.4 条件判断式
12.4.1 利用if…then-pg401
单层、简单条件判断式
if [ 条件判断式 ];then
当条件判断式成立时,可以进行的命令工作内容;
fi <==将if反过来写,就成为fi,结束if的意思。
- && 代表AND
- || 代表OR
多重、复杂条件判断式
#一个条件判断,分成功执行与失败执行(else)
if [ 条件判断式 ];then
当条件判断式成立时,可以进行的命令工作内容;
else
当条件判断式不成立时,可以进行的命令工作内容;
fi <==将if反过来写,就成为fi,结束if的意思。
如果考虑更复杂的情况:
#多个条件判断,分多种不同情况执行(if...elif...elif...else)
if [ 条件判断式一 ];then
当条件判断式一成立时,可以进行的命令工作内容;
elif [ 条件判断式二 ];then
当条件判断式二成立时,可以进行的命令工作内容;
else
当条件判断式一与二均不成立时,可以进行的命令工作内容;
fi <==将if反过来写,就成为fi,结束if的意思。
学一个有趣的命令
netstat
这个命令可以查询到目前主机开启的网络服务端口(service ports),利用【netstat -tuln】来获取目前主机启动的服务。
几个常见的端口与相关网络服务的关系:
80 : WWW
22 : ssh
21 : ftp
25 : mail
111 : RPC(远程过程调用)
631 : CUPS(打印服务功能)
12.4.2 利用case…esac-pg405
case $变量名称 in <==关键字是case,还有变量前有美元符号。
"第一个变量内容") <==每个变量内容建议用双引号括起来,关键字则为右圆括号。
程序段
;; <==每个内别结尾使用两个连续的分号来处理。
"第二个变量内容") <==每个变量内容建议用双引号括起来,关键字则为右圆括号。
程序段
;; <==每个内别结尾使用两个连续的分号来处理。
*) <==最后一个变量内容都会用*来代表所有其他值。
不包含第一个变量内容与第二个变量内容的其他程序执行段。
exit 1
;;
esac <==将case反过来写,就成为esac,结束case的意思。
一般来说,使用【case 变 量 i n 】 这 个 语 法 时 , 当 中 的 那 个 【 变量 in】这个语法时,当中的那个【 变量in】这个语法时,当中的那个【变量】大致有两种获取方法:
直接执行式:例如上面提到的,利用【 script.sh variable 】的方式来直接给予 $1 这个变量的内容,这也是在 /etc/init.d 目录下大多数程序的设计方式;
交互式:通过read这个命令来让用户输入变量的内容。
12.4.3 利用利用function功能-pg406
function fname(){
程序段
}
注意:因为shell脚本的执行方式是从上到下、从左到右,因此在shell脚本当中的function的设置一定要在程序的最前面。
function也是拥有内置变量的,它的内置变量与shell脚本很类似,函数名称代表示 $0 ,后续接的变量也是以 $1、$2…来替换的。
12.5 循环(loop)
12.5.1 while do done、until do done(不定循环)-pg408
while [ condition ] <==中括号内的状态就是判断式
do <==do是循环的开始
程序段落
done <==done是循环的结束
while是【当condition条件成立时,就进行循环,直到condition的条件不成立才停止】
until [ condition ] <==中括号内的状态就是判断式
do <==do是循环的开始
程序段落
done <==done是循环的结束
until与while相反,它是【当condition条件成立时,就终止循环,否则就持续进行循环的程序段】
12.5.2 for…do…done(固定循环)-pg409
for这种语法,则是【已经知道要进行几次循环】的状态
for var in con1 con2 con3 ...
do
程序段
done
这个 $var 的变量内容在循环工作时:
第一次循环时,$var的内容为con1;
第二次循环时,$var的内容为con2;
第三次循环时,$var的内容为con3;
…
$(seq 1 100) # seq为sequence(连续)的缩写之意
还可以使用 {1…100}来替换$(seq 1 100),都是从1到100连续取值的含义。
12.5.3 for…do…done的数值处理-pg411
for (( 初始值;限制值;赋值运算 ))
do
程序段
done
for括号内的含义:
初始值 : 某个变量在循环当中的起始值,直接以类似i=1设置好;
限制值 : 当变量的值在这个限制值的范围内,就继续进行循环,例如i<=100;
赋值运算 : 每做一次循环,变量也变化,例如i=i 1。