首页 > 代码库 > shell脚本复习
shell脚本复习
最近公司工作量很小,就复习复习,看起了马哥的视频,感觉马哥讲课讲得特别细。这才是深入到系统的讲解,补充了很多我之前只是了解到皮毛的东西。
shell编程:弱类型编程语言
强:变量在使用前,必须事先声明,甚至还需要初始化
NULL:
弱:变量用时声明,甚至不区分类型:
变量赋值:VAR_NAME=VALUE
编译器,解释器
编程语言:机器语言、汇编语言、高级语言
静态语言:编译型语言
强类型(变量)
关键字:
事先转换成可执行格式
C、 C++、JAVA、C#
动态语言:解释型语言 on the fly 运行当中转换
弱类型
ASP.NET、PHP、Shell、Python、Perl
bash:脚本解释器,
面向过程:更适合开发小型环境
Shell,C
面向对象:更适合开发大型环境
JAVA,Python,perl,C++
变量:内存空间,命名内存空间
内存:编址的存储单元
进程:
变量类型:事先确定数据的存储格式和长度
变量类型:
字符
数值
整型,8bit:256
0-255,溢出 ,要存256就会溢出,容易导致缓冲区溢出,受到攻击
浮点型:11.23===》存储为1.123*10^1,0.1123*10^2
真假型
逻辑:1+1>2
逻辑运算:与、或、非、异或
1:真
0:假
与:只要有一个为假,结果一定为假
1&0=0
0&1=0
0&0=0
1&1=1
或:只要有一个为真,结果一定为真
|
非:
!真=假
!假=真
异或:
bash变量类型:
环境变量
本地变量(局部变量)
位置变量
特殊变量
本地变量:
set VARNAME=VALUE:作用域为整个bash进程 (set可以省略)
unset VARNAME撤销变量
查看shell中变量:
set
查看当前shell中的环境变量:
printenv
env
export
局部变量:
local VARNAME=VALUE 作用域为当前代码段
环境变量:作用域为当前shell进程及其子进程
1,export VARNAME=VALUE
2,VARNAME=NAME
export VARNAME
“导出”
脚本在执行时会启动一个子shell进程:
命令行中启动的脚本会继承当前shell环境变量;
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量;
位置变量:
$1,$2,$3,…
特殊变量:
$?:上一个命令的执行状态返回值;
程序执行,可能有两类返回值:
程序执行结果
程序状态返回代码(0-255)
0:正确执行
1-255:错误执行,1,2,127系统预留
输出重定向:
>覆盖重定向
>>追加重定向
2>错误重定向
2>>错误输出追加重定向
&>同时重定向 ,所有结果重定向
/dev/null:软件设备,bit bucket,数据黑洞
bash:
引用变量:${VARNAME},括号可以省略
单引号:强引用
双引号:弱引用
修改变量的值:
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
linux中执行的命令是ELF类型的文件,写的文本是ASCII类型
file /bin/ls
#!: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 ]]
testexpression
整数比较:
-eq:测试两个整数是否相等:比如$A–eq $B
-ne:测试两个整数是否不等:不等为真,相等为假;
-gt:测试一个数是否大于另一个数:大于为真,否则为假
-lt:测试一个数是否小于另一个数:小于为真,否则为假
-ge:大于或等于
-le:小于或等于
命令间的逻辑关系:
逻辑与:&&
第一个条件为假时,第二个条件不用再判断,最终结果已经有;
第一个条件为真时,第二个条件必须判断:
逻辑或:||
如果用户user6不存在,就添加用户user6
! id user6 && useradd user6
id user6 || useradd user6
如果/etc/inittab文件的行数大于100,就显示好大的文件;
[ `wc –l /etc/inittab | cut –d ‘ ’ –f1` -gt100 ] && echo “Large file.”
变量名称 :
1, 只能包含字母、数字和下划线 ,并且不能数字开头;
2, 不应该跟系统中已有的环境变量重名
3,最好做到见名知意
如果用户存在,就显示用户已存在,否则就添加此用户
id user1 && echo “user1 exists.”||useradd useer1
如果用户不存在,就添加,否则就显示其已经存在
! id user1 && useradd user1 || echo “user1 exists.”
如果用户不存在,添加并且给密码;否则,显示其已经存在
! id user1 && useradd user1&& echo “user1” |passwd –stdin user1 || echo “user1 exists.”
练习:写一个脚本,完成以下任务
1, 使用一个变量保存一个用户名,
2, 删除此变量中的用户,且一并删除其家目录
3, 显示“用户删除完成”类的信息
条件判断,控制结构:
单分支if语句:
if 判断条件;then
statement1
statement2
…
fi
双分支if语句:
if 判断条件;then
statement1
statement2
…
else
statement3
statement4
…
fi
练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash;
如果有,就显示有多少个这类用户;否则,就显示没有这类用户;
提示:“引用”一个命令的执行结果,要使用命令引用:比如:RESAULTS=`wc –l /etc/passwd | cut –d: -f1`
使用一个命令的执行状态结果,要直接执行此命令,一定不能引用:比如: if id user1 一句中的id 命令就一定不能加引号:
如果想把一个命令的执行结果赋值给某变量,要使用命令引用,比如USERID=`id –u user1`;
如果想把一个命令的执行状态结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如:
id–u user1
RETVAL=$?
此句绝对不可以写为RETVAL=`id–u user1`
练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash
如果有,就显示其中一个的用户名;否则,就显示没有这类用户;
练习:写一个脚本
给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行;
练习:写一个脚本
给定一个用户,判断其UID与GID是否一样
如果一样,就显示此用户为“goodguy”;否则,就显示此用户为“bad guy”.
#!/bin/bash
USERNAME=user1
USERID=`id –u $USERNAME`
GROUPID=`id –g $USERNAME`
if [ $USERID –eq $GROUPID ];then
echo“Good guy.”
else
echo“Bad guy.”
fi
练习:写一个脚本
给定一个用户,获取其密码警告期限;
判断用户最近一次修改密码时间距其最长使用期限是否已经小于警告期限;
提示:算术运算的方法$[$A -$B]:表示变量A的值减去变量变量B的值的结果;
如果小于,则显示“Warning”;否则,就显示“OK”。
练习:写一个脚本
判定命令历史中历史命令的总条目是否大于1000,;如果大于,则显示“Some command will gone.”;否则显示“OK”.
shell中如何进行算术运算:
A=3
B=6
1,let:明确表示做算术
let 算术运算表达式
letC=$A+$B
2,$[算术运算表达式]
C=$[$A+$B]
3,$((算术运算表达式))
C=$(($A+$B))
4, expr 算术运算表达式,表达式中各操作数与运算符直接要有空格,而且要使用命令引用
C=`expr $A + $B`
exit # :退出脚本
测试方法:
[ expression ] 命令测试法
[[ expression ]] 关键字测试法
test expression test测试法
bash中常用的条件测试有三种:
整数测试:
-gt
-le
-ne
-eq
-ge
-lt
INT1=63
INT2=77
[ $INT1 –eq $INT2 ]
[[ $INT1 –eq $INT2 ]]
test $INT1 –eq $INT2
只有在判断比较时才使用中括号,其他不用中括号
本文出自 “秋天” 博客,请务必保留此出处http://zengfuqiu.blog.51cto.com/7895816/1867658
shell脚本复习