Linux Shell(腳本)編程入門

為什么要進行shell編程

在Linux系統中,雖然有各種各樣的圖形化接口工具,但是sell仍然是一個非常靈活的工具。Shell不僅僅是命令的收集,而且是一門非常棒的編程語言。您可以通過使用shell使大量的任務自動化,shell特別擅長系統管理任務,尤其適合那些易用性、可維護性和便攜性比效率更重要的任務。

下面,讓我們一起來看看shell是如何工作的:

建立一個腳本

Linux中有好多中不同的shell,但是通常我們使用bash (bourne again shell) 進行shell編程,因為bash是免費的并且很容易使用。所以在本文中筆者所提供的腳本都是使用bash(但是在大多數情況下,這些腳本同樣可以在bash的大姐,bourne shell中運行)。

如同其他語言一樣,通過我們使用任意一種文字編輯器,比如nedit、kedit、emacs、vi等來編寫我們的shell程序。程序必須以下面的行開始(必須方在文件的第一行):

#!/bin/sh

符號#!用來告訴系統它后面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。當編輯好腳本時,如果要執行該腳本,還必須使其可執行。

要使腳本可執行:

chmod +x filename

然后,您可以通過輸入: ./filename 來執行您的腳本。

注釋

在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結束。我們真誠地建議您在程序中使用注釋。如果您使用了注釋,那么即使相當長的時間內沒有使用該腳本,您也能在很短的時間內明白該腳本的作用及工作原理。

變量

在其他編程語言中您必須使用變量。在shell編程中,所有的變量都由字符串組成,并且您不需要對變量進行聲明。要賦值給一個變量,您可以這樣寫:

變量名=值

取出變量值可以加一個美元符號($)在變量前面:

#!/bin/sh

#對變量賦值:

a=”hello world”

# 現在打印變量a的內容:

echo “A is:”

echo $a

在您的編輯器中輸入以上內容,然后將其保存為一個文件first。之后執行chmod +x first。使其可執行,最后輸入./first執行該腳本。

這個腳本將會輸出:

A is:

hello world

有時候變量名很容易與其他文字混淆,比如:

num=2

echo “this is the $numnd”

這并不會打印出”this is the 2nd”,而僅僅打印”this is the “,因為shell會去搜索變量numnd的值,但是這個變量時沒有值的。可以使用花括號來告訴shell我們要打印的是num變量:

num=2

echo “this is the $nd”

這將打?。?this is the 2nd

有許多變量是系統自動設定的,這將在后面使用這些變量時進行討論。

如果您需要處理數學表達式,那么您需要使用諸如expr等程序(見下面)。除了一般的僅在程序內有效的shell變量以外,還有環境變量。由export關鍵字處理過的變量叫做環境變量。我們不對環境變量進行討論,因為通常情況下僅僅在登錄腳本中使用環境變量。

Shell命令和流程控制

在shell腳本中可以使用三類命令:

1)Unix 命令:

雖然在shell腳本中可以使用任意的unix命令,但是還是由一些相對更常用的命令。這些命令通常是用來進行文件和文字操作的。

常用命令語法及功能:

echo “some text”: 將文字內容打印在屏幕上。

ls: 文件列表。

wc –l file wc -w file wc -c file: 計算文件行數 計算文件中的單詞數 計算文件中的字符數。

cp sourcefile destfile: 文件拷貝。

mv oldname newname : 重命名文件或移動文件。

rm file: 刪除文件。

grep ‘pattern’ file: 在文件內搜索字符串比如:grep ‘searchstring’ file.txt

cut -b colnum file: 指定欲顯示的文件內容范圍,并將它們輸出到標準輸出設備比如:輸出每行第5個到第9個字符cut –b 5-9 file.txt千萬不要和cat命令混淆,這是兩個完全不同的命令。

cat file.txt: 輸出文件內容到標準輸出設備(屏幕)上。

file somefile: 得到文件類型。

read var: 提示用戶輸入,并將輸入賦值給變量。

sort file.txt: 對file.txt文件中的行進行排序。

uniq: 刪除文本文件中出現的行列比如: sort file.txt | uniq。

expr: 進行數學運算Example: add 2 and 3 expr 2 “+” 3。

find: 搜索文件比如:根據文件名搜索find . -name filename -print。

tee: 將數據輸出到標準輸出設備(屏幕) 和文件比如:somecommand | tee outfile。

basename file: 返回不包含路徑的文件名比如: basename /bin/tux將返回 tux。

dirname file: 返回文件所在路徑比如:dirname /bin/tux將返回 /bin。

head file: 打印文本文件開頭幾行。

tail file : 打印文本文件末尾幾行。

sed: Sed是一個基本的查找替換程序??梢詮臉藴瘦斎耄ū热缑罟艿溃┳x入文本,并將結果輸出到標準輸出(屏幕)。該命令采用正則表達式(見參考)進行搜索。不要和shell中的通配符相混淆。比如:將linuxfocus 替換為 LinuxFocus :cat text.file | sed ‘s/linuxfocus/LinuxFocus/’ > newtext.file。

awk: awk 用來從文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, ‘{print “,” }’這里我們使用,作為字段分割符,同時打印第一個和第三個字段。如果該文件內容如下:

Adam Bor, 34, IndiaKerry Miller, 22, USA

命令輸出結果為:

Adam Bor, IndiaKerry Miller.

2) 概念: 管道, 重定向和 backtick

這些不是系統命令,但是他們真的很重要。

管道 (|) 將一個命令的輸出作為另外一個命令的輸入。

grep “hello” file.txt | wc -l

在file.txt中搜索包含有”hello”的行并計算其行數。在這里grep命令的輸出作為wc命令的輸入。當然您可以使用多個命令。

重定向:將命令的結果輸出到文件,而不是標準輸出(屏幕)。

> 寫入文件并覆蓋舊文件。

>> 加到文件的尾部,保留舊文件內容。

反短斜線,使用反短斜線可以將一個命令的輸出作為另外一個命令的一個命令行參數。

命令:

find . -mtime -1 -type f -print

用來查找過去24小時(-mtime –2則表示過去48小時)內修改過的文件。如果您想將所有查找到的文件打一個包,則可以使用以下腳本:

#!/bin/sh

# The ticks are backticks (`) not normal quotes (‘):

tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`

3) 流程控制

“if” 表達式 如果條件為真則執行then后面的部分:

if ….; then

原創文章,作者:15893442518,如若轉載,請注明出處:http://www.www58058.com/83893

(0)
1589344251815893442518
上一篇 2017-08-05
下一篇 2017-08-05

相關推薦

  • linux系統啟動流程詳解

    一、 為什么要研究linux系統啟動:     或許有人會說,等它開機就好了,為什么還要研究它開機流程呢,其實如果服務器運行很好又沒有人為的誤操作等,或許不用研究,但是為了能在系統出問題后第一時間的修復它,又或者你忘記了root密碼等情況時就非常有必要研究一下linux的開機流程了,因為只有知道了它是如何運作的,才能讓…

    Linux干貨 2016-09-13
  • vim 常見用法、計劃任務和腳本初探

    vim的常用方法 gg:跳至首行 G:跳至魔行 dd:刪除光標所在行 ndd:刪除光標及以下(n-1)行 yy:復制光標所在行 p:把復制行粘貼在光標下一行 P:粘貼在上一行 u:取消上一步操作 /string:查找關鍵字 n:往下查詢 N:往上查詢 %s/string1/string2/:把string1替換為string2,后面加g表示全局替換 set&…

    Linux干貨 2016-12-04
  • read,locate ,find 的總結及相關聯系

    read 變量名 read 變量名1 [變量名2] < 文件名不支持管道read 變量名1 [變量名2] <<< “值1 [值2] …”使用read來把輸入值分配給一個或者多個shell變量     -p 指定要顯示的提示     # read -p…

    Linux干貨 2017-08-12
  • 一鍵搭建mysql集群系列二

    mysql 5.7  主從復制 本節是在上一節的基礎之上做的操作,上節我們通過腳本實現了一鍵自動化安裝mysql5.7,這次我們要在三臺機器上部署msyql5.7,并實現主從復制,實現的宗旨是,能自動化,就盡量自動化,實在不能自動化,那就手工化 用的腳本和文件說明1.install_mysql.sh 自動化安裝mysql腳本2.ntpdate.sh 時間同步…

    2017-05-21
  • 馬哥教育網絡班第21期+第三周課程作業

    1. 列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 who | awk  '{print $1}'|uniq 2.列出最后登錄到當前系統的用戶的相關信息 last | head -1   3. 讀取當前系統上被用戶當做其默認shell最多的那個shell cat /etc/pa…

    Linux干貨 2016-07-26
  • 基礎網絡配置

    配置文件: /etc/ude /proc/sys/net/ipv4/ip_forward /etc/sysconfig/network-scripts/ifcfg-IFACE 網絡配置文件 /etc/sysconfig/network-scripts/route-IFACE 路由配置文件 配置文件里的設置: DEVICE:此配置文件應用到的設備 HWADDR…

    Linux干貨 2017-05-08
欧美性久久久久