linux shell語言使用背景
目前全球正處於「網際網路+」的時代,各行各業都與網際網路掛鉤,比如網際網路+教育、網際網路+銷售等等。幾乎所有的商品、服務網上都能找得到,而支撐網際網路的幕後支柱就是linux系統。linux運維技術成為it技術人員的必備技能。
想要降低linux運維成本就要進行運維自動化,進行自動化就需要指令碼語言。時下linux系統最流行的指令碼語言就是shell和python。python的流行時間短,學習成本高。而shell幾乎是所有運維公司都必須使用的自動化語言,在很多任務作環節中必不可少。
學習shell程式設計最好有相關基礎,比如vim編輯器、ssh終端、linux命令(重點掌握正規表示式和grep、sed、awk命令)、linux網路部署、日誌分析排錯、網路服務等。
常見網路服務型別:crond、rsync、inotify、nginx、php、mysql、keepalived、memcached、redis、nfs、iptables、svn、git等。
其他指令碼語言
php網頁程式語言。perl語言(已成為歷史)。python。
linux命令在shell程式設計中的作用
每種語言都有自帶的函式庫,唯獨shell沒有,shell使用linux命令,可以把linux命令看作是shell的函式庫。
什麼是shell
定義:shell是linux/unix命令直譯器,負責將命令翻譯給linux系統核心並返回運算結果,是人機互動的中介介面。
shell分類:命令列shell(cli shell),圖形化shell(gui shell)。圖形化shell就是用滑鼠點點點,有桌面介面的那種。命令列shell類似於windows中的dos。
命令列shell分類:主要有兩大類,b shell系列和c shell系列,b shell用於linux系統,c shell用於unix系統。
b shell分類:包括bourne shell(sh)、korn shell(ksh)、bourne again shell(bash)三種型別。重點掌握bash,它是各種linux發行版系統預設的shell,是目前主流linux shell。bash集合了ksh和sh的優點,而ksh是由sh發展出來的。
c shell又包括csh、tcsh兩種型別。tcsh是csh的增強版,已運用於蘋果電腦mac系統,但目前通用的還是csh。
乙個系統可以儲存了多個cli shell,centos 6檢視系統有哪些shell可以使用命令:cat /etc/shells
命令執行方式分類
互動式、批量式。(互動式就是一次只能輸入一條命令,機器返回對應結果,再輸入一條命令再返回一次結果。批量式就是一次寫一整套指令碼命令,然後機器一次性執行完。命令列shell中使用linux命令的執行方式就是互動式,而shell指令碼當然是使用批量式執行)
什麼是shell指令碼
定義:shell指令碼是採用某種linux shell對應的命令以及操作語句編寫的linux系統批量操作程式。
(windows中用dos直譯器寫的批量操作檔案是.bat檔案)
(linux中用shell直譯器寫的批量操作檔案就是shell指令碼,字尾為.sh)
(所有程式語言都是由庫函式和語句組成,而語句又由關鍵字和變數組成。至於表示式,不算在語言範疇中,比如1+2誰都能執行,屬於哪門語言?)
shell指令碼內容:和其他計算機語言類似,shell指令碼語言包括兩部分,linux命令和控制語句。而控制語句又包括變數定義語句、賦值語句、輸入/輸出語句、分支語句、迴圈語句。
shell指令碼語言:是一種弱型別,解釋型語言。
shell指令碼語言優勢:與系統更相容,命令多,適合處理偏系統底層業務。簡單、易用、高效。
shell指令碼建立和執行echo "alias vi='vim'" >>/etc/profile
source /etc/profile
指令碼的第一行
終端使用命令cat 路徑可以編輯對應檔案,新增單行**。enter後自動儲存。或者vi別名開啟vim編輯器開始寫指令碼。
一般指令碼的第一行是用來指定用哪個shell來執行指令碼的。選擇輸入下面任意一行**指定使用哪個shell。
#!/bin/bash
#!/bin/sh
#!/usr/bin/awk
#!/bin/sed
#!/usr/bin/tcl
#!/usr/bin/expect
#!/usr/bin/perl
#!/usr/bin/env python
其中expect是互動式語言直譯器,perl是perl語言直譯器,env python是python直譯器。
如果第一行不指定shell,系統預設使用bash,為了規範,請指定shell。
如果想讓指令碼在多種shell上執行,第一行可以不指定shell。執行時先進入對應的shell,在shell中開啟指令碼,這樣也可以。
#!字元又稱幻數,核心會讀取#!後的路徑選擇shell。
為什麼一定要在第一行寫?我們都知道#後面的內容是注釋,第一行除外,所以幻數必須放在指令碼頂端第一行,若上面**放在其他行則無效,變成注釋。
附:檢視bash版本。終端輸入:
bash --version
檢測bash是否有漏洞。終端輸入:
env x='() ; echo be careful' bash -c "echo this is a test"
若顯示be careful this is a test,則需要公升級bash。公升級方法是分別輸入下面兩條命令:
yum -y update bash
rpm -qa bash
若沒有顯示be careful,不需要公升級bash。
bash script_name
使用這種方法不僅指定了shell,也避免了指令碼沒有執行許可權的問題。
方法二是終端輸入命令「路徑/指令碼名或 ./指令碼名」。路徑可以是絕對路徑或相對路徑。
但這種方法執行的指令碼必須要有執行許可權。有的人定時執行指令碼,結果指令碼沒有執行許可權導致到時間沒執行,造成重大損失。
給指令碼新增執行許可權使用命令:
chmod +x 指令碼名
方法三是「source 指令碼名」 或「. 指令碼名」,點後要有空格。
source或點方法不同於其他方法。方法
一、二(shell和路徑)執行指令碼系統會開啟乙個新的shell程序,執行完就關閉指令碼檔案,指令碼資料不會留在原shell程序上。
而使用source和點執行的指令碼不會開啟新的程序,直接在當前shell終端程序中執行,執行完後關閉檔案但不關閉當前shell程序,資料依然存在於當前shell中。
方法三與方法
一、二不同的舉例說明(#後是注釋):
[root@andy ~]# cat test.sh #cat命令檢視test檔案,裡面有條輸出語句
echo "userdir=`pwd`"
[root@andy ~]# bash test.sh #使用「shell 指令碼」的格式執行指令碼。
/home/root #執行成功,輸出變數代表的pwd路徑
[root@andy ~]# echo $userdir #此時已執行完畢,嘗試再輸出變數
#結果為空
[root@andy ~]# source test.sh #採用「source 指令碼」的格式執行指令碼
/home/root #執行成功
[root@andy ~]# echo $userdir #此時已執行完畢,嘗試再輸出變數
/home/root #再次顯示變數內容
所以,記住source和 . 點方法執行指令碼是在當前shell中進行。執行完後變數都還在shell中。
第四種方法是:「sh《指令碼名」 或「cat 指令碼名|sh」
這種方法不常用,這是個奇招,有時能少寫幾個迴圈,但不標準,不推薦。
系統執行指令碼的過程是先查詢環境變數env,然後env變數依次載入幾個環境檔案後,開始執行指令碼。
執行順序:從上到下,從左到右。若執行中遇到子指令碼呼叫語句,則先執行完子指令碼,再返回繼續執行父指令碼。
shell指令碼開發規範
第一行指定shell。
指令碼開頭加版本、版權等資訊。
盡量不使用中文。
指令碼檔案的字尾名是 .sh。
指令碼檔案儲存在固定的路徑下,如 /server/scripts。
書寫技巧:
成對的符號先打出來再在裡面新增內容。
流程控制語句先寫完格式,再新增內容。
適當使用縮排使**易讀。
常規字串用雙引號,強引用用單引號,引用命令用反引號。
Shell指令碼程式設計01 基礎知識
shell指令碼與windows dos下的批處理相似,就是將各類命令預先放入到乙個檔案中,然後執行該檔案,便可以達到與批處理類似的功能,主要是方便管理員進行設定或者管理用的。換句話來說,shell指令碼是利用shell的功能所寫的乙個程式,這個程式使用純文字檔案,將一些shell的語法與指令寫在裡...
shell指令碼程式設計入門
運維工程師 shell指令碼程式設計 shell 命令解析器 用於訪問核心 作用 命令解析 呼叫相應功能 首行 usr bin sh 指定解析器 前為未指定解析器,使用預設解析器 用處 自動化運維 用乙個步驟代替別人的十幾個步驟 使用指令碼 實現自動化 機器代替自己來做一些操作 s 件中需要 注發布...
Shell指令碼程式設計入門
最近在學習shell指令碼,兩個地方值得注意。1.shell中的運算 a 7b 8 let c a b c a b c a b c expr a b 等價於 參考 03 linux shell 變數 數學 運算 2.shell中的exec和重定向 我寫了乙個簡單的指令碼copy.sh,如下 bin ...