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.
环境变量:就是从父进程继承过来的变量。
$HOME 当前用户的家目录 $PATH 命令的目录列表 $PS1 命令提示符 $0shellde 脚本名称 $#传递给脚本的参数个数 $$shell脚本的进程号
参数变量:执行脚本的时候穿进去的参数
$0 当前脚本的名字 $# 传递给脚本的参数个数 $$脚本的pid $1.2….9 第几个参数 不能到10
条件:条件判断(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 可执行
循环:(for循环,while循环 until循环 如果写多条语句 需要带上;分号)
格式: for val in vals
do
stat
done
$(ls) 执行命令 `ls` 反引号 也是可以的
格式:(let expr进行算术运算)
while con
do
stat
done
根据上图来说,`反引号` 执行命令
格式:until cond (不满足才执行)
do
state
done
case语句:(类似于c语言的switch *代表全部匹配,结尾是两个;;)
case var in
pattern [ | pattern ] ……) state;;
pattern [ | pattern ] ……) state;;
…………
esac
才case中间 我们可以使用正则表达式 在比较式更加的方便
函数:(类似于 c语言的函数 但是没有主函数的说法 函数也可以循环 嵌套调用)
(返回值 函数名 参数)
$? 就是上一句的执行结果。
fun(){
steat
}
根据上图我们可以了解到一些函数参数的问题 ,我们需要在脚本里面运行这个函数,函数才会运行并没有主函数的问题,我只有写这个函数才可以运行。
一个是传给脚本的参数,一个是传个函数的参数,要注意区分。
如何得到一个函数的返回值呢: 这时候我们就要用到我们在上面的$?
在函数中如果我们设置变量在函数结束后,此函数变量依然存在,但是在函数前是没有这个变量的。(只要被执行,我们就在解释器中存在,那我们就存在这个变量了)
如果我们俩在函数执行完,就撤销这个变量 则 unset STR 当然这也可能会忘的啊, 怎么办呢,我们在定义整个变量的时候,我们就加个 local 关键字。
脚本的调用:(特别要注意 . ./a.sh的这种操作方式)
脚本调用脚本就很好理解,就是说我们在一个脚本中间调用我们的另外一个脚本,在调用的时候,我们有两种方式。 第一种 . ./a.sh ./a.sh就是执行这个脚本, 为啥前面加个. 呢 这个就是说我们用.点方式执行。
这时候我们发现 他的两个pid是同一个,所以我们可以直接执行。但是我们这种写法不经常用,我们一般是用./a.sh 所以呢这时候我们就得 传参数,我们会发现我们的两个pid是不一样的,我们就运行了两个解释器。
第三种 就是传环境变量,使用了export 这个关键字,这个是比较安全的。
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进行浏览的文件名。
sed(是一个非交互性文本流编辑器)
命令:sed `some-sed-commands` input-file > myoutfile
练习:杀死一个sleep进程。