编程基础
程序:指令+数据
程序编程风格:过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务与数据
shell程序:提供了编程能力,解释执行
程序的执行方式:
计算机:运行二进制指令
高级语言 : 编译: 高级语言 编译器 目标代码(Java,c#)
解释: 高级语言 解释器 机器代码(shell,Perl,Python)
编程基本概念
编程逻辑处理方式:顺序执行、循环执行、选择执行
Shell编程:过程式、解释执行
编程语言的基本结构:
各种系统命令的组合
数据存储:变量、数组
表达式:a + b
语句:if
Shell脚本基础
Shell脚本:包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行shebang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
Shell脚本的用途:自动化常用命令;执行系统管理和故障排除;创建简单的应用程序;处理文本或文件
创建shell脚本:1.用文本编辑器来创建文本文件(第一行必须包括shell声明序列;添加注释) 2.运行脚本(给予权限;直接运行解释器)
脚本规范
脚本代码开头约定
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
脚本调试:
bash -n 脚本名 //检测脚本中的语法错误:语法错误,后续命令不执行;不是语法错误,后续命令继续执行
-x 脚本名 //调试执行 可查看脚本的执行过程
++ 代表嵌套深度
变量:(强类型、弱类型)
如果命令可以识别变量,就可以不加$符号
$变量 //引用变量 若变量超过十个,需要用{}引起来
echo “$变量” //变量若赋值一个文件的内容,输出时加引号可保留原格式
变量作用:
- 数据存储格式
- 参与的运算
- 表示的数据范围
变量的命名法则:
- 不能使用程序中的保留字
- 只能使用数字、字母、下划线,且不能以数字开头
- 见名知义(最好用英文单词)
- 统一命名规则:驼峰命名法
= //给变量赋值
变量种类:局部变量:【只对当前的进程有效,不能传给子进程;只在当前会话有效】、环境(全局)变量:在【父进程定义的变量,子进程可继承】、本地变量、位置变量、特殊变量
pstree -p //显示所有进程关系
echo $$ //显示当前进程编号
echo $PPID //查看父进程编号
export 变量 //定义环境变量(declare -x 变量)
set //可以查看到全部的变量,还有函数信息
unset 变量 //取消给变量的赋值(变量前未加$)
$SHLVL //查看shell的嵌套次数
echo 后跟的认为是字符串,直接写$CMD认为是命令
$_ //上一个命令的最后一个参数
显示所有的环境变量:env ; printenv ;export ; declare -x
声明只读变量:readonly name 或者 declare -r name
查看只读变量: readonly -r name declare –r //查看所有常量(readonly -p)
( name=haha; touch /data/$name.log ) //小括号用于临时引用变量,开启子shell,不影响当前shell环境(该子shell,不同于之前子进程)
{ name=haha; echo $name; } //大括号影响当前shell环境,不开启子shell
位置变量:
$数字 //代表第几个位置变量
$0 //代表命令本身的整个路径(若是软链接可用$0实现不同的功能)
$* //代表传递给脚本的所有参数,全部参数合为一个字符串
$@ //代表传递给脚本的所有参数,全部参数为独立的字符串
$# //传递给脚本的参数个数
set — //清空所有位置变量
shift 数字 //每执行一次将所有的位置参数向左移几位(默认1位)
退出状态:
$? //可用来查看上条命令的执行结果,0代表成功,其他代表失败
$?对于脚本来讲:脚本的返回结果正确与否,是由最后一条命令决定的
bash 的自定义退出码: exit [数字]
算数运算:+ – * / %(取余) **(乘方)
RANDOM //随机数生成器
*//特定情况下需要转义
实现算数运算:let sum=i+j; $[i+j]; $((i+j)); expr i + j ;
declare -i n=10 //将变量n声成整数 ; echo 1+3 |bc
a=$((a^b));b=$((a^b));a=$((a^b));echo $a $b //实现a,b的值互换
逻辑运算(&与 |或 !非)
0 false 1 true
cmd1 短路与(&&) cmd2
如果cmd1为假,将不执行cmd2
如果cmd1为真,将执行cmd2
cmd1 短路或 (||) cmd2
如果cmd1为假,将执行cmd2
如果cmd1为真,将不执行cmd2
异或XOR(^):相同为假,不同为真 (通过异或的中间值可实现两个数值的转换)
德摩根定律:
(非A)与(非B)=非(A或B)
(非A )或 (非B ) =非(A与B)
[[ $filename =~ .+\.sh$ ]] && echo sh || echo no sh //判断文件的后缀是否为.sh
条件测试:判断某需求是否满足
测试命令:test EXPRESSION
[ EXPRESSION ] 变量在中括号使用时,用双引号引起来
[[ EXPRESSION ]] //支持扩展的正则表达式 (=~ 代表左侧字符串是否匹配右侧的正则;==右侧支持通配符)
表达式1 -a 表达式2 //与关系,都真结果才为真
表达式1 -o 表达式2 //或关系,都假结果才为假
-z //判断字符串是否为空,为真代表空
-n //判断字符串是否为空,为真代表非空(-n可以省略不写)
[ x”$var” = “ x” ] //也可用来判断字符串是否为空
-v //判断变量是否被设置
-a 或-e //判断文件是否存在
数值测试:
gt 大于 ge 大于等于 eq 等于(比较数字)
lt 小于 le 小于等于 ne 不等于
字符串测试:
=~ (代表左侧字符串是否匹配右侧的正则)
read //实现对变量的赋值,可赋值多个变量(建议一次赋一个值)
-p //指定提示内容
-s //静默输入
-n //指定输入的字符长度
-d //可指定结束符
-t //设置超时时间
read x y z <<<”I j k ” //实现批量赋值将ijk 分别赋给变量xyz
Bash如何展开命令行:
- 把命令行分成单个命令词
- 展开别名
- 展开大括号的声明( {} )
- 展开波浪符声明( ~ )
- 命令替换$() 和 ` ` )
- 再次把命令行分成命令词
- 展开文件通配( * ? [abc] 等等)
- 准备I/O重导向( < >)
- 运行命令
Profile 类:
按功能划分:profile类和bashrc类
Profile 类:为交互式登录的shell提供配置
功用:用于定义环境变量、运行命令或脚本
Bashrc类:为非交互式和交互式登录的shell提供配置
功用:定义命令别名和参数、定义本地变量
$- 变量 (默认功能组合himBH)
h //代表hash set +h //禁用hash set -h //启用hash
i //代表当前环境是不是交互式环境
m //代表打开监控模式
B //代表大括号扩展
H //代表可以展开历史列表中的命令 !!代表返回最近的一个历史命令
. source bash 直接运行脚本 之间的区别:
bash 或者 直接运行脚本 //两者等价,都开启子进程
source //表示在当前shell中运行脚本,影响当前的工作环境
source 或 . //一般用来运行配置文件
脚本中不识别别名,可以使用内部命令、外部命令
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/95744