Linux shell 脚本(二)

转载请标明出处: 
http://blog.csdn.net/zwto1/article/details/45078837; 
本文出自:【明月的博客】   


五、字符串处理

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

posted @ 2015-04-17 15:41  chaplinthink  阅读(160)  评论(0编辑  收藏  举报