p18
编程语言:机器语言,汇编语言,高级语言
静态语言:编译型语言
强类型语言
事先转换成可执行格式后才可执行【C、C++、JAVA】
动态语言:解释性语言
弱类型语言
边解释边执行【Python、shell、PHP、perl】
强类型语言的变量在使用前,必须事先声明,甚至还需要初始化。
弱类型语言变量在用时声明即可,甚至不区分变量类型
shell是一种弱类型编程语言
面向过程:Shell、C
面向对象:JAVA、Python、perl、C++
采用不同的变量类型存储同一种变量所需要的内存空间也不同(字符10需要16bit,数字10需要8字节)
变量:是一种内存空间
变量类型:事先确定数据的存储格式和长度
字符
数值:整型、浮点型
布尔型
bash变量类型:
环境变量
本地变量(局部变量)
位置变量
特殊变量
本地变量:
VARNAME=VALUE 作用域为整个bash进程
局部变量:
local VARNAME=VALUE 作用域为当前代码段
环境变量
export VARNALE=VALUE 作用域为当前shell进程及子进程
位置变量
$1、$2
特殊变量
$?:上一个命令的执行状态返回值
程序执行可能有两类返回值
程序执行结果
程序状态返回代码(0-255):0表示正确执行
/dev/null 是一个数据黑洞,不想要执行结果的话可以将输出结果重定向到改文件中。
脚本在执行时会启动一个子shell进程:
命令行中启动的脚本会继承当前shell环境变量
系统自动执行的脚本(非命令行启动)就需要自我定义需要个环境变量
撤销变量:unset VARNAME
查看shell变量 :set
查看当前shell中的环境变量:printenv、env、export
变量叠加
!id user1 &> /dev/null && useradd user1 && echo "user1" | passwd --stdin user1 &> /dev/null || echo "user1 exists"
P19
条件测试类型:
整数测试
字符测试
文件测试
条件测试表达式
[ expression ]
[[ expression ]]
test expression
整数比较:
-eq:测试两个整数是否相等。相等为真,不等为假
-ne:测试两个整数是否不等。不等为真,相等为假
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
命令间的逻辑关系:
逻辑与:&&,第一个条件为假时,第二条件不在判断,最终结果已确定。第一个条件为真时,第二条件必须判断。
逻辑或:|| 第一个条件为真时,第二个条件不在判断。第一个条件为假,第二个条件必须判断。
逻辑非:!
如果用户user6不存在,就添加用户user6
!id user6 && useradd user6
id user6 || useradd user6
如果用户存在,就显示用户已存在,否则就添加用户
如果用户不存在,就添加,否则显示其已存在
条件判断,控制结果
单分支if语句:
if 判断条件;then
command1
command2
…………
fi
双分支if语句:
if 判断条件;then
command1
command2
else
command3
command4
fi
shell中的算术运算
A=3
B=6
1、let 算术运算表达式
let C=$A+$B #+号左右两边不能有空格
2、$[算术运算表达式]
C=$[$A+$B]
3、$((算术运算表达式))
C=$(($A+$B))
4、expr算术运算表达式,表达式中个操作数及运算符之间要有空格,而且要使用命令引用
C=expr $A + $B
P20
定义脚本退出状态码
exit
如果没有定义明确的状态退出码,那么最后执行的一条命名的退出码即为脚本的退出状态码。
练习3
#/bin/bash
USERNAME=xlw
#首先要判断用户是否存在,不存在还要执行后面的命令就浪费资源
if ! grep "^$USERNAME\>" /etc/passwd &> /dev/null; then
echo "NO such user:$USERNAME"
exit 1 #指定退出码
fi
userid=`id -u ${USERNAME}`
groupid=`id -g ${USERNAME}`
if [ $userid -eq $groupid ]
then
echo "${USERNAME} is good guy"
else
echo "${USERNAME} is bad guy"
fi