一、编程基础
程序:指令+数据
二、编程风格
过程式:以指令位中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
三、编程基本概念
变成逻辑处理方式:
顺序执行
循环执行
选择执行
shell编程过程其实就是解释执行
shell编程思路:从无到有(先码出基本的框架实现基本的功能),再到功能的完善和程序的严谨
四、编程语言的基本结构
各种系统命令的组合
数据存储:变量、数组
表达:a+b
语句:if for case ...
五、脚本基本格式
脚本规范
1、第一行一般为调用使用语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
以上信息全部用#注释书写,请勿忘记书写#号,以免导致程序报错
格式要求:首行shebang机制
这个符号(#!)的名称,叫做”Shebang”或者”Sha-bang”。长期以来,shebang都没有正式的中文名称。Linux中国翻译组的 GOLinux 将其翻译为:释伴,即解释伴随行的简称,同时又是shebang的音译。
六、变量
1.命名法则:
(1)不能使程序中的保留字:例如:if for
(2)只能使用数字、字母及下划线、切不能以数字开头
(3)见名知意
(4)统一命名规则:驼峰法 例:DisCeck.sh
加()括号让变量变成一次性,等于打开一个子shell,关于()\[]\[[]]\{}用法请看另一篇文章 shell中各种括号的使用详解(),(()),[],[[]],{}
2.bash变量的种类
局部变量:只针对当前shell有效,
全局变量(环境变量):针对当前和子shell有效,通过pstree查看shell进程树
export来声明全局变量。例:export NAME=test,父进程只可以传给子进程,而不能影响父进程的上一级进程
declare -r 定义只读变量(一般用于数值运算定义)
unset name 删除全局变量内容
只读变量和位置变量
$1:后面第一个参数
$2:后面第二个参数 (以此类推)
${10}:表示第十个参数
$0:脚本名的本身
$#:显示参数个数
$*:传递给脚本的所有参数,但参数合为一个字符串
$@:传递给脚本的所有参数,但参数合为独立的字符串
$?:输出进程状态来表示成功还是失败0为成功,1-255都为失败
shift:读取完第一个参数以后,踢掉,把第二个参数往前面移动,变成第一个参数
七、shell算数运算:help let
+, -, *, /, %取模(取余), **(乘方)
1.实现算术运算:
(1) let var=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare –i var = 数值
(6) echo ‘算术表达式’ | bc
bash有内建的随机数生成器:$RANDOM(0-32767)
echo $[$RANDOM%50] :0-49之间随机数
2.逻辑运算
true false
1,0
与:
1 与 1 = 1
1 与 0 = 0
0 与 1 = 0
0 与 0 = 0
u 或:
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0
非:!
! 1 = 0
! 0 = 1
短路运算
短路与 &&
第一个为0,结果必定为0
第一个为1,第二个必须要参与运算
短路或 ||
第一个为1,结果必定为1
第一个为0,第二个必须要参与运算
异或:^
异或的两个值,相同为假,不同为真
八、bash 的数值测试
1.数值测试:
[]里面用到变量一定要用双引号引起来。
=:比较字符串
-eq:等于(比较数字)
-ge:大于等于
-ne:不等于
-gt :是否大于
-lt :是否小于
-le:是否小于等于
2.字符串测试
== 是否等于
> ascii码是否大于ascii码
< 是否小于
!= 是否不等于
=~ 左侧字符串是否能够被右侧的PATTERN(正则表达式)所匹配
注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
-z "STRING“ 字符串是否为空,空为真,不空为假
-n "STRING“ 字符串是否不空,不空为真,空为假
注意:用于字符串比较时的用到的操作数都应该使用引号
九、Bash文件测试
1.存在性测试
-a FILE:同-e
-e FILE: 文件存在性测试,存在为真,否则为假
存在性及类别测试
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
文件权限测试:
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
2.文件特殊权限测试:
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
3.文件大小测试:
-s FILE: 是否存在且非空
文件是否打开:
-t fd: fd 文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
十、Bash的组合测试条件
第一种方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]]
第二种方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
示例:
[ -z “$HOSTNAME” -o $HOSTNAME "==\
"localhost.localdomain" ] && hostname www.baidu.com
[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
相关命令
read:等待用户输入命令
-p:添加提示信息
-s:不显示输入内容
-t:设置超时时间
bash -n 检查shell语法错误
-x 查询执行过程
十一、bash配置文件
全局配置文件:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
十二、$-变量
h:hashall,打开这个选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭
i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的。
m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等。
B:braceexpand,大括号扩展
H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令
十三、shell执行优先级次序
把命令行分成单个命令词
展开别名
展开大括号的声明({})
展开波浪符声明(~)
命令替换$() 和 ``)
再次把命令行分成命令词
展开文件通配(*、?、[abc]等等)
准备I/0重导向(<、>)
运行命令
小总结\小技巧:
1.组合命令必须使用测试命令进行
2.在[]里面算数运算,空格很重要,能加则一定加
3.let $name1+$name2 变量相加则不需要空格
4.在shell中不支持别名
5.脚本执行完毕后尽量用unset删除变量垃圾
6.[]中引用变量尽量用""规范写法
7.用于字符串比较时的用到的操作数都应该使用引号
8.批量对变量赋值
echo a b c > f1
read x y z < f1 即$x对应字母a以此类推
个人博客地址:http://babyhuitao.com