编程基础:
编程基础:
程序:指令+数据
程序编程风格;
面向过程:以指令为中心,数据服务于指令
面对对象:以数据为中心,指令服务于数据
高级:
编译:高级语言—>编译器—>目标代码
Java、C#
解释:高级语言—>解释器—>机器代码
shell、Perl、Python
编程逻辑处理方式:
顺序执行
循环执行
选择执行
shell编程:过程式、解释执行
编程语言的基本结构:
各种系统命令的组合
数据存储:变量、数组
表达式:a + b
语句:if
格式要求:首行shebang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
大批量重复的程序可以写成脚本
脚本格式
shebang要求必须写
添加注释
注释用#开头
运行脚本给执行权限
脚本命令没有关联时前面的命令报错不影响后面的命令;如有关联时反之。
bash -n [脚本] #测试脚本
bash -x [脚本] #调试执行
+表示执行的命令
++表示嵌套的执行命令
变量:命名空间的数据
变量定义命令时加反向单引号
调用变量时要加$
变量引用文件,显示时加双引号保留其格式
例如:fdtab=cat /etc/fdtab
echo “fdtab”
bash变量不分类型,直接赋值即可(都是字符,不支持浮点数)
关键字不能当变量
例如:if for ls hostname等
变量不能用数字或数字打头
见名知意
统一命名规则:驼峰命名法
例如:HostName、hostName
bash变量的种类
局部变量:特定场合有效,当前进程有效,其子进程无效,其父进程也无效
pstree -p #查看进程树附属关系
环境(全局)变量:当前shell进程及其子进程有效,子进程可以更改赋值但不能父进程的赋值不更改
export #赋值全局变量
unset [变量] #删除变量,不加$
set 显示所有变量以及函数
printenv:同上
export:同上
declare -x:同上
declare -r:显示“常量”
位置变量
定义10以上的变量加{}系统才能识别数字变量
$1,$2…..$n:对应第1、第2等参数($10)使用时用大括号扩起来${10}
$*:把所有参数合并成一个整体,用双引号引起等同于$@
$0:如果是软连接,显示其软链接的文件名
$@:每个参数为独立字符
$#:传递给脚本的参数的个数
shift:移动输入参数,默认移动一位(换位)
set–:删除所有位置变量
特殊变量
$_:上一个命令的参数
$*:把所有参数合并成一个整体,用双引号引起等同于$@
$0:如果是软连接,显示其软链接的文件名
$@:每个参数为独立字符
$#:传递给脚本的参数的个数
$$:当前进程的ID
$?变量保存最近命令退出状态
shift:移动输入参数,默认移动一位
set–:删除所有位置变量
bash内建的环境变量:
$PATH
$SHELL
$USER
$UID
$HOME
$PWD
$SHLVL:shell嵌套深度
$LANG
$$:当前进程ID
$PPID:父进程ID
$HOSTNAME
$HISTSIZE
—:上一个命令的最后一个字符串
声明只读变量(常量):
readonly name:只能调用不能更改不能删除,生命周期=当前进程的有效生命周期
declare -r name:
命令加小括号:相当于开启了一个临时的子进程但不是子进程,执行完命令后回到当前进程
例如:(cd /etc ; rm -rf ) #执行完回到当前目录
声明变量加小括号:临时声明执行,只执行一次后删除
例如:(name=wang;echo $name)
小括号开启子shell不影响当前shell
x=1;echo “pid=$$”;(echo “subpid=$$”;echo “subx=$x”;x=2;echo “subx2=$x”);echo x=$x
pid=2887
subpid=2887
subx=1
subx2=2
x=1
大括号开启子shell影响当前shell
退出状态
0表示成功,1-255表示失败
语法错误$?不为零,命令错误$?由最后一条命令决定
脚本中exit可以定义$?返回的值
ping -c# [IP地址] #指定ping几次
算术运算:
+,-,*,/,%取余,**乘方
let 变量=算术表达式
变量=$[算术表达式]
变量=$((算术表达式))
变量=$(expr arg1 arg2 arg3 …)
declare –i var = 数值 #把变量声明成数值
echo ‘算术表达式’ | bc
赋值
增强型赋值:
+=, -=, *=, /=, %=
逻辑运算
&:与
0&0=0
0&1=0
1&0=0
1&1=1
0为false假
1为true真
|:或
0|0=0
0|1=1
1|0=1
1|1=1
^:异或
相同为假,不同为真
0^0=0
0^1=1
1^0=1
1^1=0
例如:
替换a和b的赋值
a=6
b=4
a=$[a^b];b=$[a^b];a=$[a^b];echo $a $b
&&:短路与,
例如:cmd1&&cmd2
命令一为假,命令二则不执行,命令一为真,执行命令二
||:短路或,
例如:cmd1||cmd2
命令一为真,命令二则不执行,命令一为假,执行命令二
!:非
test #判断变量
[ -n 变量 ] 判断变量是否为非空0为非空1为空 相当于[ 变量 ]
[ -z 变量 ] 判断变量是否为空1为非空0为空
[[]] 使用正则表达式时使用
数值测试
-v 变量 :查看变量是否赋值
数值测试:
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
字符串测试:
== 是否等于
> ascii码是否大于ascii码
< 是否小于
!= 是否不等于
=~ 左侧字符串是否能够被右侧的扩展正则所匹配,需要配合[[]]使用
bash的文件测试
bash [脚本]:开启一个子进程相当于(./脚本)
read :把标准输入赋值给一个或者多个变量用空格分隔开
-p:指定要显示的提示
-s:静默输入
read x y z <<< “i j k”:批量赋值
.和source以及bash执行的区别
bash [脚本]和./[脚本]执行结果相同,在脚本的子进程中运行
source [脚本]和. [脚本]:在当前shell运行
脚本中不支持命令别名;也不支持定义别名
变量$-
h:开启hash缓存表功能
i:表示当前shell是交互式shell
m:打开监控模式
B:大括号扩展
H:打开history的H选项
H:打开历史的^ h选项