Shell编程

                                  Shell编程

特点:

1.开发快,它不运行,使用命令来执行。在任何一个环境下,都可以执行shell语言,很方便的。

2.shell(解释性)需要解释器,代码在解释器中运行。Shell的解释器一般为(bash)

  C++(编译型)经过编译链接后,可以在目标主机上直接运行

3.shell脚本运行起来后,他的pid 是bash的pid,因为bash是一个可执行程序。

语法:

#!/bin/bash  指定解释器

运行的时候  bash  my.sh    sh my.sh      当然./my.sh 也是可以的 但是我们需要将这个文件的权限进行修改 chmod u+x  my.sh

变量:本地变量  环境变量   参数变量

           # 屏蔽此行代码

      本地变量:

              1.定义一个变量 str=“hello” 字符串  也可以写成   str=hello  但是不能写成 str=hell o不能有空格

              2.一个变量从另外一个变量获得   val=$str  将str的值复制到val下(1、2写的时候在等号两边都不能有空格)

              3.从键盘上读取 read val    read就是从键盘上读取

              4.打印的时候 使用 echo 如果echo 后的内容原封不动的输出 就使用‘单引号’,如果中间夹在输出变量的值,使用“双引号”

              5.当我们就val=4的值加一个的时候,我们变的是val的指向,而不是说将4的内存空间的值+1.

       Shell编程   Shell编程                   

环境变量:就是从父进程继承过来的变量。

$HOME   当前用户的家目录     $PATH 命令的目录列表   $PS1 命令提示符   $0shellde 脚本名称    $#传递给脚本的参数个数     $$shell脚本的进程号

Shell编程

参数变量:执行脚本的时候穿进去的参数

$0 当前脚本的名字    $# 传递给脚本的参数个数   $$脚本的pid   $1.2….9 第几个参数 不能到10   

Shell编程Shell编程

条件:条件判断(test 【】) 因为我比较喜欢【】,两个是一样的意思。(记得 then,else后不需要then)

       If  [ -f fred.c ]  ([ ] 的两边都必须得空格)

       Then

       ……

       Fi

字符串:  str1 =str2(有空格就是比较 没有就是复制)   相等   str1!=str2 不相等  -n str1 不为空  -z str 为空      

算术比较:(两边必须是数字)-eq 相等   -ne 不相等   -gt 大于   -ge  大于等于  -lt 小于  -le小于等于  ! 假

文件条件: -d 文件是一个目录文件    -e 文件是否存在  -f 普通文件   -r  可读    -s大小不为0    -w 可写  -x  可执行

Shell编程

Shell编程Shell编程

 

循环:(for循环,while循环 until循环  如果写多条语句 需要带上;分号)

格式: for val in vals

          do

                     stat

       done

$(ls) 执行命令   `ls`  反引号 也是可以的

Shell编程Shell编程

格式:(let expr进行算术运算)

while  con

do

       stat

done

Shell编程         Shell编程

根据上图来说,`反引号` 执行命令   

格式:until  cond  (不满足才执行)

         do

              state

         done

Shell编程                 Shell编程

case语句:(类似于c语言的switch *代表全部匹配,结尾是两个;;)

case var in

       pattern [ | pattern ] ……) state;;

pattern [ | pattern ] ……) state;;

…………

esac

Shell编程

才case中间 我们可以使用正则表达式 在比较式更加的方便

函数:(类似于 c语言的函数  但是没有主函数的说法 函数也可以循环 嵌套调用)

(返回值  函数名 参数)

$? 就是上一句的执行结果。

fun(){

steat

}

 

Shell编程 Shell编程

根据上图我们可以了解到一些函数参数的问题 ,我们需要在脚本里面运行这个函数,函数才会运行并没有主函数的问题,我只有写这个函数才可以运行。

一个是传给脚本的参数,一个是传个函数的参数,要注意区分。

如何得到一个函数的返回值呢: 这时候我们就要用到我们在上面的$?

Shell编程Shell编程

在函数中如果我们设置变量在函数结束后,此函数变量依然存在,但是在函数前是没有这个变量的。(只要被执行,我们就在解释器中存在,那我们就存在这个变量了)

如果我们俩在函数执行完,就撤销这个变量 则 unset STR  当然这也可能会忘的啊, 怎么办呢,我们在定义整个变量的时候,我们就加个 local 关键字。

脚本的调用:(特别要注意 . ./a.sh的这种操作方式)

脚本调用脚本就很好理解,就是说我们在一个脚本中间调用我们的另外一个脚本,在调用的时候,我们有两种方式。 第一种 . ./a.sh   ./a.sh就是执行这个脚本, 为啥前面加个. 呢 这个就是说我们用.点方式执行。

Shell编程

Shell编程

Shell编程

 

这时候我们发现 他的两个pid是同一个,所以我们可以直接执行。但是我们这种写法不经常用,我们一般是用./a.sh 所以呢这时候我们就得 传参数,我们会发现我们的两个pid是不一样的,我们就运行了两个解释器。

Shell编程

Shell编程

Shell编程

第三种 就是传环境变量,使用了export 这个关键字,这个是比较安全的。

Shell编程

Shell编程

C语言调用脚本:

使用 execl 关键字。

awk,sed(只是大概说明,详细的话可以查下资料,说法是一样的)

调用awk有三种方式:第一种是命令行方式,

awk |-F filed -separ| ‘ commands’  input-file(s)

例如:awk -F. '{print $1}' file   -F .  代表了以.为分隔符   “{}”命令  $1 就是说第一个.之前的域 file就是文件名;

第二种是将所有的awk命令插入一个文件,使用awk解释器去解释他

第三就是将 awk命令插入一个单独文件,然后调用。

awk -f awk-script-file input-file(s)

-f 指明在文件awk-script-file中的zwk脚本,input-file(S)使用awk进行浏览的文件名。

Shell编程

Shell编程

 

sed(是一个非交互性文本流编辑器)

命令:sed `some-sed-commands` input-file > myoutfile

Shell编程

练习:杀死一个sleep进程。

Shell编程