适合初学者的Shell核心知识笔记(下)

目录

目录

五、条件判断

六、流程控制

if判断

单分支:

多分支

case语句

for循环

while循环

七、read读取控制台输入

八、函数

系统函数

basename

dirname

自定义函数

九、正则表达式

常规匹配

常用特殊字符

特殊字符:^

特殊字符:$

特殊字符:.

特殊字符:*

特殊字符:\

十、文本处理工具



五、条件判断

语法:

1.test  condition

2.[  condition  ] (注意 condition 前后要有空格)

注意:条件非空即为true, [  aaa  ] 返回 true,[    ] 返回false

常用的判断条件

两个整数之间比较

-eq        等于(equal)                        -ne        不等于(not  equal)

-lt          小于(less  than)                  -le         小于等于(less  equal)

-gt         大于(greater  than)             -ge        大于等于(greater  equal)

注:如果是字符串之间的比较,用等号 “=” 判断相等;用“!=” 判断不等。

按照文件权限进行判断

-r         有读的权限(read)

-w        有写的权限(write)

-x         有执行的权限(execute)

按照文件类型进行判断

-e        文件存在(existence)

-f        文件存在并且是一个常规的文件(file)

-d        文件存在并且是一个目录(directory)

例:

[  -w  helloworld.sh  ]

多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)

例:

[  aa  ]  &&  echo  OK  ||  echo  noOk

六、流程控制

if判断

基本语法

单分支:

if  [  条件判断式  ];

then

        程序

fi

或者

if  [  条件判断式  ];

then

        程序

fi

多分支

if  [  条件判断式  ]

then

        程序

elif  [  条件判断式  ]

then

        程序

else

        程序

fi

***** 1.[  条件判断式  ],中括号和条件判断式之间必须有空格

         2.if 后要有空格

case语句

基本语法

case  $变量名  in

"值 1")

        如果变量的值等于值1,则执行程序1

;;

"值 2")

        如果变量的值等于值2,则执行程序2

;;

        ...省略其他分支...

*)

        如果变量的值都不是以上的值,则执行此程序

;;

esac

*****1.case行尾必须为单词 “ in ” ,每一个模式匹配必须以右括号“ ) ”结束。

        2.双分号“;;”表示命令序列结束,相当于 java 中的break。

        3.最后的“ * ” 表示默认模式,相当于 java 中的default。

for循环

基本语法1

for  ((  初始值;循环控制条件;变量变化  ))

do

        程序

done

例如:

#!/bin/bash

sum=0

for((  i=0;i<=100;i++  ))

do

        sum=$[ $sum+$i ]

done

echo  $sum

基本语法2

for  变量  in  值 1  值 2  值 3

do

        程序

done

while循环

基本语法

while  [  条件判断式  ]

do

        程序

done

七、read读取控制台输入

基本语法

read(选项)(参数)

1.选项:

        -p:指定

        -t:指定读取值时等待的时间(秒)如果不加 -t 表示一直等待

2.参数

        变量:指定读取值的变量名

八、函数

系统函数

basename

基本语法

basename[string/pathname][suffix]

basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

basename        可以理解为读取路径里的文件名称

选项:

suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix去掉。

dirname

基本语法

dirname 文件绝对路径

从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

dirname        可以理解为获取文件路径的绝对路径名称

自定义函数

基本语法

[  function  ] funname[()]

{

        Action;

        [return  int;]

}

经验技巧

1.必须在调用函数地方之前,先声明函数,shell脚本是逐行运行,不会像其它语言一样先编译。

2.函数返回值,只能通过 $? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)

例:

#!/bin/bash

function sum()

{

        s=0

        s=$[$1+$2]

        echo "$s"

}

九、正则表达式

        正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep,sed,awk等文本处理工具都支持通过正则表达式进行模式匹配。

常规匹配

 一串不包含特殊字符的正则表达式匹配它自己,例如:

cat  /etc/password  |  grep  a

就会匹配所有包含a的行

常用特殊字符

特殊字符:^

^ 匹配一行的开头,例如:

cat  /etc/password  |  grep  ^a

会匹配所有以a开头的行

特殊字符:$

$ 匹配一行的结束,例如

cat  /etc/password  |  grep  a$

会匹配所有以a结尾的行

特殊字符:.

. 匹配一个任意的字符,例如

cat  /etc/password  |  grep  r..t

会匹配包含rabt/rbbt/rxdt/root等的所有行

特殊字符:*

* 不单独使用,他和上一个字符连用,表示匹配上一个字符 0 次或多次,例如

cat  /etc/password  |  grep  ro*t

字符区间(中括号):||

[ ]      表示匹配某个范围内的一个字符,例如

[6,8]------匹配 6 或者 8

[0-9]------匹配一个 0-9 的数字

[0-9]*------匹配任意长度的数字字符串

[a-z]------匹配一个 a-z 之间的字符

[a-z]* ------匹配任意长度的字母字符串

[a-c, e-f]-匹配 a-c 或者 e-f 之间的任意字符

例:

cat /etc/passwd | grep r[a,b,c]*t

会匹配 rt,rat, rbt, rabt, rbact,rabccbaaacbt 等等所有行

特殊字符:\

\ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含 '$' 的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如

cat /etc/passwd | grep ‘a\$b’

就会匹配所有包含 a$b 的行。注意需要使用单引号将表达式引起来。

十、文本处理工具

cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

基本用法

cut [选项参数] filename

说明:默认分隔符是制表符

-f                 列号,提取第几列

-d                分隔符,按照指定分隔符分割列,默认是制表符“\t”

-c                 按字符进行切割 后加加 n 表示取第几列 比如-c 1

猜你喜欢

转载自blog.csdn.net/a2285786446/article/details/127763494