-le: 小于
-gt:大于
if 語句
多分支
if 判斷條件 1 ; then
條件為真的分支代碼
elif 判斷條件 2 ; then
elif 判斷條件 3 ; then
else
以上條件都為假的分支代碼
fi
逐條件進行判斷,第一次遇為"真"條件時,執行其分支,
而後結束整個if 語句
6
if 示例
根據指令的退出狀态來執行指令
條件判斷: case語句
case支援glob風格的通配符:
*:任意長度任意字元
?:任意單個字元
[]:指定範圍内的任意單個字元
a|b: a或b
條件判斷:case 語句
case 用變量引用 in
pat1)
分支1
;;
pat2)
分支2
...
*)
預設分支
esac
例子
問題:
答案
一般開頭不用echo寫,用cat重定向,如下:
yesorno腳本,以後在工作中可以當模闆使用
循環
循環執行
将某代碼段重複運作多次
重複運作多少次:
循環次數事先已知
循環次數事先未知
有進入條件和退出條件
for, while, until
for 循環
for 變量名 in 清單;do
循環體
done
執行 機制 :
依次将清單中的元素指派給"變量名"; 每次指派後即執
行一次循環體; 直到清單中的元素耗盡,循環 結束
for循環
for + 變量名
in + 清單 ;do
循環内容
指令在for裡調用,要用反向單引号 :例如:`seq 10`
$*:所有
$@:個體
例子:
for的簡單格式例子
ping ip位址 ping通為up,ping不通為down
并行執行,可以提高效率
執行腳本時,兩種方法
顔色代碼設定(在顔色号碼前加1,可以提亮顔色)
random%7:表示0-6 ,一共7個數,後+31 表示31+0 ~31+6的範圍
設定 一個橫六豎八,的矩形,加顔色
編寫腳本,提示請輸入網絡位址,如192.168.0.0,判斷輸入的網段中主機線上狀态 unset:設定變量
三角形
while 循環
while 判斷 ;do
操作
比for循環更通用,for一般用于數字循環
while condition; do
condition :循環控制條件;進入循環之前,先做一次判
斷;每一次循環之後會再次做判斷;
條件為“true” ,則執行
一次循環;直到條件測試狀态為“false” 終止循環
v 是以:condtion一般應該有循環控制變量;而此變量的值
會在循環體不斷地被修正
v 進入條件:condition為true
v 退出條件:conditio
編寫腳本,實作列印國際象棋棋盤
穿插一些bash用法:
bash 的檔案測試
-a 判斷檔案存在則為真 -e 同-a
-b 判斷檔案為塊裝置檔案則為真(/dev/sda)
-c 判斷檔案為字元檔案則為真(dev/tty1)
-d 判斷檔案為目錄檔案則為真
-f 判斷檔案為普通檔案則為真
-h 判斷檔案為軟連結檔案則為真 -l 同-h ( ln [-s] 源檔案 連結檔案 設定硬 [軟] 連結 )
-ef 判斷檔案為硬連結檔案則為真 [ /app/a -ef /app/c ]
-p 是否存在且為命名管道檔案
-s 是否存在且為套接字檔案
判斷
if case
if 判斷 ;then
elif 判斷;then
…
生成清單範圍表示方法:
列印等腰三角形
case $name in
判斷)
for while
for name in 範圍 ;do
添加10 個使用者user1-user10,密碼為8 位随機字元
列印九九乘法表
for的第二種用法:
可以進行資料運算
第一個指令執行完後,接着去判斷第二個條件是否成立,去執行exp2,如果為真,則去執行指令循環體commands,指令執行結束後,繼續執行exp3,執行完畢後,反過頭接着去檢查exp2,exp2為真則去執行後續的循環,為假,則整個循環結束
for 循環的特殊格式:
for (( 控制變量初始化; 條件判斷表達式;控制變量的修正表達
式式))
do
for ((i=1;sum=0;i<=100;i++));
i=1 ,sum=0相當于exp1; i<=100,相當于exp2; i++,相當于exp3;
do下面的操作相當于commands
i=1,sum=0,然後判斷i<=100,如果為真的話,就做commands裡面的操作,然後i++
如果為假的話,就退出循環
until 循環
v until condition; do
v done
v: 進入條件: condition 為false
v: 退出條件: condition 為true
pgrep -au hacker:顯示使用者的程序路徑 ;通過這個檢測,檢視使用者是否登陸,然後進行下邊的操作進行殺死、踢出。
檢測hacker是否登陸,如果沒有,則休眠0.5秒,如果發現登陸,則殺掉、踢出,退出循環
殺死使用者程序
pkill -9 -u nameuser:殺死、踢出使用者
*******************************************************************
小知識點:
生成随機數: cat /dev/urandom
修改使用者的密碼為“”,常用于腳本
echo "password" | passwd --stdin username
\>: 詞尾錨定
\<:詞前錨定
循環控制語句continue
v 用于循環體中
v continue [n] :提前結束第n 層的本輪循環,而直接進入下一
輪判斷;最内層為第1層 層
(continue:結束當次循環,開始下一輪循環)
while condtiiton1; do
cmd1
if condition2; then
continue
cmdn
(continue:結束當次循環,開始下一輪循環)在下面題中的意思是當i=51時,則不執行循環,開始下一輪循環
循環控制語句break
v break [n] :提前結束第n 層循環, 最内層為第1層 層
break
done
break結束整個循環,在下面的題中,意思是指當i=51時,結束整個循環
while : :意思是一直循環
循環控制shift 指令
每次将參數清單整體向左移動,原來的第一個參數沒有了,第二個參數成為第一個,shift=2,意思是将向左移動2位
v shift [n ]
v表 用于将參量清單 list 左移指定次數,預設為左移一次。
v表 參量清單 list 一旦被移動,最左端的那個參數就從清單中删
除。while 到 循環周遊位置參量清單時,常用到 shift
v ./doit.sh a b c d e f gh
v ./shfit.sh a b c d e f gh
$#:顯示的總個數
當$#為0時,輸出使用方法arg1..;并退出
當輸入的數字的總數不為空且大于0時,則添加參數$1,然後向左移動一位,繼續添加數字,循環。。
bash shift.sh a b c d :建立 a b c d
getent passwd:檢視是否建立成功
select 循環與菜單
經常做菜單用,經常配合case判斷結合用
vselect variable in list
循環體指令
vselect 循環主要用于建立菜單,按數字順序排列的
示菜單項将顯示在标準錯誤上,并顯示 ps3 提示符,
等待使用者輸入
v 使用者輸入菜單清單中的某個數字,執行相應的指令
v量 使用者輸入被儲存在内置變量 reply 中 中
26
select 與case
vselect 用 是個無限循環,是以要記住用 break 指令退
用出循環,或用 exit 按 指令終止腳本。也可以按 ctrl+c
退出循環
vselect 和 經常和 case 聯合使用
v與與 for 略 循環類似,可以省略 in list, , 此時使用位置
參量
select name in 菜單項
:.,$s/^/# :給腳本内容全部加上#注釋
上圖添加注釋後效果
用select循環做的菜單,如下圖結果
ps1:修改指令提示符 [root@localhost ~]
使提示符變紅色:
提示符
信号捕捉trap
v trap ' 觸發指令' 信号
自定義程序收到系統發出的指定信号後,将執行觸發指令
,而不會執行原操作
捕捉ctrl+c ,隻是列印出來,而不會執行ctrl+c的原操作
v trap ' ' 信号
忽略信号的操作 (在執行過程中,按ctrl+c沒有任何作用,直接忽略此選項)
v trap '-' 信号
恢複原信号的操作
v trap -p
列出自定義信号操作
2、常用信号:
1) sighup: 無須關閉程序而讓其重讀配置檔案
2) sigint: 中止正在運作的程序;相當于ctrl+c
3) sigquit: 相當于ctrl+\
9) sigkill: 強制殺死正在運作的程序
15) sigterm :終止正在運作的程序(預設為15)
18) sigcont :繼續運作
19) sigstop :背景休眠
9 信号,強制殺死,捕獲不
函數
一段代碼的集合,集合後起個名字,下次直接調用名字,
判斷版本号
将上述代碼寫成腳本,并指派,這樣别的腳本直接$?,可以直接調用這個腳本
下圖是直接調用上圖中的版本腳本代碼,$?:意思是引用上一條腳本
下圖中是直接調用上述腳本賦予的值,執行效果圖
定義函數
函數由兩部分組成:函數名和函數體
v help function
v 文法一:
f_name (){
... 函數體...
}
定義函數func1 ;執行後可以顯示出來定義的内容,在學腳本時,可以将複雜的腳本定義為一個簡單的函數值,執行腳本時直接執行此函數值就可以了
eclare: 查詢 -f: 函數
declare-f +函數名: 查詢想要查找的函數
常量:不更改的變量,隻能讀,不能改
source 和 .:強制執行的意思,不管在哪一層
v 在函數中定義局部變量的方法
local name=value
添加local 後,name變量函數的值隻對定義函數内部有效,外邊的name不受影響,如下圖:
函數體内部一般不加exit,相當于退出腳本
exit:傳回一個變量
調用函數指令顯示成功失敗 ,平時寫腳本時可以直接使用
action:函數
action +想顯示的字元串 後如果是true,則列印ok
action +想顯示的字元串 後如果是false,則列印failed
删除成功的前提是,有此使用者
定義函數,如果擔心與普通指令沖突,在其前面+f_;例如:f_ls
腳本裡邊不可以直接用别名,可以用函數
declare -f:函數
declare-xf :環境函數 ,可以子程序調用
ls -d */: 隻顯示檔案夾