shell编程:
编译器,解释器
编程语言:机器语言、汇编语言、高级语言
静态语言:C C++ JAVA C# 强类型(变量)事先转换成可执行格式
编译型语言 开发环境不需要借助额外的二进制程序,直接写代码用编译器将其直接转换为二进制可以独立运行的
动态语言:解释型语言PHP SHELL python per1 弱类型 不是绝对的 边解释边执行
面向过程:shell C 解决问题过程
面向对象:java Python per1 C++ 定义对象执行的动作
变量:内存空间,命名
内存:编制的存储单元
linux内核就是面向过程的C语言开发的 ,每种语言只有更适应它的地方
变量类型:事先确定数据的存储格式和长度
字符
数值 整型 浮点型11.23 1.123*10^1
整型:8bit:256
0-256 溢出
变量:
1,10000
10:16bit
10:1010,8bit
逻辑:1+1>2
逻辑运算:与(相乘)、或(相加)、非、异或(相同为零)
1:真
0:假
shell:弱类型编程语言
强:变量在使用前,必须事先声明,甚至还需要初始化:不一定初始化
NULL:
弱:变量用时声明,甚至不区分类型
变量赋值:VAR_NAME=VALUE
bash变量类型:
环境变量
本地变量(局部变量)函数
位置变量
特殊变量
本地变量:bash:
VARNAME=VALUE:作用域为整个bash进程
local VARNAME=VALUE:局部变量只对当前代码有效
name=tom
echo "there are some ${name}s."
引用变量:${varname},括号有时可省略
双引号是将变量转换,单引号不作变量转换
局部变量:
local VARNAME=VALUE:作用域为当前代码段
环境变量:作用域为当前shell进程及其子进程
export VARNAME=VALUE
VARNAME=VALUE
export VARNAME
“导出”
export name=tom
位置变量:
$1,$2,....
特殊变量:
$?:保存上一个命令的执行状态返回值
程序执行:可以能两类返回值:
程序执行结果
程序状态返回代码(0-255)
0:正确执行
1-255:错误执行 1、2、127系统预留了
输出重定向:
>
>>
2>
2>>
/dev/null:软件模拟的设备 ,bit bucket,位桶,理解成:数据黑洞 不显示信息
撤消变量:
unset VARNAME
查看当前shell中的变量
set 所有变量
查看当前shell中的环境变量
printenv
env
export
animal=pig
animal=$animal:goat
echo $PATH
export PATH=$PATH:/usr/local/apache/bin 添加路径在后面
export PATH=/usr/local/apache/bin:$PATH添加路径在前面
脚本在执行时会启动一个子shell进程:
命令行中启动的脚本会继承当前shell环境变量:
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量:
引用变量:${VARNAME},括号有时可省略
a=2
b=3
c=$a+$b
echo $c
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
file /bin/ls
shebang:指定程序的魔数
必须以#!开头 后面是跟是以什么格式写的路径
which 查看bash的位置
#!/bin/bash bash在bin目录下
echo "Add user1 successfully." 显示执行成功
#注释行被忽略的
pwd 查看当前路径
PATH=/root:$PATH 将路径加入环境
chmod u+x 1 添加文件的执行权限
1 执行文件
直接bash 1也可以
条件判断:
如果用户不存在
添加用户,给密码并显示添加成功:
否则
显示如果已经存在,没有添加
bash中如何实现条件判断?
条件测试类型:
整数测试
字符测试
文件测试
条件测试的表达式:
[ expression ]必须有一个空格
`expression`关键字
test + expression
整数比较():
A=3
B=6
[ $A -eq $B ]
-eq:测试两个整数是否相等:相等,为真;不等,为假
-ne:测试两个整数是否不等:不等,为真:相等,为假
-gt:测试一个数是否大于另一个数:大于,为真;否则,为假
-lt:测试一个数是否小于另一个数:小于,为真;否则,为假
-ge:大于或等于
-le:小于或等于
id tom &> /dev/null && echo "hello,tom"
! id tom3 && useradd tom3
!表示反义词
命令之间逻辑关系:
逻辑与:&&
第一个条件为假时,第二条件不用再判断,最终结果已经有
第一个条件为真时,第二条件必须得判断
逻辑或:||
如果用户user6不存在,就添加用户user6
id user6 || useradd user6
如果/etc/inittab文件的行数大于100,就显示好大的文件
['wc -l /etc/inittab | cut -d' '-f1' -gt 100 ] && echo "large file."
变量名称:
1.只能包含字母,数字和下划线,并且不能数字开头
2.不应该跟系统中已有的环境变量重名
3.最好做到见名知意
#!/bin/bash
LINES='wc -l /etc/inittab'
echo $LINES
FINLINES=echo '$LINES | cut -d'' -f1'
echo $FINLINES
[ $FINLINES -gt 100 ]&& echo "/etc/inittab is big file"
条件判断,控制结构:(最好用比与或更好理解)
单分支if语句
if 指定判断条件;如果为真执行then
statement1
statement2
.
.
else 否则
fi 结束
双分支的if语句
if指定判断条件;如果指定为真then
statement1
statement2
.
.
else 否则
statement3
statement4
.
.
fi 结束
USERID='id -u $NAME3'
#!/bin/bash
grep "\<bash$>" /etc/passwd &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ];then
USER='grep "\<bash$>" /etc/passwd | wc -1'
echo "The shells of $USER users is bash."
else
echo "No such user."
fi
''引用命令的执行结果
shell中如何进行算术运算表达式
a=2
b=4
1.let 算术运算表达式
let c=$a+$b
2.$[算术运算表达式]
c=$[$a+$b]
3.$((算术运算表达式))
c=$(($a+$b))
4.expr算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
c='expr $a + $b'