目錄
1.流程控制語句:case
2.循環語句
(1)for----do-----done
1)取值清單有多種取值方式
2)清單中的複雜值
3)從變量中取值
4)從指令中取值
5)自定義shell分隔符
(2)C語言風格的for
(3)whlie-----do------done
(4)嵌套循環
1)批量添加a.txt檔案5個使用者
2)列印九九乘法表
3.3個shell腳本實戰
實戰1
實戰2
實戰3
1.流程控制語句:case
控制語句:用來實作對程式流程的選擇、循環、轉向和傳回等進行控制。
case是開關語句的一個組成部分;
它是根據變量的不同進行取值比較,然後針對不同的取值分别執行不同的指令操作
适用于多分支,是一個多選擇語句
case 變量或表達式 in
變量或表達式1)
指令序列1
;;
變量或表達式2)
指令序列2
;;
……
*)
預設指令序列
esac
執行流程:
- 首先使用“變量或表達式”的值與值1進行比較,若取值相同則執行值1後的指令序列,直到遇見雙分号“;; ”後跳轉至esac,表示分支結束;
- 若與值1不相比對,則繼續與值2 進行比較,若取值相同則執行值2 後的指令序列,直到遇見雙分号“;; ”後跳轉至esac,表示結束分支。
- 依次類推,若找不到任何比對的值,則執行預設模式“ *) ”後的指令序列,直到遇見esac後結束分支
- 注意事項:
1.“變量或表達式”後面必須為單詞in,每一個“變量或表達式”的值必須以右括号結束。取值可以為變量或常數。比對發現取值符合某一模式後,其間所有指令開始執行直至 ;;
2. 比對中的值可以是多個值,通過“|”來分隔
示例1:
case_1.sh腳本:

運作結果:
示例2:編寫一個啟動apache服務腳本
case2.sh腳本:
運作結果:
2.循環語句
(1)for----do-----done
文法格式:
for var in list
do
commands
done
或:
for var in list ; do
commands
done
1)取值清單有多種取值方式
可以直接讀取in 後面的值,預設以空格做分隔![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
2)清單中的複雜值
可以使用 引号或轉義字元”/”來加以限制![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
3)從變量中取值
![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
4)從指令中取值
![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
5)自定義shell分隔符
預設情況下,base shell會以空格、制表符、換行符做為分隔符。通過IFS來自定義為分隔符
指定單個字元做分隔符:
IFS=: #以:冒号做分隔符
可以指定多個
如 IFS='\n':;" #這個指派會将反斜杠、n、冒号、分号和雙引号作為字段分隔符。
注:$'\n'與'\n'時的差別
IFS='\n' #将字元\和字元n作為IFS的換行符。
IFS=$'\n' #真正地使用換行符做為字段分隔符。
![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
(2)C語言風格的for
文法格式:
for ((i=0;i<10;i++))
do
commmands
done
示例1:單個變量。 輸出1到10之間的數字
示例2:多個變量。 同時輸出1-9的升序和降序
(3)whlie-----do------done
重複測試指令的條件,隻要條件成立就反複執行對應的指令操作,直到指令不成立或為假;
文法格式如下:
while 測試指令
do
指令
done
注意:
- 避免陷入死循環 while true
- 自增操作 let var++
- 自減操作 let var--
示例1:降序輸出10到1的數字
例2:輸出如下圖兩數相乘的效果
(4)嵌套循環
1)批量添加a.txt檔案5個使用者
編寫腳本的思路![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
- 1 明确腳本的功能
- 2 編寫腳本時會使用到那些指令 ? useradd passwd for
- 3 把變化的資料使用變量表示
- 4 選擇适合的流程控制 (選擇 、 循環 、分支)
![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
2)列印九九乘法表
![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰 ![]()
Shell程式設計——流程控制case、循環語句1.流程控制語句:case2.循環語句3.3個shell腳本實戰
3.3個shell腳本實戰
實戰1
将/opt目錄下所有的日志檔案全自動打包
#!/bin/sh
SRC_DIR=/var/log/
DES_DIR=/opt/backup/`date +%Y%m%d`
if
[ ! -d $DES_DIR ] ; then
mkdir -p $DES_DIR
fi
for i in `find $SRC_DIR -name "*.log"`
do
tar czf $i.tgz $i
done
mv /var/log/*.tgz $DES_DIR
ls -lh $DES_DIR
echo "The scripts exec end, Files tar successfully !"
實戰2
找出192.168.1.1-10網段中,伺服器已經關機的IP位址
#!/bin/bash
i=1
for (( i=1;i<10;i++ ))
do
ping -c 3 192.168.1.$i &> /dev/null
if [ $? -ne 0 ];then
echo 192.168.1.$i is shutdown
fi
done
實戰3
批量建立帳号并生成随機密碼
#!/bin/bash
for i in boboyu{1..10}
do
useradd $i
pass=`date +%s|md5sum|cut -c 1-8`
sleep 1
echo "$i:$pass" >> /tmp/passwd.log
echo $pass |passwd --stdin $i > /dev/null 2>&1
if [ $? -eq 0 ];then
echo "create user is successfully!"
else
echo "create user is failed!"
fi
done