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

只有在判断比较时才使用中括号,其他不用中括号

时间: 10-29

shell脚本复习的相关文章

Linux Shell脚本攻略复习

1. 打开终端后的提示符中,$表示普通用户,#表示管理员用户root,root是linux系统中权限最高的用户. 2. shell脚本通常是一个#!起始的文本文件,其中#!位于解释器路径之前. 例如: #!/bin/bash 3. 注释部分以#为起始,一致延续到行尾 4. 默认情况下,echo在每次调用后会添加一个换行符.echo后面的文本可以带双引号,带单引号,或者不带单引号和双引号. 注意: a. 使用不带引号的echo时,没法在所要显示的文本中使用分号(;),因为分号在bash中被用作命令

复习shell脚本

什么是shell脚本.首先它是一个脚本,并不能作为正式的编程语言.因为是跑在linux的shell中,所以叫shell脚本.说白了,shell脚本就是一些命令的集合.举个例子,我想实现这样的操作: 1)进入到/tmp/目录: 2)列出当前目录中所有的文件名: 3)把所有当前的文件拷贝到/root/目录下: 4)删除当前目录下所有的文件. 简单的4步在shell窗口中需要你敲4次命令,按4次回车.这样是不是很麻烦?当然这4步操作非常简单,如果是更加复杂的命令设置需要几十次操作呢?那样的话一次一次敲

shell脚本等的操作

1.命令替换:`` 反向单引号,也称重音符.键盘上和~键在一起的那个键呦,千万不要敲成单引号. A. 使用了``后,shell首先替换输出中``括起来的date命令,然后执行整个输出命令. B.命令替换还可以用于在变量中存储命令输出,如下: 变量ctr将包含当前目录中名字以.txt结尾的文件的计数. 2.expr 大部分shell不支持数字变量,所有变量会被作为字符串.如var=25,变量var中包含的是字符2和字符5组成的字符串,而不是数字25. Expr命令用来评估算术表达式,命令的输出发送

Shell脚本编程及示例和例题解析

Shell脚本的说明: shell脚本编程,实际上就是用vim编辑器编辑一个以.sh为结尾的脚本文件,在此脚本文件中使用Linux内部的一个或多个命令,通过编程语言以脚本运行的方式,一次性运行一次一个.一次多个或多次多个命令进行运算,并输出结果,及添加直观的注释. Shell脚本的编辑标准格式: 使用vim编辑器编辑一个自定义创建的文件名并以.sh格式结尾->    #!/bin/bash    #    脚本主体  \\脚本主体可直接编辑输入参数.命令.函数.shell编程语言等.且脚本主体所

SHELL脚本自动备份Linux系统

今天来写一个使用shell脚本增量备份系统文件,顺便复习一下shell脚本相关的命令,这个脚本可以根据自己的需求来备份不同的文件或者文件夹,进行完整备份和增量备份.直接上脚本如下: #!/bin/sh #Automatic Backup Linux System Files #Author wugk 2013-11-22 #Define Variable SOURCE_DIR=( $* ) TARGET_DIR=/data/backup/ YEAR=`date +%Y` MONTH=`date

linux中shell脚本的学习(一)

linux中shell是一个特殊的应用程序.它介于系统的内核与用户之间.充当命令"解释器"的作用角色.负责接收用户输入的操作指令,并进行解释.将需要执行的操作传递给内核.并输出执行结果: 下面我们来看一下当前系统所支持的shell的种类: 其中/bin/shell 是目前大多数linux中采用的默认shell.我们主要学习bash. 我们来写第一个脚本文件用作测试. vim first.sh cd /boot/ pwd ls -lh * chmod +x first.sh shell脚

《Linux命令行与shell脚本编程大全》第十七章 创建函数

可以将shell脚本代码放进函数中封装起来,这样就能在脚本中的任何地方多次使用它了. 17.1 基本的脚本函数 函数:是一个脚本代码块,可以为其命名并在代码中任何位置重用. 17.1.1 创建函数 有两种格式:name 是函数名 1) function name {          commands } 2)这种就比较接近c语言风格了 name() {          commands } 17.1.2 使用函数 跟其他shell命令一样,在行中指定函数名就好了. 在函数定义前使用函数,会收

每日一道shell脚本练习(01)

0. 引言 准备开一个新坑,每天更新一道shell练习.因为shell脚本属于那种不练习就会生疏,甚至忘记的技能,所以,为了对抗遗忘阻力,我只能不断加强练习了. 1. 第一天练习题目 [题目]请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2018-04-08.log,并且把磁盘的使用情况写到这个文件中,不用考虑cron,仅仅写脚本即可. [分析]第一点,要明白 linux 命令 date 的用法,打印"xxxx-xx-xx"这样的时间格式用date

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e