shell其實是相對於系統核心而言的,其是核心外層的一層「殼」,作用在於提供乙個使用者圖形介面讓使用者可以通過一些命令和作業系統進行互動,從而完成一些動作。linux shell自然就是linux系統的那一層「殼」,同樣的還有windows shell。因為在shell上和os進行互動操作,需要輸入特定的命令,shell語言就是這些命令的集合以及一些額外的語法抽象層。筆者作為乙個linux shell的小白,本文將記錄一下關於linux shell的基於概念和語法,作為一次簡單的linux shell入門。
本文中的shell將特指可以在圖形介面內訪問核心服務的一種命令集合,所以linux系統下具有多種不同的shell,即多種不同的命令集可以和linux系統的核心服務進行互動,常見的有以下幾種:
本文將只針對bourne again shell,也就是bash。
目錄
資料型別
賦值和變數引用
獲取變數長度
指令碼的執行
指令碼引數傳遞以及引數獲取 變數
表示式流程控制
shell函式
io重定向
匯入外部檔案 參考
shell語言裡面的基本資料型別有整數、布林變數(true和fasle),字串和陣列,下面主要講一下字串和陣列。
字串:可以使用單引號,或者雙引號,甚至不適用引號。區別在於,當使用單引號時,該字串中不可出現變數和轉義,即使出現也會被認為字面意思,即不會進行特殊處理;但是對於雙引號字串,可以通過$的形式來引用變數var,同時也可以出現換行\n等轉義字元。無論是單引還是雙引,都可以通過連續多個字串進行拼接,字串之間無需任何連線標誌符。
陣列:shell中陣列的定義和python中的元組類似,都是使用圓括號,但是shell中圓括號的值使用空格符分隔,而python中則使用逗號分隔。shell中的元組還可以直接使用變數下標的方式定義,並且下標可以任意指定,如下所示。
#通過圓括號定義
arrayname=(1 2 3)
#直接通過變數和下標定義
arrname[0]=1
arrname[2]=3
shell中使用等號=賦值,但是要注意的是,等號兩側的變數和值之間不能有空格。對此,可以這樣去記憶,對於shell中的語句,=或者其他符合兩側不能有空格,但是對於表示式,=或者其他運算子之間需要有空格隔開。
如果定義了乙個變數,在後面如果要引用改變量,則需要通過$的形式來對變數var進行引用。
var=2
echo "the value of var is $"
#output: the value of var is 2
當我們想要獲取乙個變數的長度時,可以使用$。要注意的是,對於#,其也是單行注釋符,並且在一行的最開始位置使用以引出注釋。
var="abc"
echo "the length of var is $"
#output: the length of var is 3
對於bash指令碼的執行有兩種主要的方式,第一種是直接在linux命令使用bash命令,即bash script.sh,這樣可以直接執行指令碼;第二種方式可以不顯示使用bash命令,但是需要在指令碼內部的首行告訴系統使用哪個直譯器來執行該指令碼,具體方式是在指令碼首行輸入#!/bin/bash,然後再在命令列通過chmod +x script.sh將指令碼賦予可執行許可權,然後輸入該指令碼回車即可,這樣linux系統就可以通過第一行知道使用bash直譯器來執行該指令碼了,這有點類似於python2在首行宣告指定指令碼編碼。第二種方式要注意的是,在輸入指令碼回車時,指令碼使用的路徑需要完整,系統並不會預設現在當前目錄下尋找該指令碼,而是會在環境變數中去尋找,如果沒有輸入完整路徑的話。
var="abc"
echo "the length of var is $"
#假設乙個shell指令碼只有上述語句,名為script.sh,那麼在linux命令中要執行該指令碼可使用以下兩種方式
#方式一:
$ bash srcipt.sh
$ the length of var is 3
#方式二,注意當前工作目錄是指令碼所在目錄,所以使用.表示當前目錄以完整指令碼目錄
$ chmod +x script.sh
$ ./script.sh
$ the length of var is 3
在執行shell指令碼時,可以直接在指令碼後面以空格分隔引數,以將引數傳給指令碼。在指令碼內部,可以通過$n的方式獲取命令列中傳給指令碼的第n個引數,其中第0個引數,即$0指的指令碼名。要注意的是,當n>=10時,需要用$的方式獲取引數。同時,還可以通過$#來獲取除了指令碼自身外的引數的個數;$*來一次性獲取除指令碼外的所有引數,並以單個字串的形式返回;$@也是獲取所有引數,但是是以多個字串的形式返回,其中乙個引數對應乙個字串。
shell語言的變數可以分為指令碼自定義變數和預定義變數,自定義變數由字母、數字和下劃線組成,並且不能以數字開頭。可以通過readonly關鍵字將變數宣告為唯讀,這樣後面便無法更改該變數;通過unset var可以刪除var變數,將其設為空值。
shell中,可以將表示式分為一般表示式和條件測試表示式。所謂表示式是和語句相對應的,表示式是有結果返回的,而語句只是乙個動作,比如賦值語句,沒有結果返回。對於一般表示式,比如使用`expr expression`,即通過expr來宣告;而條件測試表示式通過方括號宣告,方括號中的表示式返回bool變數,往往用在if條件測試中,同test。shell中表示式相比於語句的乙個特點就是表示式的操作符和變數之間都有空格分隔,而語句則沒有分隔。
shell中的流動控制有if條件語句,for迴圈,while迴圈,until語句,case語句,其格式分別如下所示。各個迴圈都支援break和continue。
#if語句
if condition;
then
action
fi#if else語句
if condition1
then
action1
elif condition2
then
action1
else
action3
fi#for迴圈
for v in v1 v2 v2 ...
do actions
done
#while迴圈
while condition
do actions
done
#while死迴圈
while true
do actions
done
#或者while :
do actions
done
#untile迴圈
until condition
do actions
done
shell語言中,可以通過如下方式定義函式。其中的內容表示是可選的,寫不寫都不影響函式的構造。
[function] func[()]
#內容表示可選,所以最簡單的乙個函式形式為
func
對於函式,要注意的是對於函式值的返回以及對函式引數的捕獲。首先對於函式的返回,通過緊接著在函式呼叫語句的下一條語句寫入$?來捕獲函式返回值,如果函式沒有return,則返回最後一條語句的結果**獲,並且還將返回乙個函式是否正常結束的標誌,正常結束返回0,丟擲錯誤返回1,這個0或1標誌不會**獲;對於函式引數,和指令碼傳參一致,只是函式引數是在呼叫函式的時候緊接著傳入,而指令碼傳參則是在命令列緊接著傳入。
expression > file:將expression的結果寫入file,並覆蓋file原有的內容;
expression >> file:將expression的結果寫入file,但是在file原有的內容的基礎上追加;
var < file:從file中獲取內容。
shell語言可以模擬python,匯入其他的外部指令碼模組,並且直接在指令碼中引用被匯入的指令碼檔案中的變數。具體的方式有兩種,第一種是通過. script.sh的形式,注意點號;第二種是通過source script.sh。如下所示。
#假設script1.sh如下
var1="test"
#script2.sh內容如下
. ./script1.sh
#或者#source ./script1.sh
echo "the value of script1 is $"
#執行script2.sh指令碼,輸入的內容為:
$ the value of script1 is test
shell 教程 | 菜鳥教程: linux shell程式設計之 if語句
一 語句格式 一行中的寫法 if test commands then consequent commands fi 多行的寫法 if 條件 then command else command fi 基本語法記住亮點 1 按照漢語的方式記憶 如果 if 那麼 then 就 否則 else 就 2 記...
Linux shell程式設計之awk sed用法詳解
awk的用法 1.awk的使用 呼叫方式 1.命令列方式 2.將所有awk命令插入乙個檔案,並使awk程式可執行,然後使awk命令直譯器作為指令碼的首行,以便通過鍵入指令碼名稱來呼叫它。3.將所有的awk命令插入乙個單獨檔案,然後呼叫。選項說明 f 域符號 預設為空格 f 指明awk指令碼 2.模式...
LINUX SHELL程式設計之遠端拷貝
使用expect,進行遠端拷貝 1.首先確認你的系統安裝有expect which expect 如果顯示如下,說明已經安裝完expect,如果沒有執行2 usr bin expect 2.yum install expect 3.遠端拷貝 usr bin expect f set password...