shell编程:
编译器,解释器
编程语言:机器语言,汇编语言,高级语言
静态语言:编译型语言
强类型
关键字
事先转换成可执行格式
C,C++,JAVA,C#
动态语言:解释性语言
弱类型
边解释边执行(on the fly)
PHP,SHELL,python,perl
bash:脚本解释器
面向对象
面向过程
变量:内存空间,命名
内存:编址的存储单元
变量类型:事先确定数据的存储格式和长度
字符
数值
整型
浮点型
强类型:变量在使用前,必须事先声明,甚至还要初始化
弱类型:变量用时声明,甚至不区分类型
显式转换
隐式转换
bash变量类型:默认是字符串
环境变量
本地变量(局部变量)
位置变量
特殊变量
本地变量:
VARNAME=VALUE:作用域为个整个bash进程
local VARNAME=VALUE:作用域为当前代码段
环境变量:
export VARNAME=VALUE
export VARNAME
变量引用:${}
脚本执行时会启动一个子shell
命令行中启动的脚本会继承当前shell环境变量
系统自动执行的脚本(非命令行启动)就需要自我定义各环境变量
位置变量:
$1,$2,$3,...
特殊变量:
$?:上一个命令的执行状态返回值
程序执行返回值:
结果
返回代码
0:正确
1-255:错误
/dev/null:软件设备,bit bucket,数据黑洞
撤消变量:
unset VARNAME
查看当前shell变量 :set
查看当前shell环境变量:printenv,env,export
脚本:命令的堆砌
shebang:魔数
#!/bin/bash
#后面为注释
练习:写一个脚本,完成以下任务
1.添加5个用户, user1,..., user5
2.每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息;
3.每个用户添加完成后,都要显示用户某某已经成功添加;
useradd user1
echo "user1" | passwd --stdin user1 &> /dev/null
echo "Add user1 successfully."
bash中的条件判断
条件测试类型:
整数测试
字符测试
文件测试
条件测试的表达式:
[expression](命令)
[[expression]](关键字)
test expression
整数比较:
-eq:equal
-ne:not equal
-gt:greater than
-lt:less than
-ge:greater or equal
-le:less or equal
命令的逻辑关系:
与:&& 第一个条件成立时才执行第二个条件
或:|| 第一个条件不成立时才执行第二个条件
command1 && command2 || command3
command1执行正确时执行command2
command1执行错误时执行command3
练习,写一个脚本,完成以下要求:
1.添加3个用户user1, user2, user3;但要先判断用户是否存在,不存在而后再添加;
2.添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;
3.最后显示当前系统上共有多少个用户;
练习,写一个脚本,完成以下要求:
给定一个用户:
1.如果其UID为0,就显示此为管理员;
2.否则,就显示其为普通用户;
练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash;
如果有,就显示有多少个这类用户;否则,就显示没有这类用户;
练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash;
如果有,就显示其中一个的用户名;否则,就显示没有这类用户;
练习:写一个脚本
给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行。
练习:写一个脚本
给定一个用户,判断其UID与GID是否一样
如果一样,就显示此用户为“good guy”;否则,就显示此用户为“bad guy”。
进一步要求:不使用id命令获得其id号;
练习:写一个脚本
给定一个用户,获取其密码警告期限;
而后判断用户密码使用期限是否已经小于警告期限;
提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限;
如果小于,则显示“Warning”;否则,就显示“OK”。
圆整:丢弃小数点后的所有内容
练习:写一个脚本
判定命令历史中历史命令的总条目是否大于1000;如果大于,则显示“Some command will gone.”;否则显示“OK”。
条件判断,控制结构:
if ...; then
...
fi
if ...; then
...
else
...
fi
if ...; then
...
elif ...;then
...
elif ...;then
...
...
else
...
fi
shell中算术运算:
1.let 运算表达式
2.$[运算表达式]
3.$((运算表达式))
4.expr 运算表达式 c=`expr $a + $b`
exit:退出脚本
exit n
如果脚本没有明确定义退出码,那么,最后执行的一条命令的退出码作为脚本退出码
文件测试:
-e:exist
-f:regular file
-d:directory
-r:readable
-w:writeable
-x:excutable
测试脚本是否有语法错误
bash -n filename:语法
bash -x filename:单步
练习:写一个脚本
给定一个文件:
如果是一个普通文件,就显示之;
如果是一个目录,亦显示之;
否则,此为无法识别之文件;
位置参数:
./filetest.sh /etc/fstab /etc/inittab
$0 $1 $2
shift:参数偏移
shift n;
特殊变量:
$?:上一个命令退出码
$#:位置参数的个数(不包括脚本本身)
$*:位置参数列表
$@:位置参数列表
练习:写一脚本
能接受一个参数(文件路径)
判定:此参数如果是一个存在的文件,就显示“OK.”;否则就显示"No such file."
练习:写一个脚本
给脚本传递两个参数(整数);
显示此两者之和,之乘积;
练习:写一个脚本,完成以下任务
1.使用一个变量保存一个用户名;
2.删除此变量中的用户,且一并删除其家目录;
3.显示“用户删除完成”类的信息;
编译器,解释器
编程语言:机器语言,汇编语言,高级语言
静态语言:编译型语言
强类型
关键字
事先转换成可执行格式
C,C++,JAVA,C#
动态语言:解释性语言
弱类型
边解释边执行(on the fly)
PHP,SHELL,python,perl
bash:脚本解释器
面向对象
面向过程
变量:内存空间,命名
内存:编址的存储单元
变量类型:事先确定数据的存储格式和长度
字符
数值
整型
浮点型
强类型:变量在使用前,必须事先声明,甚至还要初始化
弱类型:变量用时声明,甚至不区分类型
显式转换
隐式转换
bash变量类型:默认是字符串
环境变量
本地变量(局部变量)
位置变量
特殊变量
本地变量:
VARNAME=VALUE:作用域为个整个bash进程
local VARNAME=VALUE:作用域为当前代码段
环境变量:
export VARNAME=VALUE
export VARNAME
变量引用:${}
脚本执行时会启动一个子shell
命令行中启动的脚本会继承当前shell环境变量
系统自动执行的脚本(非命令行启动)就需要自我定义各环境变量
位置变量:
$1,$2,$3,...
特殊变量:
$?:上一个命令的执行状态返回值
程序执行返回值:
结果
返回代码
0:正确
1-255:错误
/dev/null:软件设备,bit bucket,数据黑洞
撤消变量:
unset VARNAME
查看当前shell变量 :set
查看当前shell环境变量:printenv,env,export
脚本:命令的堆砌
shebang:魔数
#!/bin/bash
#后面为注释
练习:写一个脚本,完成以下任务
1.添加5个用户, user1,..., user5
2.每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息;
3.每个用户添加完成后,都要显示用户某某已经成功添加;
useradd user1
echo "user1" | passwd --stdin user1 &> /dev/null
echo "Add user1 successfully."
bash中的条件判断
条件测试类型:
整数测试
字符测试
文件测试
条件测试的表达式:
[expression](命令)
[[expression]](关键字)
test expression
整数比较:
-eq:equal
-ne:not equal
-gt:greater than
-lt:less than
-ge:greater or equal
-le:less or equal
命令的逻辑关系:
与:&& 第一个条件成立时才执行第二个条件
或:|| 第一个条件不成立时才执行第二个条件
command1 && command2 || command3
command1执行正确时执行command2
command1执行错误时执行command3
练习,写一个脚本,完成以下要求:
1.添加3个用户user1, user2, user3;但要先判断用户是否存在,不存在而后再添加;
2.添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;
3.最后显示当前系统上共有多少个用户;
练习,写一个脚本,完成以下要求:
给定一个用户:
1.如果其UID为0,就显示此为管理员;
2.否则,就显示其为普通用户;
练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash;
如果有,就显示有多少个这类用户;否则,就显示没有这类用户;
练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash;
如果有,就显示其中一个的用户名;否则,就显示没有这类用户;
练习:写一个脚本
给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行。
练习:写一个脚本
给定一个用户,判断其UID与GID是否一样
如果一样,就显示此用户为“good guy”;否则,就显示此用户为“bad guy”。
进一步要求:不使用id命令获得其id号;
练习:写一个脚本
给定一个用户,获取其密码警告期限;
而后判断用户密码使用期限是否已经小于警告期限;
提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限;
如果小于,则显示“Warning”;否则,就显示“OK”。
圆整:丢弃小数点后的所有内容
练习:写一个脚本
判定命令历史中历史命令的总条目是否大于1000;如果大于,则显示“Some command will gone.”;否则显示“OK”。
条件判断,控制结构:
if ...; then
...
fi
if ...; then
...
else
...
fi
if ...; then
...
elif ...;then
...
elif ...;then
...
...
else
...
fi
shell中算术运算:
1.let 运算表达式
2.$[运算表达式]
3.$((运算表达式))
4.expr 运算表达式 c=`expr $a + $b`
exit:退出脚本
exit n
如果脚本没有明确定义退出码,那么,最后执行的一条命令的退出码作为脚本退出码
文件测试:
-e:exist
-f:regular file
-d:directory
-r:readable
-w:writeable
-x:excutable
测试脚本是否有语法错误
bash -n filename:语法
bash -x filename:单步
练习:写一个脚本
给定一个文件:
如果是一个普通文件,就显示之;
如果是一个目录,亦显示之;
否则,此为无法识别之文件;
位置参数:
./filetest.sh /etc/fstab /etc/inittab
$0 $1 $2
shift:参数偏移
shift n;
特殊变量:
$?:上一个命令退出码
$#:位置参数的个数(不包括脚本本身)
$*:位置参数列表
$@:位置参数列表
练习:写一脚本
能接受一个参数(文件路径)
判定:此参数如果是一个存在的文件,就显示“OK.”;否则就显示"No such file."
练习:写一个脚本
给脚本传递两个参数(整数);
显示此两者之和,之乘积;
练习:写一个脚本,完成以下任务
1.使用一个变量保存一个用户名;
2.删除此变量中的用户,且一并删除其家目录;
3.显示“用户删除完成”类的信息;