SHELL指令碼學習總結(第五話)指令碼控制

2021-10-09 14:03:20 字數 3480 閱讀 9922

linux利用訊號與執行在系統中的程序進行通訊。我們可以利用這些訊號來停止、啟動、終止程序。可以通過對指令碼進行程式設計,使其在收到特定訊號時執行某些命令,從而控制shell指令碼的操作。

最常見訊號訊號值

描述快捷鍵

1sighup

掛起程序

2sigint

終止程序

ctrl+c

3sigquit

停止程序(暫停)

ctrl+z

9sigkill

無條件終止程序

# sleep 100                     ###休眠100秒

^c ###ctrl+c終止了以上命令

## sleep 100 ###休眠100秒

^z ###ctrl+z暫停了以上命令

[1]+ stopped sleep 100

# ps -l ###使用ps命令可以檢視作業的狀態

f s uid pid ppid c pri ni addr sz wchan tty time cmd

0 s 0 41191 41184 0 80 0 - 6672 - pts/0 00:00:00 bash

0 t 0 41253 41191 0 80 0 - 1820 - pts/0 00:00:00 sleep ###t代表暫停

0 r 0 41279 41191 0 80 0 - 11351 - pts/0 00:00:00 ps

# kill -9 41253 ###你可以用kill命令傳送乙個sigkill訊號(9)來終止它

# ###終止了以後螢幕不會有任何輸出,但是按下回車就會顯示

[1]+ killed sleep 100

trap命令允許你來指定shell指令碼需要攔截的linux訊號。當指令碼收到了trap命令中列出的訊號,就會交由本地處理,轉化成其他命令進行執行。

trap命令的格式是:

trap commands signals                         trap 命令 訊號

cat jbkz002.sh

#!/bin/bash

trap "echo 'sorry! now ctrl+c will no over this script!'" sigint

echo "this is a test script."

###trap將sigint也就是ctrl+c轉變其他命令

count=1

while [ $count -le 10 ]

doecho "loop #$count"

sleep 1

count=$[ $count + 1 ]

done

# ./jbkz002.sh

this is a test script.

loop #1

loop #2

loop #3

^csorry! now ctrl+c will no over this script! ###嘗試按下ctrl+c後沒有退出

loop #4

loop #5

loop #6

^csorry! now ctrl+c will no over this script! ###嘗試按下ctrl+c後沒有退出

loop #7

loop #8

loop #9

loop #10

&&&    捕獲指令碼退出

# cat jbkz003.sh

#!/bin/bash

trap "echo 'sorry! this script is over!'" exit ###使用exit就能捕獲指令碼的退出

echo "this is a test script."

count=1

while [ $count -le 3 ]

doecho "loop #$count"

sleep 1

count=$[ $count + 1 ]

done

# ./jbkz003.sh

this is a test script.

loop #1

loop #2

loop #3

sorry! this script is over!

如果你想在不同位置進行不同的捕獲與命令,那你只需要在指令碼內重新使用trap命令就可以了。

如果你需要刪除某個捕獲,那就請使用 -- 。

trap "echo '***xx'" sigint    ##捕獲

trap -- sigint ##使用 -- 取消捕獲(也可以使用trap - sigint)

&&&    後台執行指令碼

只需要在命令後面加上&即可。

# cat jbkz004.sh

#!/bin/bash

count=1

while [ $count -le 10 ]

doecho "loop #$count"

date

sleep 1

count=$[ $count + 1 ]

done > jbkz004.log

# ./jbkz004.sh & ###後面跟上&就成了後台執行

[1] 43341 ###顯示此程序pid

# cat jbkz004.log ###檢查指令碼運**況,結果ok

loop #1

fri sep 25 14:54:33 cst 2020

loop #2

fri sep 25 14:54:34 cst 2020

loop #3

fri sep 25 14:54:35 cst 2020

......

有時你會想在終端會話中啟動shell指令碼,然後讓指令碼一直以後臺模式執行到結束,即使你退

出了終端會話。這種情況你可以使用nohup命令。

# nohup ./test.sh &     ###格式如左,非常簡單。

[1] 8356

###nohup會自動將stdout和stderr的訊息重定向到nohup.out檔案中。

以上就是第五話內容。

shell 指令碼第五彈

1.shell指令碼程式設計 1.指令碼是 c語言 程式設計 shell 指令碼 只作用於linux作業系統 以間隔多行命令 2.功能 批量處理檔案 自動去做某些功能 date,who,ls 處理日誌資訊 備份 刪除原日誌 上傳備份檔案 週期性計畫任務 3.學習方法 linux的命令 lamp we...

shell指令碼學習 01 指令碼基礎

一 shell概念 shell是一種作為使用者與linux系統之間的操作介面程式,允許使用者向作業系統輸入需要執行的命令的一種高階 解釋性程式語言。二 shell的種類 bourne shell sh c shell csh korn shell ksh bourne again shell bas...

shell指令碼學習(五)

1 統計檔案的行數 單詞數 字元數 1 行數 wc l file cat file wc l 2 單詞數 wc w file cat file wc w 3 統計字元數 wc c file cat file wc c 4 不跟任何引數時,三者都列印,列印順序為行數 單詞數 字元數 wc file h...