shell脚本基础

编程基础:
程序:指令+数据
程序编程风格:
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
shell程序:提供了编程能力,解释执行。属于对象式。通过解释器翻译成为计算机能运行的二进制指令。
编程逻辑处理方式:顺序执行,循环执行,选择执行。
编程语言的基本结构:各种系统命令的组合;
数据存储:变量,数组(高级)
表达式:a+b
语句:if
创建shell脚本:
第一步:使用文本编辑器(例vim)来创建编辑文本文件
第一行必须写明shell声明序列(魔法头部)
#!/bin/bash(shell类型)
#添加注释(如功能,日期等)
#开始的计算机不读是给用户看的。
第二步:运行脚本
脚本代码开头约定
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
脚本的基本结构
#! 定义变量 定义函数 主代码
检测脚本的语法错误: bash -n
调试执行: bash -x /path/to/some_script
弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用。shell不支持浮点型(小数)
根据变量的生效范围等标准划分下面变量类型:
局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
环境(全局)变量:生效范围为当前shell进程及其子进程
export定义环境变量 export B=100或者declear -x B=100
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量
$?:表示上一条命令的执行成功与否:0为成功,非0为失败
$0 :位置化变量中的命令本身
$ :位置化变量中的所有参数
$@ : 位置化变量中的所有参数
$# :位置化变量的个数
$$ :显示当前Shell的进程号
显示已定义的所有变量:set ;删除变量:unset name
变量引用:${name} $name
" ":弱引用,其中的变量引用会被替换为变量值
' ':强引用,其中的变量引用不会被替换为变量值,而保持原字符串
只读变量:只能声明,但不能修改和删除
– 声明只读变量:readonly name declare -r name
– 查看只读变量:readonly –p
位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, ...:对应第1、第2等参数,shift [n]换位置
$0: 命令本身
$
: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@ $* 只在被双引号包起来的时候才会有差异
进程使用退出状态来报告成功或失败
• 0 代表成功,1-255代表失败
• $? 变量保存最近的命令退出状态
exit n :自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
逻辑运算
• 非:!
! 1 = 0
! 0 = 1
• 短路运算
短路与
第一个为0,结果必定为0
第一个为1,第二个必须要参与运算
短路或
第一个为1,结果必定为1
第一个为0,第二个必须要参与运算
异或:^
异或的两个值,相同为假,不同为真
根据退出状态而定,命令可以有条件地运行
&& 代表条件性的AND THEN
|| 代表条件性的OR ELSE
数值比较
test "$A" -eq "$B" = [ "$A" -eq "$B" ]判断为真(返回值为0)则执行&&后面的指令,返回值为非0执行 ||后面的指令
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
test 用法和 [ ] 类似;
-a 或 -e filename 判断文件是否存在,若存在则为真
-b 判断文件是否为块设备
-c 判断文件是否为符号设备
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
test -v bianliang ;echo $? 判断bianliang是否设置
文件权限测试:
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
文件特殊权限测试:
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
文件大小测试:
-s FILE: 是否存在且非空
文件是否打开:
-t fd: fd 文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
双目测试:
FILE1 -ef FILE2: FILE1是否是FILE2的硬链接
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否旧于FILE2
字符串比较
== 是否相同 [ $test1 == $test2 ];echo $?
!= 或 <> 表示是否不同
~= 左侧字符串是否能够被右侧的PATTERN所匹配 [[ ab =~ a ]]

[ [ b > a ] ] 表示在默认编码表中的顺序,排后面的是较大的。
< [ [ a < b ] ]
-z "String" 判断字符串是否为空,为空时为真
-n "String" 判断字符串是否为非空,为非空时为真
使用read来把输入值分配给一个或多个shell变量
-p 指定要显示的提示
-s 静默输入,一般用于密码
-n N 指定输入的字符长度N
-d ‘字符’ 输入结束符
-t N TIMEOUT为N秒
read 从标准输入中读取值,给每个单词分配一个变量
所有剩余单词都被分配给最后一个变量
登录式shell 与 非登录式shell
登录式shell
执行顺序:/etc/profile --> /etc/profile.d/.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非登录式
执行顺序:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/
.sh
source 和 . 在当前shell下执行来自文件的命令。
使用脚本执行 是在子shell下执行命令,那么父shell是无法继承来自脚本中的变量
command:env , set ,unset ,export ,declear ,readonly ,let ,help ,test ,[ ] ,read

猜你喜欢

转载自blog.51cto.com/13767062/2121592
今日推荐