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                         

3.整数值比较、子串匹配

整数值比较:

-eq:等于

-ne:不等于

-gt:大于

-lt:小于

-ge:大于或等于

-le:小于或等于

例子:

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

4.字符串匹配: =:两个字符串相同 !=:两个字符串不相同 例子: 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 

结果如下图:

实战案例: 1.目标:批量加用户账号: 用户列表文件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 
......

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券