標籤:linux shell shell 指令碼 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
......
Linux shell 指令碼(二)