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

發佈了64 篇原創文章 · 獲贊 86 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章