linux-shell脚本编程(基础)

时间:2022-01-04 15:36:14

正则表达式

  *  代表零个或多个字符:

    ?  代表单个字符

 

shell脚本第一句:  #!/bin/bash      指定该shell脚本是用哪个shell执行的

 

``              反引号里面的命令先执行

\              反义字符

>              输出重定向

>>              输出重定向
<              将文本中的命令输入到命令行

<<              内联输入重定向(允许在命令行而不是在文件指定输入重定向数据,而且必须指定一个文本标记来划分输入数据的开头和结尾)

|              管道符号

?(变量)          记录程序执行状态的返回值

 

echo xxxx        默认不需要用引号将要显示的文本圈起来

              但是如果在字符串中用到了引号,则需要用另一个引号将文本圈起来

 

expr  math-state    执行数学表达式的计算

$[math-state]       执行数学表达式的计算并进行赋值(只能进行整型数据的计算)

bc            bash内置的计算器(先执行再将结果返回,或者使用内联输入重定向来执行多条语句)

 

结构化命令:

if-then语句:

if command

then

  commands

fi

then部分可以写入多条命令,bash shell会将这部分的命令当作一个块

bash shell的if语句会运行if行定义的那个命令,如果该命令的状态返回值为0(该命令执行成功),位于then部分的命令就会被执行,如果命令的退出码的状态是其他的什么值,那么then部分的命令就不会被执行

if-then-else语句:

if  command

then

  commands

else

  commands

fi

当if语句中的返回退出状态码为0时,执行then语句中的命令,当返回非0状态码时,执行else中的命令

嵌套if语句

if  command1

then

  commands

elseif command2

then

  more commands

fi

if语句的高级特性:

  (1)用于数学表达式的双圆括号  

      ((expression))      术语expression可以是任意的数学赋值或比较表达式,,也可以是:++,--,逻辑取反,位取反,**(幂预算),<<左移,>>,位与,位或,逻辑与,逻辑或    双圆括号内字符不需要转义

  (2)用于高级字符串处理功能的双方括号(针对字符串)

      [[expression]]      expression可以使用test命令中采用的标准字符串进行比较,也可以使用模式匹配来进行比较(正则表达式)

 

test命令:

  test  condition  condition是test命令要测试的一系列参数和值

    可判断的三类条件:(具体查看man手册)

       1.数值比较:

       2.字符串比较

       3.文件比较

  注意:>需要进行转义处理

     sort与test命令处理大小写方法正好哦呵湘反,test中大写字母会被当成小写字母处理,但当你将同样的字符放进文件中用sort命令排序时,小写字母会出现,原因:test基于标准ASCII顺序,sort使用系统的本地化语言设置中第定义的排序顺序

 

case语句:

case variable in

pattern1 | pattern2)  command1s;;

pattern3)    commands2;;

*)  default  commands;;

esac

    |   竖线操作符(或操作副)用来分割模式,在一行列出多个模式

 

for语句:

for variable in list

do

  commands

done

在每次迭代中,变量var会包含列表中的当前值,第一个迭代会使用列表中的第一个值,第二个迭代会使用列表中的第二个值...在最后一次迭代到该变量被其他语句修改之前,变量会一直保持组后一个值

  ‘’  “”的问题,可以用另一种引号约束,或者用转义字符转义

  如果列表中的值包含有空格的话,必须用双引号圈起来

  环境变量IFS(内部子段分隔符)  定义了bash shell用作子段分隔符的字符

C语言风格的for语句

for((variable assignment;condition; interation process))

  do

    commands

  done

 

while语句:

while test command

do

  other  commands

done

   while命令允许在while语句定义多个测试命令,只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环

 

until命令:

until  test  command

do

  other  commands

done

  与while语句相同,可以有多个测试命令,只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环

 

循环控制语句:

break  (n)  break可以接参数n表示跳出几层循环

continue     提前终止循环内部的命令,但不完全终止整个循环

 

用户输入:

读取参数:  $0:程序名  $1:第一个参数  $2:第二个参数 .....直到第9个参数 但在第九个参数之后的参数必须在变量数字周围加{}

 

特殊参数变量:

$$     当前的PID

$#      含有脚本运行时就有的命令行参数的个数,可以在脚本的任何地方使用这个特殊变量,就像普通常量

  $(!#)      最后一个命令行参数的变量

$*      将命令行上提供的所有参数当作的单个单词保存

$@     将命令行上提供的所有参数当作同一个字符串的多个独立的单词

--      特殊字符,表示选项已经结束,接下来的全部是参数

 

shift (n)   shift命令会根据参数的相对位置来移动命令行参数(默认情况下会将每个参数变量减一(n=1))    (当一个参数被移除后,他的值被丢掉并且无法恢复)

 

getopt    命令格式:  getopt optstring optioins parametr  首先在optstring中列出你要在脚本中用到的每个命令行参数选项,然后在每个需要参数值的选项字母后面加一个:。  (并不擅长处理带空格的参数值)

getopts    命令格式:  getopts optstring variable      有效的选项字母会列在optstring中,如果选项字母要求有个参数值,就加一个:,要去掉错误信息,可以在optstring之前加一个:,getopts会将当前参数保存在命令行定义的variable中,如果选项要接一个参数值,OPRARG环境变量就会保存这个值,OPTIND环境变量保存参数列表*getopts正在处理的参数位置,这样就可以i在处理完当前选项之后继续处理其他参数了。getopts解析命令行选项时会移除开头的单破折号,还能够将命令行上找到的未定义的选项统一输出为?。

 

获取用户输入:

read variable          通过用户输入写入变量veriable的值,常用选项(-p  指定提示符,-t  设置超时等待时间,-s  密码输入模式(其实还是显示的,只不过read将字符的前景色与后景色设置为相同)),可以哦通过管道从文件读入。

 

标准文件描述符:(每个过程最多可以有9个文件爱你描述符)

0    STDIN        标准输入      对于终端而言,标准输入式键盘

1    STDOUT       标准输出      在终端界面上,标准输出是终端显示器i

2    STDERR       标准错误      默认情况下,标准错误输出也是到终端显示器上

&>    将STDER和STDOUT重定向到同一个输出文件(bash shell自动给标准错误输出分配更高的优先级)

/dev/null      黑洞设备,所有输入到里面的数据都会消失

exec  2>/dev/null    永久重定向

通过将标准文件描述符进行类似复制的操作,可以恢复修改过的标准文件描述符

读写文件描述符:  exec   3<>      既可以标准输入,也可以标准输出

&-    特殊符号,通过将标准文件描述符重定向到特殊符号&-,可以关闭文件描述符

tee      该命令将STDIN发送来的数据同时发送给两个目的地,一个目的地是STDOUT,一个是tee命令指定的文件

 

控制脚本:

ctrl+c      产生SIGINT信号,,停止shell中当前运行的进程

crtl+z      产生SIGTSTP信号,停止shell中运行的任何进程      停止进程会让程序继续保留在内存中,并从上次停止的位置继续运行

trap       格式:  tarp command signals(当接受到信号时执行command命令)  trap命令允许指定shell脚本要观察哪些linux信号,并且从shell中拦截他们,如果shell脚本受到了trap命令中列出的信号,他会阻止他被shell处理而是在本地处理他们

        trap command EXIT  捕获脚本的退出

        用单破折号(-)代替command,后面接要移除的信号,可以将其恢复到正常的状态

&       在命令之后加&,可以让该命令在后台运行,输出信息还是会显示,可以重定向到其他输出

nohup    由于当终端退出之后所有的后台程序都会随之终止,不管是否完成,而这个命令可以让进程执行完成之后再退出(解除终端与进程的联系)

bg      以后台模式重启后台进程,

fg      以前台模式重启后台进程

nice      在启动时调整一个命令的调度优先度(-20到20,默认为0)

renice      改变系统上已运行的命令的优先级

at        指定系统在何时运行脚本(只执行一次)

      atq    查看系统中有哪些作业在等待  

      atrm    删除等待中的作业

crontab      周期性的定时执行命令,脚本