天天看點

腳本

-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 */: 隻顯示檔案夾