Linux shell 脚本(二)

五、字符串处理

1.子串截取操作:

路径分割:

dirname命令:定位目标所在文件夹的位置

basename命令:目标对象的名字,通常指的指的是文件名或者最底层的目录名

使用expr命令

格式:expr substr $Var1 起始位置 截取长度

使用${}表达式

格式:${Var1:起始位置:截取长度}

例子:

1.

Var="/etc/httpd/conf/httpd.conf"

dirname $Var

etc/httpd/conf

basename $Var

httpd.conf

2.

Var=hsdzwmoon

expr substr $Var 4 6   #编号从1开始

zwmoon

3.

Var=hsdzwmoon

echo ${Var:4:6}   #编号从0开始

wmoon

echo ${var::5} #从开头开始截取 可以省略起始位置的书写

hsdzw

2.字符串替换

使用${}表达式

格式1:${var/old/new}   #将变量里第一个old替换成new

格式2:${var//old/new}   #将变量里所有old替换成new

例子:

1.

Var=hsdzwmoon

echo ${Var/o/l}

hsdzwmlon

echo ${var//o/l}

hsdzwmlln

3.使用随机字符串

如何获取随机字符串?

linux 里没有可以获取随机字符串的变量

可以通过如下方式获得:

/dev/urandom  #设备文件,随机字符  乱码的

|

/usr/bin/md5sum #校验和  生成ASCII码

|

/bin/cut       #格式处理,截取我们需要保留的部分

随机字符->ASCII 字符

head -1  /dev/urandom |md5sum   #head -1 第一行随机字符

使用cut切割字符串

echo $var |cut -b  起始位置-结束位置  #位置为首、尾时可省略

例子:

1.

如下图:

六、条件测试

1.测试操作规范:

测试的本质:

是一条操作命令,根据$?返回值来判断条件是否成立

操作规范:

格式1:test 条件表达式

格式2:[条件表达式]

测试操作的练习方法:

 直接跟&&echo YES 判断结果

用法:[条件表达式] && echo YES

例子:

1.如下图:

2.文件状态的检测:

2.1 存在及识别:

-e:目标是否存在

-d:是否为目录

-f:是否为文件

例子:

1.如下图:

2.2 权限的检测:

-r:是否有读取权限

-w:是否有写入权限

-x:是否有可执行权限

例子:

1.如下图:

[ -x "/etc/shadow" ] && echo YES

[ -r "/etc/shadow" ] && echo YES

YES

特殊情况:

root 用户下:

ls -l  /etc/shadow

-r-------- 1 root root 1386 04-16 18:58 /etc/shdow

[ -w "/etc/shadow" ] && echo YES  #root下我们可以看到没有写权限,但是输出为YES,这里要注意:所有者W例外

YES

整数值比较、子串匹配

整数值比较:

-eq:等于

-ne:不等于

-gt:大于

-lt:小于

-ge:大于或等于

-le:小于或等于

例子:

who | wc -l #统计登陆用户数

字符串匹配:

=:两个字符串相同

!=:两个字符串不相同

例子:

1.如下图:

七、使用if判断结构

程序流控制:

执行过程的顺序化、自动化

希望脚本智能化的选择与处理

让重复操作更聪明一些

对于...多个对象...如何逐个来处理? for

在...取值是...的情况下怎么办?  case

如果...条件是...时程序需要做什么? if

1.单分支if语句结构

if 条件测试

then 命令序列      #只关注条件成立的情况

fi

例子:

单分支if应用示例:

检查备份目录/opt/mrepo,若不存在则创建

cat chkdir.sh

#!/bin/bash

BACKUP_DIR="/opt/mrepo"

if [ ! -d $BACKUP_DIR ]

then

mkdir -p $BACKUP_DIR

fi

2.双分支if语句结构

if 条件测试

then  命令序列1

else 命令序列2

fi

例子:

双分支if应用示例:

判断目标主机是否存活,显示检测结果

cat chkhost.sh

#!/bin/bash

ping -c 3 -i 0.2 -W 3 $1 &>/dev/null

if[ $? -eq 0 ]

then

echo "Host $1 is up."

else

echo ”Host $1 is down“

fi

./chkhost.sh   192.168.4.11

Host  192.168.4.11  is up

./chkhost.sh  192.168.4.13

Host 192.168.4.13 is down

3.多分支if语句结构

if 条件测试1

then 命令序列1

elif 条件测试2

then 命令序列2

else

命令序列n

fi

例子:

多分支if应用示例

判断机试分数,区分优秀/合格/不合格

cat gradediv.sh

#!/bin/bash

read -p "请输入你的分数(0-100):" GRADE

if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ];then

echo "$GRADE 分!优秀"

elif [ $GRADE -ge 70 ]&&[ $GRADE -le 84 ];then

echo "$GRADE分,合格"

else

echo "$GRADE 分?不合格"

fi

结果如下图:

八、使用for循环

for 变量名 in 取值列表

do

命令序列

done

for IP地址 in 主机地址列表

do

检查状态

done

例子:

1.依次输出 1st. 2nd. 3rd.

#!/bin/bash

for i in "1st." "2nd." "3rd."

do

echo $i

done

结果如下图:

2.逐词输出/etc/host.conf 文件内容

#!/bin/bash

for i in $(cat /etc/host.conf)

do

echo $i

done

结果如下图:

实战案例:

目标:批量加用户账号:

用户列表文件users.txt ,每行一个

将初始口令设为123456,首次登陆后必须更改

cat uad.sh

#!/bin/bash

for i in $(cat /root/users.txt)

do

useradd $i

echo "123456" | passwd --stdin $i

chage -d 0 $i

done

结果如下图:

2.检测一个IP范围的主机状态

192.168.4.1 -192.168.10

根据是否ping通来判断

cat chkping.sh

#!/bin/bash

IP_PRE="192.168.4."

for IP in $(seq 1 5)

do

ping -c 3 -i 0.2 -W 3 ${IP_PRE}$IP &>/dev/null

if[ $? -eq 0 ];then

echo "${IP_PRE}$IP is up."

else

echo ”${IP_PRE}$IP is down“

fi

done

./chkping.sh

192.168.4.1 is down

192.168.4.2 is up

192.168.4.3 is down

192.168.4.4 is down

......

时间: 2024-10-23 19:06:54

Linux shell 脚本(二)的相关文章

老李分享:《Linux Shell脚本攻略》 要点(二)

老李分享:<Linux Shell脚本攻略> 要点(二) poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478.Linuxshell是测试开发工程师的基本功之一,所以在poptest测试开发课堂上加入了大量的linuxshell的课程,为了学员开发跨平台的测试平台打基础. 1.cat cat -s //多个空白行压缩成一个 cat *.txt | tr -s '\n'   //

Linux shell脚本基础学习详细介绍(完整版)二

详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续. Linux shell脚本基础已经被分成好几个部分了,这里对控制流程的内容也就马上讲完了,这是最后一部分关于here document,这里举例稍微有点复杂,我们慢慢来分析这个复杂Linux shell脚本. 6. Here documents 当要将几行文字传递给一个命令时,here docu

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

老李分享:《Linux Shell脚本攻略》 要点(四)

老李分享:<Linux Shell脚本攻略> 要点(四) 1.IP地址的正则表达式: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 2.grep用法 //在多级目录中对文本进行递归检索 [[email protected] program_test]# grep "yang" ./ -Rn ./test.txt:6:laoyang./right.txt:1:1 yang man //忽略大小写匹配 [[email protec

老李分享:《Linux Shell脚本攻略》 要点(三)

老李分享:<Linux Shell脚本攻略> 要点(三) 1.生产任意大小的文件 [[email protected] dd_test]#[[email protected] dd_test]# dd if=/dev/zero of=junk.data bs=1k count=1010+0 records in10+0 records out10240 bytes (10 kB) copied, 0.00137023 s, 7.5 MB/s 2.文件系统相关测试 [ -f $file_var

《Linux Shell脚本攻略》 笔记 第三章:文件操作

<Linux Shell脚本攻略> 笔记 第三章:文件操作 1.生产任意大小的文件 [[email protected] dd_test]# [[email protected] dd_test]# dd if=/dev/zero of=junk.data bs=1k count=10 10+0 records in 10+0 records out 10240 bytes (10 kB) copied, 0.00137023 s, 7.5 MB/s 2.文件系统相关测试 [ -f $file

Linux Shell脚本教程

v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} Normal 0 false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {

Linux Shell脚本攻略(1.1)

1.1 简介 诸多类Unix操作系统的设计令人惊叹.即便是在数十年后的今天,Unix式的操作系统架构仍是有史以来最佳的设计之一.这种架构最重要的一个特性就是命令行界面或者shell.shell环境使得用户能与操作系统的核心功能进行交互.术语脚本更多涉及的便是这种环境.编写脚本通常使用某种基于解释器的编程语言.shell脚本本质上就是一些文本文件,我们可以将一系列需要执行的命令写入其中,然后通过shell来执行. 在这里我们介绍的是Bash shell(Bourne Again Shell),它是

Linux Shell脚本攻略(1.10)

1.10 获取.设置日期和延时 很多应用程序需要以不同的格式打印日期.设置日期和时间.根据日期和时间执行某项操作.延时通常用于在程序执行过程中提供一段等待时间(比如1秒).同样的,我们也能够一多种格式打印日期,或者在命令行中设置日期.在类Unix系统中,日期被存储为一个整数,其大小为自世界标准时间起所流逝的秒数.这种计时方式称为纪元时或Unix时间. 1.10.1 获取.设置时间 以下的程序给出了多种用法: #!/bin/bash start=$(date +%s) #获取纪元时间 date #

Linux Shell脚本攻略(1.8)

1.8 使用别名 linux中的别名就相当于windows中的快捷方式,使用别名可以省去用户输入一长串命令序列的麻烦. 1.8.1 创建临时别名(快捷方式) alias new_command='command sequence' #格式说明 alias install='sudo apt-get install' #实例说明 在声明 install='sudo apt-get install'之后,就可以用install代替'sudo apt-get install'了.使用这种方式声明的别名