一、shell脚本语言
1.编程语言的分类:
(1)根据运行方式
编译运行:源代码 --> 编译器 (编译)--> 程序文件;
解释运行:源代码 --> 运行时启动解释器,由解释器边解释边运行;
(2)根据其编程过程中功能的实现是调用库还是调用外部的程序文件:
shell脚本编程:利用系统上的命令及编程组件进行编程;
完整编程:利用库或编程组件进行编程;
(3)编程模型:
过程式编程语言:以指令为中心来组织代码,数据是服务于代码;
顺序执行、选择执行、循环执行;代表:C,bash
面向对象的编程语言:以数据为中心来组织代码,围绕数据来组织指令;
类(class):实例化对象,method;
代表:Java, C++, Python
总结:shell脚本编程是过程式编程,解释运行,依赖于外部程序文件运行;
2.shell脚本格式和规范
(1)第一行,顶格:给出shebang,解释器路径
用于指明解释执行当前脚本的解释器程序文件
常见的解释器:
#!/bin/bash;#!/usr/bin/python;#!/usr/bin/perl
(2)注释信息:#
#description:;#version;#author;#date
(3)代码注释:
(4)缩进,适度添加空白行;
(5)txt格式文本文档
3.shell脚本本质:命令的堆积;
很多命令不具有幂等性,需要用程序逻辑来判断运行条件是否满足
4.运行脚本方法
(1)赋予执行权限,并直接运行此程序文件;
1)chmod +x /PATH/TO/SCRIPT_FILE
(此处直接+x是赋予全部用户可执行权限)
2)/PATH/TO/SCRIPT_FILE
(2)直接运行解释器,将脚本以命令行参数传递给解释器程序;
bash /PATH/TO/SCRIPT_FILE
(此方法和脚本本省有无执行权限无关)
注意:1)脚本中的空白行会被解释器忽略;
2)空白行表示:加一行echo,则显示为空白行
3)注释行:除shebang,余下所有以#开头的行,都会被视作)注释行而被忽略
4)shell脚本的运行是通过运行一个子shell进程实现的;
二、算数运算
1.算数符号: +,-,*,/, **, %
2.加法运算格式
(1) let VAR=算术运算表达式
(2) VAR=$[算数运算表达式]
(3) VAR=$((算数运算表达式))
(4) expr命令 :VAR=$(expr $ARG1 $OP $ARG2)
注意:乘法符号(*)在有些场景中需要使用转义符,防止和通配符、正则表达式冲突
3.增强型赋值:变量做某种算术运算后回存至此变量中
(1)let i=$i+# let i+=#
+=,-=,*=, /=, %=
(2)自增
VAR=$[$VAR+1];let VAR+=1;let VAR++
(3)自减
VAR=$[$VAR-1];let VAR-=1;let VAR--
三、传递参数
1.位置参数变量
(1)# myscript.sh argu1 argu2
引用方式:$1, $2, ..., ${10}, ${11}, ...
$1:第一个输入参数
$2第二个传递的参数
当两位数时要用括号括起来${10}, ${11}, ..
(2)轮替机制:调用n个位置变量
shift [n]:位置参数轮替;每次剔除n个,默认为1个
2.特殊变量
$0 脚本本身路径
$#脚本参数的个数
$*显示所有参数,各参数读成多个独立字符串
$@显示所有参数,各参数读成一个完整的字符串形式
3.read:用户交互,通过键盘输入数据,从而完成变量赋值操作
read [option]... [变量name ...]
-p 'PROMPT' 显示提示信息
-t TIMEOUT 超出时间提前结束
time out and return failure if a complete line of input is not read withint TIMEOUT seconds.
注意:一般输入以空格作为分隔符,但时当输入数量大于变量是,最后多余的全部赋予最后一个变量
四、条件测试
1.条件测试:判断某需求是否满足,需要由测试机制来实现
2.测试表达式编写语法
(1)执行命令,并利用命令状态返回值来判断;
0:成功
1-255:失败
(2)测试表达式
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
注意:EXPRESSION两端必须有空白字符,否则为语法错误;
3.bash的测试类型
(1)数值测试:数值比较,双目测试
-eq:是否等于; [ $num1 -eq $num2 ]
-ne:是否不等于;
-gt:是否大于;
-ge:是否大于等于;
-lt:是否小于;
-le:是否小于等于;
(2)字符串测试:双目测试
==:是否等于;
>:是否大于;
<:是否小于;
!=:是否不等于;
=~:左侧字符串是否能够被右侧的PATTERN所匹配;
-z "STRING":判断指定的字串是否为空;空则为真,不空则假;
-n "STRING":判断指定的字符串是否不空;不空则真,空则为假;
注意:
1)字符串要加引用;
$变量时候,要" ",防止变量空值时候,比较两边类型不一致会报错
2)最好要使用[[ ]];但多个条件逻辑关系时可能要用[ ]
(3)文件测试:一般为单目测试,存在为真,不存在未假
1)文件存在性测试:
-a FILE
-e FILE
2)存在性及类型测试:
-b FILE:是否存在并且为 块设备 文件;
-c FILE:是否存在并且为 字符设备 文件;
-d FILE:是否存在并且为 目录文件;
-f FILE:是否存在并且为 普通文件;
-h FILE或 -L FILE:是否存在并且为 符号链接文件;
-p FILE:是否存在且为 命名管道文件;
-S FILE:是否存在且为 套接字文件;
3)文件权限测试:
-r FILE:是否存在并且 对当前用户可读;
-x FILE:是否存在并且 对当前用户可执行;
-w FILE:是否存在并且 对当前用户可写;
4)特殊权限测试:
-u FILE:是否存在并且 拥有suid权限;
-g FILE:是否存在并且 拥有sgid权限;
-k FILE:是否存在并且 拥有sticky权限;
5)文件是否有内容:
-s FILE:是否有内容;
6)时间戳测试:
-N FILE:文件自从上一次读操作后是否被修改过;
7)从属关系测试:
-O FILE:当前用户是否为文件的属主;
-G FILE:当前用户是否属于文件的属组;
8)双目测试:
FILE1 -ef FILE2:是否指向同一个文件系统的相同inode的硬链接;
FILE1 -nt FILE2:FILE1是否新于FILE2;
FILE1 -ot FILE2:FILE1是否旧于FILE2;
4.组合测试条件:逻辑运算
(1)第一种方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
[ -O FILE ] && [ -r FILE ]
(2)第二种方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
! EXPRESSION
[ -O FILE -a -x FILE ]
5.脚本的状态返回值
(1)默认是脚本中执行的最后一条件命令 的状态返回值
(2)自定义状态退出状态码
exit [n]:n为自己指定的状态码
注意:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束;
6.脚本检测&调试
bash -n /path/to/some_script 检测脚本中的语法错误,不能检出出逻辑错误
bash -x /path/to/some_script 调试执行,显示过程