shell脚本编程基础
编程基础
程序:指令+数据
程序: 算法+数据结构
数据:是程序的核心
数据结构:数据在计算机中的类型和组织方式
算法: 处理数据的方式
程序编程风格:
过程式 :以指令为中心,数据服务于指令
对象式 : 以数据为中心,指定服务于数据
shell程序: 提供了编程能力,解释执行
程序的执行方式
计算机:运行二进制指令
编程语言:人与计算机之间交互的语言
低级编程语言:
机器:二进制的0和1的序列
低级:汇编
高级编程语言:
编译:高级语言---编译器---机器代码---执行
c, c++
解释:高级语言--执行--×××--机器代码
shell python java
编程基本概念:
编程逻辑处理方式:
顺序执行
循环执行
选择执行
shell编程:过程式,解释执行
编程语言的基本结构
各种系统命令的组合
数据存储:变量,数组
表达式:a+b
shell脚本基础
shell脚本: 包含一些命令或声明,并符合一定格式文本文件 格式要求:首行shebang机制 #! /bin /bash #!/usr /bin/python
shell脚本的用途有:
自动化常用命令
创建简单的应用程序
处理文本或文件
执行系统管理和故障排除
创建shell脚本
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列 :#!
#! /bin/bash
添加注释
注释以#开头
第二步:运行脚本
给予执行权限,在命令行上指定脚本的绝对或相对路径
直接运行解释器,将脚本作为解释器程序的参数运行
脚本规范
1:第一行一般为调用的语言
2:程序名,避免更改文件名为无法找到的文件
3:版本号
4:更改后的时间
5:作者相关信息
6:该程序的作用,及注意事项
7:最后是个版本的更新简要说明
脚本调试
检测脚本中的语法错误
bash -n /path/to/some_script
调试执行
bash -x /path/to/some_script
变量
变量:命令的内存空间
数据存储方式
字符
数值:整型,浮点型
变量:变量类型
作用: 1:数据存储格式
2:参与的运算
3:表示的数据范围
类型:
字符
数值:整型,浮点型
变量:
强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转 换。一般定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明 变量会产生错误
如 java,c#
弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符 型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
如:bash 不支持浮点数,php
变量命令法则:
1:不能使用程序中的保留字:例如if,for
2: 只能使用数字
3:见名知义
4:统一命令规则:驼峰命名法
bash中变量的种类
根据变量的生效范围等标准划分下面变量类型:
局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括 当前shell的子shell进程均无效
环境(全局)变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片段,通常指函数
位置变量: :$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它 的参数
特殊变量::$?, $0, $*, $@, $#,$$
局部变量:
局部变量即普通变量 只能当前进程使用 ,子进程不能使用
变量赋值:name=‘value’
可以使用引用‘value’
(1)可以是直接字符;name=“root“
(2)变量引用:name="$USER"
(3) 命令引用:name=`COMMAND` name=$(COMMAND) 变量引用:${name} $name
变量引用:${name} $name
" ":弱引用,其中的变量引用会被替换为变量值
’ ‘:强引用,,其中的变量引用不会被替换为变量值,而保持原字符串
显示已定义的所有变量:set
删除变量:unset name
环境变量:
环境变量 当前可以使用,子进程也能使用 父进程不能使用 加上export 例如:export name=`hostname`
export [只看环境变量] set[所有变量都在里面] unset name [取消删除变量]
变量声明 、赋值:
export name=VALUE
declare -x name=VALUE
变量引用:$name, ${name}
显示所有环境变量:
env
printenv
export
declare -x
删除变量: unset name
bash内建的环境变量:
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
MAIL
HOSTNAME
HISTSIZE
只读和位置变量
只读变量:只能声明,但不能修改和删除 【例:readonly name=dang 这就是只读变量 不能删除但是exit退出来只读变量就没有了】
查看已读变量:readonly -p
位置变量::在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, ...:对应第1、第2等参数,shift [n]换位置
$0: 命令本身
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@ $* 只在被双引号包起来的时候才会有差异
set -- 清空所有位置变量
退出状态:
进程使用退出状态来报告成功或失败
0 代表成功 1-255代表失败
$?变量保存最近的命令退出状态
例如:
ping -c1 -W1 hostname &>/dev/null
echo $?
退出状态码
bash自定制退出状态码
exit [n] :自定义退出状态码
注意: 脚本中一旦遇到exit命令,脚本会立刻终止;终止退出状取决于exit命令后面的数字
注意::如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行 的最后一条命令的状态码
逻辑运算:
true【真】,false【假】
1,0
与:
1 与 1 = 1
1 与 0 = 0 &【代表与】
0 与 1 = 0
0 与 0 = 0
或:
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1 |【代表或】
0 或 0 = 0
逻辑运算
非: !
!1=0
!0=1
短路运算
短路与
第一个为0 ,结果必定为0 &&【代表短路与】
第一个为1 ,第二个必须要参与运算
例: ls dng &>/dev/null && chmod +x dang 【意思: 如果前面命令存在就给他加执行权限】
短路或
第一个为1 ,结果必定为1 ||【代表短路或】
第一个为0, 第二个必定要参与运算
例:id dang &>/dev/unll || useradd dang 【意思: 如果前面没有这个目录就创建】
异或于同或
异或:^
异或的两个值,相同为假,不同为真
同或:
相同为1 ,不同为0
条件性的执行操作符
根据退出状态而定,命令可以有条件地运行
&& 代表条件性的AND THEN
|| 代表条件性的OR ELSE
bash的数值测试:
-v VAR
变量VAR是否设置
数值测试:
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
bash 的字符串测试
字符串测试:
= 是否等于
> ascii码是否大于ascii码
< 是否小于
=~ 左侧字符串是否能够被右侧的PATTERN所匹配 【类似于包含】
注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
[[ ]] ==相同,字符串不加“” 支持通配符 =~ 匹配,字符串不要加“”支持扩展正则表达式
bash的文件测试
存在性测试
-a 并且
-o 或者
-e 文件存在性测试,存在为真不存在为假
-b 文件 :是否存在且为块设备文件
-c 文件 :是否存在且为字符设备文件
-d 是否 目录文件
-f 普通文件
-h或-l 链接文件
-p 命令管道文件
-S 套接字文件
-w 可写文件
-o 当前有效用户是否为文件属组
-G 当前有效用户是否为文件属组
-r 存在且 可读文件
-w 存在且可写文件
-x 存在且可执行
例:查看/etc/issue是不是普通文件,如果是打印shi 如果不是打印bushi
[ -f "/etc/issue" ] && echo shi || echo bushi
查看/dev/sda是不是块文件,如果是打印shi 如果不是打印bushi
[ -b "/dev/sda" ] && echo shi || echo bushi
查看f1是不是普通文件并且有执行权限,如果是就加上r权限 如果不是打印bushi
file=f1; [ -f "$file" -a -x "$file" ] && chmod +r "$file"|| echo bushi
查看f1如果没有执行权限,如果是就加上w权限 如果不是打印bushi
file=f1; [ ! -x "$file" ] && chmod +w "$file"|| echo bushi
阻止普通用户登入 : touch /etc/nologin 【创建/etc/nologin文件】
把 buyunxuputongyonghudengru >/etc/nologin 【把前面字符写入,etc/nologin中 每当普通用户登入时会显示前面的字符】
使用read命令来接受输入
使用read来把输入值分配给一个或多个shell变量
-p 指定要显示的提示 read -p "please input your passwd " passwd 【会显示提示 ,后面的passwd是赋值 就是把前面输入的只赋给passwd】
-s 静默输入,一般用于密码
-n N 指定输入的字符长度N
-d ‘字符’ 输入结束符
-t N TIMEOUT为N秒
read 从标准输入中读取值,给每个单词分配一个变量 所有剩余单词都被分配给最后一个变量
read -p “Enter a filename: “ FILE
read可以同时给几个变量赋值
例:read z x c <<< "aa ss dd" 【三个<号】