Linux笔记09

2023-03-09 16:27:35 浏览数 (1)

字符转换命令

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。

0 人点赞