溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux Bash語(yǔ)法總結(jié)

發(fā)布時(shí)間:2020-07-28 20:21:28 來(lái)源:網(wǎng)絡(luò) 閱讀:255 作者:筱振 欄目:系統(tǒng)運(yùn)維

在學(xué)習(xí)Linux的過(guò)程中,無(wú)可避免的會(huì)碰到一個(gè)既讓人喜歡、又令人十分頭疼的神奇的東西——bash編程,也就是shell腳本。那么什么是shell腳本呢?shell是一個(gè)命令語(yǔ)言解釋器,而shell腳本則是Linux命令的集合,按照預(yù)設(shè)的順序依次解釋執(zhí)行,來(lái)完成特定的、較復(fù)雜的系統(tǒng)管理任務(wù),類似于windows中的批處理文件。本篇博文主要介紹bash編程的基礎(chǔ)語(yǔ)法講解。

一、bash編程之變量

1)bash變量類別

本地變量:只對(duì)當(dāng)前shelll進(jìn)程有效的變量,對(duì)其他shell進(jìn)程無(wú)效,包含當(dāng)前shell進(jìn)程的子進(jìn)程。

2)變量賦值:

即向變量的存儲(chǔ)空間保存數(shù)據(jù),如下

[root@localhost ~]# VAR_NAME=VALUE
3)變量的引用

格式為:${VAR_NAME}

" ":弱引用,里面的變量會(huì)被替換;
' ':強(qiáng)引用,里面的所有字符都是字面量,直接輸出,所見(jiàn)即所得;
4)環(huán)境變量

對(duì)當(dāng)前shell進(jìn)程及其子shell有效,對(duì)其他的shell進(jìn)程無(wú)效!

定義:VAR_NAME=VALUE
導(dǎo)出:export VAR_NAME
撤銷變量:unset VAR_NAME
只讀變量:readonly VAR_NAME
5)局部變量

在shell腳本中定義,只可以在shell腳本中使用!

6)位置變量
$1,$2...,${10}
7)特殊變量

shell對(duì)一些參數(shù)做特殊處理,這些參數(shù)只能被引用而不能被賦值!

$#:傳遞到腳本的參數(shù)個(gè)數(shù)
$*:顯示所有向腳本傳遞的參數(shù)                  //與位置變量不同,此選項(xiàng)參數(shù)可超過(guò)9個(gè)
$$:獲取當(dāng)前shell的進(jìn)程號(hào)
$!:執(zhí)行上一個(gè)指令的進(jìn)程號(hào)
$?:獲取執(zhí)行的上一個(gè)指令的返回值              //0為執(zhí)行成功,非零為執(zhí)行失敗
$-:顯示shell使用的當(dāng)前選項(xiàng),與set命令功能相同
$@  與$*相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)
8)查看變量
set:查看當(dāng)前shell進(jìn)程中的所有變量;
export、printenv、env:查看當(dāng)前shell進(jìn)程中的所有環(huán)境變量;
9)變量命名規(guī)則
1)不能使用程序中的關(guān)鍵字;
2)只能使用數(shù)字、字母和下劃線,不可使用數(shù)字開(kāi)頭;
3)系統(tǒng)變量默認(rèn)都是大寫(xiě),自定義變量盡量不要與系統(tǒng)變量沖突;
4)盡量做到見(jiàn)名知意;
10)變量類型
1)數(shù)值型:精確數(shù)值(整數(shù))、近似數(shù)值(浮點(diǎn)數(shù));
2)字符型:char、string;
3)布爾型:true、false;
11)類型轉(zhuǎn)換
1)顯示轉(zhuǎn)換;
2)隱式轉(zhuǎn)換;

二、bash的配置文件

功能:設(shè)定本地變量、定義命令別名。

1)profile類

profile類:為交互式登錄的用戶提供配置!

全局:/etc/profile、/etc/profile.d/*.sh
用戶:~/.bash_profile
2)bashrc類

bashrc類:為非交互式的用戶提供配置!

全局:/etc/bashrc
用戶:~/.bashrc

1)bash編程即編寫(xiě)格式及執(zhí)行方式

1)編寫(xiě)格式

shell腳本第一行必須頂格寫(xiě),用shabang定義指定的解釋器來(lái)解釋該腳本。

#!/bin/bash       //!即為shebang
//其它的以#開(kāi)頭的行均為注釋,會(huì)被解釋器忽略,可用來(lái)注釋腳本用途及版本,方便使用管理。
2)執(zhí)行方式

bash編程屬于面向過(guò)程編程,執(zhí)行方式如下:

1)順序執(zhí)行:按命令先后順尋依次執(zhí)行;
2)選擇執(zhí)行:測(cè)試條件,可能會(huì)多個(gè)測(cè)試條件,某條件滿足時(shí),則執(zhí)行對(duì)應(yīng)的分支;
3)循環(huán)執(zhí)行:將同一段代碼反復(fù)執(zhí)行多次,因此,循環(huán)必須有退出條件;否則,則陷入死循環(huán);
3)bash執(zhí)行選項(xiàng)
1)bash -n SHELLNAME  #語(yǔ)法測(cè)試,測(cè)試是否存在語(yǔ)法錯(cuò)誤;
2)bash -x SHELLNAME  #模擬單步執(zhí)行,顯示每一步執(zhí)行過(guò)程;

2)bash之算數(shù)運(yùn)算與邏輯運(yùn)算

1)算數(shù)運(yùn)算

定義整型變量:

1)et VAR_NAME=INTEGER_VALUE            //例如:let a=3
2)declare -i VAR_NAME=INTEGER_VALUE     //例如:declare -i a=3

實(shí)現(xiàn)算術(shù)運(yùn)算的方式:

let VAR_NAME=ARITHMATIC_EXPRESSION
VAR_NAME=$[ARITHMATIC_EXRESSION]
VAR_NAME=$((EXPRESSION))
VAR_NAME=$(expr $num1 + $num2)

算法運(yùn)算符:

+:加法
-:減法
*:乘法
/:整除
%:取余數(shù)
**:乘冪

注意:即使沒(méi)有定義為整型變量,字符型的數(shù)字依然可以參與算術(shù)運(yùn)算,bash會(huì)執(zhí)行變量類型的隱式類型轉(zhuǎn)換。

2)邏輯運(yùn)算
布爾運(yùn)算:真,假
與運(yùn)算:真 && 真 = 真
        真 && 假 = 假
        假 && 真 = 假
        假 && 假 = 假
或運(yùn)算:真 || 真 = 真
  真 || 假 = 真
  假 || 真 = 真
  假 || 假 = 假
非運(yùn)算:!真=假
        !假=真

3)bash編程之條件測(cè)試語(yǔ)句

1)bash條件測(cè)試

整型測(cè)試:整數(shù)比較

例如 [ $num1 -gt $num2 ]

-gt: 大于
-lt: 小于
-ge: 大于等于
-le: 小于等于
-eq: 等于
-ne: 不等于

字符測(cè)試:字符串比較

雙目:
例如[[ "$str1" > "$str2" ]]

>: 大于則為真
<: 小于則為真
>=:大于等于則為真
<=:小于等于則為真
==:等于則為真
!=:不等于則為真

單目:
-n String: 是否不空,不空則為真,空則為假
-z String: 是否為空,空則為真,不空則假

文件測(cè)試:判斷文件的存在性及屬性等

-a FILE:存在則為真;否則則為假;
-e FILE:存在則為真;否則則為假;
-f FILE: 存在并且為普通文件,則為真;否則為假;
-d FILE: 存在并且為目錄文件,則為真;否則為假;
-L/-h FILE: 存在并且為符號(hào)鏈接文件,則為真;否則為假;
-b: 存在并且為塊設(shè)備,則為真;否則為假;
-c: 存在并且為字符設(shè)備,則為真;否則為假
-S: 存在并且為套接字文件,則為真;否則為假
-p: 存在并且為命名管道,則為真;否則為假
-s FILE: 存在并且為非空文件則為值,否則為假;
-r FILE:文件可讀為真,否則為假
-w FILE:文件可寫(xiě)為真,否則為假
-x FILE:文件可執(zhí)行為真,否則為假
file1 -nt file2: file1的mtime新于file2則為真,否則為假;
file1 -ot file2:file1的mtime舊于file2則為真,否則為假;

組合條件測(cè)試:在多個(gè)條件間實(shí)現(xiàn)邏輯運(yùn)算

與:[ condition1 -a condition2 ]
  condition1 && condition2
或:[ condition1 -o condition2 ]
  condition1 || condition2
非:[ -not condition ]
  ! condition
與:COMMAND1 && COMMAND2
COMMAND1如果為假,則COMMAND2不執(zhí)行
或:COMMAND1 || COMMAND2
COMMAND1如果為真,則COMMAND2不執(zhí)行
非:! COMMAND
2)條件測(cè)試之if語(yǔ)句
1、if語(yǔ)句之單分支
語(yǔ)句結(jié)構(gòu):
if 測(cè)試條件;then
   選擇分支
fi
表示條件測(cè)試狀態(tài)返回值為值,則執(zhí)行選擇分支
例:寫(xiě)一個(gè)腳本,接受一個(gè)參數(shù),這個(gè)參數(shù)是用戶名;如果此用戶不存在,則創(chuàng)建該用戶;

#!/bin/bash
if ! id $1 &> /dev/null;then
  useradd $1
fi

2、if語(yǔ)句之雙分支
語(yǔ)句結(jié)構(gòu):
if 測(cè)試條件;then
   選擇分支1
else
   選擇分支2
fi

兩個(gè)分支僅執(zhí)行其中之一
例:通過(guò)命令行給定一個(gè)文件路徑,而后判斷:如果此文件中存在空白行,則顯示其空白行的總數(shù);否則,則顯示無(wú)空白行;
#!/bin/bash
if grep "^[[:space]]*$" $1 &> /dev/null; then
  echo "$1 has $(grep "^[[:space]]*$" $1 | wc -l) blank lines."
else
  echo "No blank lines"
fi

注意:如果把命令執(zhí)行成功與否當(dāng)作條件,則if語(yǔ)句后必須只跟命令本身,而不能引用。

3、if語(yǔ)句之多分支
語(yǔ)句結(jié)構(gòu):
if 條件1;then
     分支1
elif 條件2;then
     分支2
elif 條件3;then
     分支3
      ...
else
     分支n
fi

例:傳遞一個(gè)用戶名給腳本:如果此用戶的id號(hào)為0,則顯示說(shuō)這是管理員;如果此用戶的id號(hào)大于等于500,則顯示說(shuō)這是普通用戶;否則,則說(shuō)這是系統(tǒng)用戶。
#!/bin/bash
if [ $# -lt 1 ]; then
  echo "Usage: `basename $0` username"
  exit 1
fi
if ! id -u $1 &> /dev/null; then
  echo "Usage: `basename $0` username"
  echo "No this user $1."
  exit 2
fi

if [ $(id -u $1) -eq 0 ]; then
  echo "Admin"
elif [ $(id -u $1) -ge 500 ]; then
  echo "Common user."
else
  echo "System user."
fi
3)bash交互式編程
read [option] “prompt”-p:直接指定一個(gè)變量接受參數(shù)
-t timaout:指定等待接受參數(shù)的時(shí)間
-n:表示不換行

例:輸入用戶名,可返回其shell

#!/bin/bash
read -p "Plz input a username: " userName
if id $userName &> /dev/null; then
    echo "The shell of $userName is `grep "^$userName\>" /etc/passwd | cut -d: -f7`."
else
    echo "No such user. stupid."
fi  
4)條件測(cè)試與case語(yǔ)句
case語(yǔ)句:有多個(gè)測(cè)試條件時(shí),case語(yǔ)句會(huì)使得語(yǔ)法結(jié)構(gòu)更明晰
語(yǔ)句結(jié)構(gòu):

case 變量引用 in
PATTERN1)
  分支1
;;
PATTERN2)
  分支2
;;
...
*)
  分支n
;;
esac

PATTERN:類同于文件名通配機(jī)制,但支持使用|表示或者

 a|b:  a或者b*:匹配任意長(zhǎng)度的任意字符
?: 匹配任意單個(gè)字符
[]: 指定范圍內(nèi)的任意單個(gè)字符

例:寫(xiě)一個(gè)腳本,完成如下任務(wù),其使用形式如下所示:
script.sh {start|stop|restart|status}

其中:如果參數(shù)為空,則顯示幫助信息,并退出腳本;
如果參數(shù)為start,則創(chuàng)建空文件/var/lock/subsys/script,并顯示“starting script successfully.”
如果參數(shù)為stop,則刪除文件/var/lock/subsys/script,并顯示“Stop script successfully.”
如果參數(shù)為restart,則刪除文件/var/locksubsys/script并重新創(chuàng)建,而后顯示“Restarting script successfully.”
如果參數(shù)為status,那么:如果文件/var/lock/subsys/script存在,則顯示“Script is running…”,否則,則顯示“Script is stopped.”

#!/bin/bash
file='/var/lock/subsys/script'
case $1 in
start)
  if [ -f $file ];then
  echo "Script is running..."
    exit 3
  else
  touch $file
  [ $? -eq 0 ] && echo "Starting script successfully."
  fi
  ;;
stop)
  if [ -f $file ];then
  rm -rf $file
  [ $? -eq 0 ] && echo "Stop script successfully."
  else
  echo "Script is stopped..."
  exit 4
  fi
  ;;
restart)
  if [ -f $file ];then
  rm -rf $file
  [ $? -eq 0 ] && echo "Stop script successfully"
  else 
  echo "Script is stopped..."
  exit 5
  fi
  touch $file
  [ $? -eq 0 ] && echo "Starting script successfully"
  ;;
status)
  if [ -f $file ];then
  echo "Script is running..."
  else
  echo "Script is stopped."
  fi
  ;;
*)
  echo "`basename $0` {start|stop|restart|status}"
  exit 2
  ;;
 esac

4)bash編程之循環(huán)語(yǔ)句

1)循環(huán)之for循環(huán)
1、for語(yǔ)句格式一
語(yǔ)句結(jié)構(gòu):
for 變量名 in 列表; do
    循環(huán)體
done
列表:可包含一個(gè)或多個(gè)元素
循環(huán)體:依賴于調(diào)用變量來(lái)實(shí)現(xiàn)其變化
循環(huán)可嵌套
退出條件:遍歷元素列表結(jié)束
例:求100以內(nèi)所有正整數(shù)之和

#!/bin/bash
declare -i sum=0
for i in {1..100}; do
    let sum+=$i
done
echo $sum

2、for語(yǔ)句格式二
for ((初始條件;測(cè)試條件;修改表達(dá)式)); do
      循環(huán)體
done
先用初始條件和測(cè)試條件做判斷,如果符合測(cè)試條件則執(zhí)行循環(huán)體,再修改表達(dá)式,否則直接跳出循環(huán)。

例:求100以內(nèi)所有正整數(shù)之和(for二實(shí)現(xiàn))
#!/bin/bash
declare -i sum=0
for ((counter=1;$counter <= 100; counter++)); do
  let sum+=$counter
done
echo $sum
2)循環(huán)之while語(yǔ)句

while循環(huán)語(yǔ)句適用于循環(huán)次數(shù)未知,或不適用for直接生成較大的列表!

語(yǔ)句結(jié)構(gòu):
while 測(cè)試條件; do
  循環(huán)體
done
測(cè)試條件為真,進(jìn)入循環(huán);測(cè)試條件為假,退出循環(huán)
例1:求100以內(nèi)所有偶數(shù)之和,要求使用取模方法
#!/bin/bash
declare -i counter=1
declare -i sum=0
while [ $counter -le 100 ]; do
  if [ $[$counter%2] -eq 0 ]; then
     let sum+=$counter
  fi
  let counter++
 done
echo $sum

例2:提示用戶輸入一個(gè)用戶名,如果用戶存在,就顯示用戶的ID號(hào)和shell;否則顯示用戶不存在;顯示完成之后不退出,再次重復(fù)前面的操作,直到用戶輸入q或quit為止
#!/bin/bash
read -p "Plz enter a username: " userName
while [ "$userName" != 'q' -a "$userName" != 'quit' ]; do
  if id $userName &> /dev/null; then
     grep "^$userName\>" /etc/passwd | cut -d: -f3,7
  else
    echo "No such user."
  fi
read -p "Plz enter a username again: " userName
done

while特殊用法:遍歷文本文件
語(yǔ)句結(jié)構(gòu):
while read 變量名; do
  循環(huán)體
done < /path/to/somefile
變量名,每循環(huán)一次,記憶了文件中一行文本

例:顯示ID號(hào)為偶數(shù),且ID號(hào)同GID的用戶的用戶名、ID和SHELL
while read line; do
  userID=`echo $line | cut -d: -f3`
  groupID=`echo $line | cut -d: -f4`
  if [ $[$userID%2] -eq 0 -a $userID -eq $groupID ]; then
     echo $line | cut -d: -f1,3,7
  fi
done < /etc/passwd
3)循環(huán)之until語(yǔ)句
語(yǔ)句結(jié)構(gòu):
until 測(cè)試條件; do
      循環(huán)體
done
測(cè)試條件為假,進(jìn)入循環(huán);測(cè)試條件為真,退出循環(huán)

例:求100以內(nèi)所有偶數(shù)之和,要求使用取模方法(until實(shí)現(xiàn))

#!/bin/bash
declare -i counter=1
declare -i sum=0
until [ $counter -gt 100 ]; do
  if [ $[$counter%2] -eq 0 ]; then
     let sum+=$counter
  fi
  let counter++
done
echo $sum
例:提示用戶輸入一個(gè)用戶名,如果用戶存在,就顯示用戶的ID號(hào)和shell;否則顯示用戶不存在;顯示完成之后不退出,再次重復(fù)前面的操作,直到用戶輸入q或quit為止(until實(shí)現(xiàn))

#!/bin/bash
read -p "Plz enter a username: " userName
until [ "$userName" = 'q' -a "$userName" = 'quit' ]; do
  if id $userName &> /dev/null; then
   grep "^$userName\>" /etc/passwd | cut -d: -f3,7
else
echo "No such user."
fi
read -p "Plz enter a username again: " userName
done
4)循環(huán)之循環(huán)控制和shift
循環(huán)控制命令:
1)break:提前退出循環(huán);
2)break [N]: 退出N層循環(huán);N省略時(shí)表示退出break語(yǔ)句所在的循環(huán);
3)continue: 提前結(jié)束本輪循環(huán),而直接進(jìn)入下輪循環(huán);
4)continue [N]:提前第N層的循環(huán)的本輪循環(huán),而直接進(jìn)入下輪循環(huán);
5)死循環(huán)
#while體while true; do
      循環(huán)體
done
#until體
until false; do
      循環(huán)體
done

例1:寫(xiě)一個(gè)腳本,判斷給定的用戶是否登錄了當(dāng)前系統(tǒng)
(1) 如果登錄了,則腳本終止;
(2) 每5秒種,查看一次用戶是否登錄;
#!/bin/bash
while true; do
    who | grep "gentoo" &> /dev/null
    if [ $? -eq 0 ];then
break
    fi
    sleep 5
done
echo "gentoo is logged."
6)shift

位置參數(shù)可以用shift命令左移,比如shift 3 表示原來(lái)的$4現(xiàn)在變成$1,原來(lái)的$5變成$2等等,原來(lái)的$1、$2、$3丟棄,$0不移動(dòng)。不帶參數(shù)的shift命令相當(dāng)于shift 1。

我們知道,對(duì)于位置變量或命令行參數(shù),其個(gè)數(shù)必須是確定的,或者當(dāng)shell程序不知道其個(gè)數(shù)時(shí),可以把所有參數(shù)一起復(fù)制給“$*”。若用戶要求 Shell 在不知道位置變量個(gè)數(shù)的情況下,還能逐個(gè)的把參數(shù)一一處理,也就是在 $1 后為 $2,在 $2 后面為 $3 等。在 shift 命令執(zhí)行前變量 $1 的值在 shift 命令執(zhí)行后就不可用了。

實(shí)例一如下:

[root@localhost ~]# cat 1.sh
#!/bin/bash
while [ $# -ne 0 ]
do
echo "第一個(gè)參數(shù)為:$1  參數(shù)個(gè)數(shù)為:$#"
shift
done
[root@localhost ~]# sh 1.sh 1 2 3 4
第一個(gè)參數(shù)為:1  參數(shù)個(gè)數(shù)為:4
第一個(gè)參數(shù)為:2  參數(shù)個(gè)數(shù)為:3
第一個(gè)參數(shù)為:3  參數(shù)個(gè)數(shù)為:2
第一個(gè)參數(shù)為:4  參數(shù)個(gè)數(shù)為:1

從上面例子中可以看出shift命令每執(zhí)行一次,變量的個(gè)數(shù)($#)減1,而變量的值提前一位。

實(shí)例二如下:

[root@localhost ~]# cat 2.sh
#!/bin/bash
if [ $# -eq 0 ]
then
echo "Usage:2.sh 參數(shù)"
exit 1
fi
sum=0
while [ $# -ne 0 ]
do
sum=`expr ${sum} + $1`
shift
done
echo "sum is:${sum}"
[root@localhost ~]# sh 2.sh 10 20 30
sum is:60

shift命令還有一個(gè)重要用途,Bash定義了9個(gè)位置變量,從$1到$9,這并不意味這用戶在命令行只能使用9個(gè)參數(shù),借助shift命令可以訪問(wèn)多于9個(gè)的參數(shù)。

shift命令一次移動(dòng)到參數(shù)的個(gè)數(shù)由其所帶的參數(shù)指定,例如當(dāng)shell程序處理完前9個(gè)命令行參數(shù)后,可以使用shift 9命令把$10移動(dòng)到$1。

5)bash編程之函數(shù)

語(yǔ)法結(jié)構(gòu):

function F_NAME {    
   函數(shù)體
  }
或
  F_NAME() {
    函數(shù)體
  }
可調(diào)用:使用函數(shù)名,函數(shù)名出現(xiàn)的地方,會(huì)被自動(dòng)替換為函數(shù);
函數(shù)的返回值:
函數(shù)的執(zhí)行結(jié)果返回值:代碼的輸出
函數(shù)中使用打印語(yǔ)句:echo, printf
函數(shù)中調(diào)用的系統(tǒng)命令執(zhí)行后返回的結(jié)果
執(zhí)行狀態(tài)返回值:
默認(rèn)取決于函數(shù)體執(zhí)行的最后一個(gè)命令狀態(tài)結(jié)果
自定義退出狀態(tài)碼:return [0-255]

注意:函數(shù)體運(yùn)行時(shí),一旦遇到return語(yǔ)句,函數(shù)即返回!

1)函數(shù)可以接收參數(shù)

在函數(shù)中調(diào)用函數(shù)參數(shù)的方式同腳本中調(diào)用腳本參數(shù)的方式:

位置參數(shù)
$1, $2, …
$#, $*, $@

實(shí)例:
要求如下:
1)提示用戶輸入一個(gè)可執(zhí)行命令;
2)獲取這個(gè)命令所依賴的所有庫(kù)文件(使用ldd命令);
3)復(fù)制命令之/mnt/sysroot目錄;
4)復(fù)制各庫(kù)文件至/mnt/sysroot對(duì)應(yīng)的目錄中;

[root@localhost ~]# cat 1.sh
#!/bin/bash
target=/mnt/sysroot/
[ -d $target ] || mkdir $target
preCommand() {
    if which $1 &> /dev/null; then
  commandPath=`which --skip-alias $1`
  return 0
    else
  echo "No such command."
  return 1
    fi
}

commandCopy() {
    commandDir=`dirname $1`
    [ -d ${target}${commandDir} ] || mkdir -p ${target}${commandDir}
    [ -f ${target}${commandPath} ] || cp $1 ${target}${commandDir}
}

libCopy() {
    for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; do
libDir=`dirname $lib`
[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
[ -f ${target}${lib} ] || cp $lib ${target}${libDir}
    done
} 
read -p "Plz enter a command: " command

until [ "$command" == 'quit' ]; do

  if preCommand $command &> /dev/null; then
    commandCopy $commandPath
    libCopy $commandPath
  fi
    exit 1
done
[root@localhost ~]# sh 1.sh
Plz enter a command: cat
[root@localhost ~]# ls /mnt/sysroot/bin/
cat
[root@localhost ~]# ls /mnt/sysroot/
bin  lib64
2)bash編程之信號(hào)捕捉

trap命令用于在shell程序中捕捉到信號(hào),之后可以由三種反應(yīng)方式:
1)執(zhí)行一段程序來(lái)處理這一信號(hào);
2)接收信號(hào)的默認(rèn)操作;
3)忽略這一信號(hào);

示例:
寫(xiě)一個(gè)腳本,能夠ping探測(cè)指定網(wǎng)絡(luò)內(nèi)的所有主機(jī)是否在線,當(dāng)沒(méi)有執(zhí)行完時(shí)可接收ctrl+c命令退出。

[root@localhost ~]# cat 1.sh
#!/bin/bash
quitScript() {
   echo "Quit..."
}    
trap 'quitScript; exit 5' SIGINT

cnetPing() {
  for i in {1..254}; do
    if ping -c 1 -W 1 $1.$i &> /dev/null; then
      echo "$1.$i is up."
     else
      echo "$1.$i is down."
    fi
    done
}

bnetPing() {
  for j in {0..255}; do
    cnetPing $1.$j 
  done
}
anetPing() {
for m in {0..255}; do
bnetPing $1.$m
done
}

netType=`echo $1 | cut -d"." -f1`

if [ $netType -ge 1 -a $netType -le 126 ]; then
anetPing $netType
elif [ $netType -ge 128 -a $netType -le 191 ]; then
bnetPing $(echo $1 | cut -d'.' -f1,2)
elif [ $netType -ge 192 -a $netType -le 223 ]; then
cnetPing $(echo $1 | cut -d'.' -f1-3)
else
echo "Wrong"
exit 2
fi
[root@localhost ~]# sh 1.sh 192.168.1.1
192.168.1.1 is down.
192.168.1.2 is down.
192.168.1.3 is down.
192.168.1.4 is down.
192.168.1.5 is down.
192.168.1.6 is down.
192.168.1.7 is down.
192.168.1.8 is down.
192.168.1.9 is down.
192.168.1.10 is up.
192.168.1.11 is down.
^CQuit...

——————————本次博文到此結(jié)束,感謝閱讀——————————

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI