首页 > 代码库 > shell脚本复习

shell脚本复习

    最近公司工作量很小,就复习复习,看起了马哥的视频,感觉马哥讲课讲得特别细。这才是深入到系统的讲解,补充了很多我之前只是了解到皮毛的东西。

    

shell编程:弱类型编程语言

强:变量在使用前,必须事先声明,甚至还需要初始化

         NULL:

弱:变量用时声明,甚至不区分类型:

 

变量赋值:VAR_NAME=VALUE

 

编译器,解释器

 

编程语言:机器语言、汇编语言、高级语言

                  

静态语言:编译型语言

         强类型(变量)

         关键字:

         事先转换成可执行格式        

         C  C++JAVAC#

 

动态语言:解释型语言 on the fly 运行当中转换

         弱类型

         ASP.NETPHPShellPythonPerl

 

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进程及其子进程

1export VARNAME=VALUE

2VARNAME=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



练习:写一个脚本

判断当前系统上是否有用户的默认shellbash;

         如果有,就显示有多少个这类用户;否则,就显示没有这类用户;

 

提示:“引用”一个命令的执行结果,要使用命令引用:比如:RESAULTS=`wc –l /etc/passwd | cut –d: -f1`

         使用一个命令的执行状态结果,要直接执行此命令,一定不能引用:比如: if id user1 一句中的id 命令就一定不能加引号:

         如果想把一个命令的执行结果赋值给某变量,要使用命令引用,比如USERID=`id –u user1`;

         如果想把一个命令的执行状态结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如:

                   id–u user1

                   RETVAL=$?

                   此句绝对不可以写为RETVAL=`id–u user1`

 

 

练习:写一个脚本

判断当前系统上是否有用户的默认shellbash

         如果有,就显示其中一个的用户名;否则,就显示没有这类用户;

 

练习:写一个脚本

给定一个文件,比如/etc/inittab

判断这个文件中是否有空白行;

         如果有,则显示其空白行数;否则,显示没有空白行;

 

练习:写一个脚本

给定一个用户,判断其UIDGID是否一样

         如果一样,就显示此用户为“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脚本复习