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 
......

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。