轉載請標明出處:
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 命令序列1else 命令序列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
例子:
#!/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
......