1. 程式人生 > >Shell指令碼基礎知識及案例

Shell指令碼基礎知識及案例

  Shell 指令碼(即 Shell Script),Shell 指令碼類似於 Windows/Dos 下的批處理,也就是將所需的各類命令預先放入到一個檔案中,方便一次性執行的一個程式檔案,主要應用在 Linux 系統運維上,方便管理員進行設定或者管理用的。但是它比 Windows 下的批處理更強大,比用其他程式語言編寫的程式效率更高。由於它使用了 Linux/Unix 下的命令,因此想編寫滿足功能需求的 Shell 指令碼,需要了解各種 Linux/Unix 命令,如 grep、sed、awk 等等。

Shell 指令碼的第一行

  一般來說,Shell 指令碼的第一行用於指定執行該指令碼的直譯器,如:

#!/bin/bash

“#!”符號讀作“Sha-bang”,是 Shell 指令碼的起始符號,後面緊跟直譯器的路徑,這裡是 /bin/bash,此外我們還可能看到 /bin/sh、/bin/python 等等。

Shell 指令碼的變數

  我們在 Shell 指令碼中經常會遇到 $#$*$$[email protected]$0$1$2$? 等形式的符號,要是不清楚其含義,就很容易懵逼,所以有必要記住以下這些規則。

$# —— 表示執行指令碼傳入引數的個數

$* —— 表示執行指令碼傳入引數列表

$$ —— 表示程序id

[email protected]

—— 表示執行指令碼傳入所有引數

$0 —— 表示執行指令碼名稱

$1 —— 表示第一個引數

$2 —— 表示第二個引數

$? —— 表示指令碼執行狀態0正常,其他表示有錯誤

  
Shell 指令碼中可以加入延時

  在 Shell 指令碼中經常需要做一些延時處理,那麼延時需要用到系統的 sleep 或 usleep。

sleep : 預設以秒(s)為單位
usleep : 預設以微秒(us)為單位

【 1s = 1000ms = 1000000us 】

此外,sleep 不僅可以用秒為單位,還可以指定延遲的單位,例如:

sleep 1s 表示延遲一秒
sleep 1m 表示延遲一分鐘
sleep 1h 表示延遲一小時
sleep 1d 表示延遲一天

  值得一提的是,使用 sleep 或 usleep 進行延時是會阻塞的,假如我們在一個 Shell 指令碼(姑且稱為父指令碼)中呼叫了另一個 Shell 指令碼(子指令碼),而子指令碼恰好使用了延時,那麼父指令碼也會阻塞。如果這不是你想要的效果,請往下看(合理地使用 &)。

Shell 指令碼的執行流程

  Shell 是單執行緒順序執行的,要想實現“多執行緒”可以通過在後臺執行多程序的方式來實現。在 bash 中,使用後臺任務來實現任務的“多程序化”。在不加控制的模式下,不管有多少任務,全部都後臺執行。也就是說,在這種情況下,有多少任務就有多少“程序”在同時執行。
  舉個栗子:

# !/bin/bash  
for  ((i = 0 ;i < 5 ;i ++ )); do 
{
    sleep   3 ;echo  1 >> aa  &&  echo  " done! " 
} 
done
wait 
cat aa | wc  - l
rm aa

  上面這種情況下,程式順序執行,每個迴圈3s,共需15s左右。輸出結果如下:

$  time  bash test . sh 
 done ! 
 done ! 
 done ! 
 done ! 
 done ! 
 5 

 real    0m15 . 030s
 user    0m0 . 002s
 sys     0m0 . 003s

進行“多程序化”改造:

# !/bin/bash 
for  ((i = 0 ;i < 5 ;i ++ )); do 
{
    sleep   3 ;echo  1 >> aa  &&  echo  " done! " 
} & 
done
wait 
cat aa | wc  - l
rm aa

  這個改造實際上就在上面基礎上多加了一個後臺執行 & 符號,此時應該是5個迴圈任務併發執行,最後需要3s左右時間。輸出結果如下:

$  time  bash test . sh 
 done ! 
 done ! 
 done ! 
 done ! 
 done ! 
 5 

 real    0m3 . 011s
 user    0m0 . 002s
 sys     0m0 . 004s

  這裡順便說一下 wait 的作用。wait 是等待前面的後臺任務全部完成才往下執行,否則程式本身是不會等待的,這樣對後面依賴前面任務結果的命令來說就可能出錯。例如上面 wc -l 的命令就報錯:不存在 aa 這個檔案。

案例:Shell 指令碼找出某個程序並將其 kill

【test.sh】

#!/bin/bash

NAME=$1

PID=`ps -ef | grep "$NAME" | grep -v "$0" | grep -v "grep" | awk '{print $1}'`

echo $PID

for id in $PID
do
kill -9 $id
echo "killed $id"
done

測試:為該 Shell 指令碼設定執行許可權,chmod a+x test.sh,執行 ./test.sh 程序名 即可。

相關推薦

Shell指令碼基礎知識案例

  Shell 指令碼(即 Shell Script),Shell 指令碼類似於 Windows/Dos 下的批處理,也就是將所需的各類命令預先放入到一個檔案中,方便一次性執行的一個程式檔案,主要應用在 Linux 系統運維上,方便管理員進行設定或者管理用的。但

Linux運維之shell指令碼基礎知識

1、bash中的算術運算   let運算子 [[email protected]:vg_adn_tidbCkhsTest~/tidb-bench/sysbench]#let i=1+2 [[email protected]:vg_adn_tidbCkhsTe

SHELL指令碼------基礎知識(|||)

一、SHELL中的函式 1.語法方法1: 函式名( ) {     函式體     return n } 方法2: function 函式名( ) {     函式體    

SHELL指令碼------基礎知識(||)

一、Sed 行編輯器 一、sed: 1.用來操作純 ASCII 碼的文字 2.Sed 一次處理一行內容,處理時,把當前處理的行儲存在臨時緩衝區中,稱之為“模式空間” 3.可以指定僅僅處理哪些行,Sed 符合模式條件的處理,不符合條件的不予處理 4.處理完成之後把緩衝區的內容送往螢幕 5.接著

SHELL指令碼------基礎知識

一、shell的簡單瞭解 一、什麼是shell? shell也是作業系統中的一個軟體,它包在linux核心的外面,為使用者和核心之間的互動提供了一個介面,系統中的命令用shell去解釋shell接受系統迴應的輸出並顯示其到螢幕中。 二、什麼是shell指令碼? 1.簡單的說,當命令或

shell基礎知識使用方法

基礎知識 shell 使用方法 shell基礎知識及使用方法 SHELL是用戶與操作系統之間完成交互式操作的一個接口程序,為用戶提供簡化了的操作。 第一代shell在上世紀70年代中於貝爾實驗室中誕生,名為bourne shell,簡稱sh,後期又衍生出多個版本,如csh,ksh等;而Lin

Spring基礎知識入門

架構 erl struct asp spf line 依賴註入 myeclipse lin ---恢復內容開始--- 1 spring框架概述 1.1 什麽是spring Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由

linux入門基礎知識簡單命令介紹

linux基礎linux入門基礎知識介紹1、計算機硬件組成介紹計算機主要由cpu(運算器、控制器),內存,I/O,外部存儲等構成。 cpu主要是用來對二進制數據進行運算操作,它從內存中取出數據,然後進行相應的運算操作。不能從硬盤中直接取數據。 內存從外部存儲中取出數據供cpu運存。內存的最小單位是

sql sever 基礎知識詳細筆記

false 關系型數據庫 保存 ner 影響 平均值 code framwork 綁定 第六章:程序數據集散地:數據庫 6.1:當今最常用的數據庫 sql server:是微軟公司的產品 oracle:是甲骨文公司的產品 DB2:數據核心又稱DB2通用服務器

Shell】-- 基礎知識(1)

com nbsp strong 設置 技術分享 lin 以及 換行符 知識 一、基礎知識   此處介紹Shell基礎知識,以及部分知識點。   概念:Shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令並把它送入內核去執行。   分

maven基本基礎知識命令學習-1

packaging 本地 結構 images cut 字節碼 倉庫 鏡像倉庫 apache Maven概述:Maven是很有效的項目管理工具,maven是基於項目對象模型(POM),可以通過一小段描述信息來管理項目構建、報告和文檔的軟件項目管理工具。統一管理環境,架包等。

VueJS 基礎知識項目總結

平臺 web 應用 瀏覽器 error 很慢 匹配 ++ 描述 oos 1、build :dev-server.js 是在使用終端命令時啟動時執行的,裏面可以修改端口號 (修改第16行即可) 2、index.html 是整個文件的入口 src 裝的是你寫入的文件3、ma

MySQL備份恢復基礎知識MySQLdump講解

mysql 備份恢復 基礎知識 mysqldump數據庫備份恢復知識要點:時間軸備份類型分類: 完全備份:備份整個數據集 增量備份:上一次完全備份,或上一次增量備份以後變化的數據的備份(還原麻煩,節省空間) 差異備份:僅備份最近一次完全備份以來變化的數據(還原簡單,空間消耗大)什

Shell】-- 基礎知識(2)

命令別名 進程 ply exp ron -s 歷史 size 接收 1、Shell腳本運行方式   創建Shell腳本文件,一般以.sh結尾(如:example.sh)   Shell腳本運行方式如下: 添加 ‘x’ 執行權限(相對或絕對路徑執行) 使用bash或sour

微軟DFS基礎知識復制原理

微軟DFS復制原理 DFS同步原理 DFS復制 DFS是微軟Windows Server上面自帶的分布式文件共享服務,通過使用DFS,可以幫助企業通過單一路徑就可以訪問到所有共享文件夾的內容,同時可以根據客戶端登陸位置自動聯系就近的服務器,提供文件服務器負載均衡和容錯能力。DFS的主要功能分為兩大

計算機基礎知識UNIX發展史

系統/運維 Linux Technorati Tags: UNIX發展史,存儲知識,ABI,API,開源協議TOC[-]1、計算機系統組成機構2、馮諾依曼體系結構3、服務器硬件簡介4、存儲容量換算5、存儲基礎知識6、操作系統7、開發相關概念8、UNIX發展史9、開源協議10、Linux哲學思想計算機基

第二十二課 Shell基礎知識

2018042101一、shell介紹1、shell是一個命令解釋器,提供用戶和機器進行交互,每個用戶都可以有自己特定的shell ,2、CentOS7 默認shell為bash,還有zsh,ksh它們有細節上的差異而已,我們可以查下系統中是否存在zsh: yum list |grep zsh bash有哪

Python爬蟲基礎知識前期準備

多多指教 arm 讀取 第一次 小項目 網信 替換 mark python爬蟲 學習爬蟲有一小段時間了,於是決定把自己學爬蟲時所學的,寫過的代碼以及看過的文檔記錄下來,權當小結。第一次寫這些,如果有錯誤,請多指教。 首先我們需要了解一下什麽是爬蟲。 根據百度百科上給出的定義

keepalive基礎知識主備模型搭建

其中 devel ring ice inux 文件中 實現 unit emd lvs模型屬於單點故障,對real server的健康狀態檢查可以通過寫腳本實現,keepalived可以實現高可用:keepalive:vrrp協議在Linux主機上以守護進程方式的實現; 能夠

Linux防火墻基礎知識應用;設置SNAT策略,局域網共享上網;DNAT策略,發布內部服務器

開啟 提供web服務 port 使用 配置 網頁 遵從 internet 個數 防火墻,通俗地打個比方就相當於城池周圍的護城河,開放和管理服務的提供一般電腦系統的安全主要取決於:1)第三方監控殺毒軟件 如360殺毒軟件2)系統策略 防火墻規則設定3)文件的權限設定 Lin