工做中,咱們玩過服務器的人都知道,在linux系統中程序的啓動通常都是經過運行一個Shell腳原本實現的;Shell腳本不光在啓動程序方面有所做爲,在大數據、自動化腳本等方面都是咱們的必備知識之一。Shell腳本究竟是一種什麼樣的語言?能幹啥呢?接下來博主將爲你們詳細講述,並帶領你們深刻到linux編程中一探究竟。linux
1、Shell概念shell
Shell是用戶與內核進行交互操做的一種接口,目前最流行的Shell稱爲bash Shell;Shell也是一門編程語言<解釋型的編程語言>,即Shell腳本;一個系統能夠存在多個Shell,能夠經過cat /etc/shells命令查看系統中安裝的shell,不一樣的shell可能支持的命令語法是不相同的。express
2、shell入門詳解編程
(1)shell腳本的執行:bash
第一種:輸入腳本的絕對路徑或相對路徑(首先要賦予+x權限)執行 服務器
/root/helloWorld.sh編程語言
. /helloWorld.sh編輯器
第二種:bash或sh +腳本執行函數
sh /root/helloWorld.sh 工具
sh helloWorld.sh
第三種:在腳本的路徑前再加". ",表示在當前的shell進程中執行(pstree能夠查看進程之間的派生關係)
. /root/helloWorld.sh . ./helloWorld.sh
區別:第一種和第二種會新開一個bash,不一樣bash中的變量沒法共享。
擴展知識:pstree命令以樹狀圖的方式展示進程之間的派生關係,顯示效果比較直觀。
語法:pstree (選項)
選項:
-a:顯示每一個程序的完整指令,包含路徑,參數或是常駐服務的標示;
-c:不使用精簡標示法;
-G:使用VT100終端機的列繪圖字符;
-h:列出樹狀圖時,特別標明如今執行的程序;
-H<程序識別碼>:此參數的效果和指定"-h"參數相似,但特別標明指定的程序;
-l:採用長列格式顯示樹狀圖;
-n:用程序識別碼排序。預設是以程序名稱來排序;
-p:顯示程序識別碼;
-u:顯示用戶名稱;
-U:使用UTF-8列繪圖字符;
-V:顯示版本信息。
實例:顯示當前全部進程的進程號和進程id
pstree -p
顯示全部進程的全部詳細信息,遇到相同的進程名能夠壓縮顯示。
pstree -a
效果圖
(2)Shell中的變量
Linux Shell中的變量分爲「系統變量」和「用戶自定義變量」,能夠經過set命令查看全部系統變量
系統變量:$HOME、$PWD、$SHELL、$USER等等
顯示當前shell中全部變量 : set
(3)定義變量
STR="hello world"
A=9
unset A 撤銷變量
A readonly B=2 聲明靜態的變量 B=2 ,不能 unset
export 變量名 可把變量提高爲全局環境變量,可供其餘shell程序使用
(4)將命令的返回值賦給變量
A=`ls -la` 反引號,運行裏面的命令,並把結果返回給變量A
A=$(ls -la) 等價於反引號
(5)Shell中的特殊變量
$? 表示上一個命令退出的狀態
$$ 表示當前進程編號
$0 表示當前腳本名稱
$n 表示n位置的輸入參數(n表明數字,n>=1)
$# 表示參數的個數,經常使用於循環
$*和$@ 都表示參數列表
(6)$*與$@區別
$* 和 $@ 都表示傳遞給函數或腳本的全部參數,不被雙引號" "包含時,都以$1 $2 … $n 的形式輸出全部參數
當它們被雙引號" "包含時,"$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"的形式輸出全部參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出全部參數
(7)運算符
格式 :expr m + n 或$((m+n)) 注意expr運算符間要有空格
例如計算(2 +3 )×4 的值
分步計算
S=`expr 2 + 3`
expr $S \* 4
一步完成計算
expr `expr 2 + 3 ` \* 4
echo `expr \`expr 2 + 3\` \* 4`
或 $(((2+3)*4))
(8)for循環
第一種: for N in 1 2 3
do
echo $N
done
或 :for N in 1 2 3;
do
echo $N;
done
或 :for N in {1..3};
do
echo $N;
done
第二種
for ((i = 0; i <= 5; i++))
do
echo "welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times";
done
(9)while循環
第一種
while expression
do command
…
done
第二種
i=1
while ((i<=3))
do
echo $i
let i++
done
(10)case語句
格式 case $1 in
start)
echo "starting"
;;
stop)
echo "stoping"
;;
*)
echo "Usage: {start|stop} 「
esac
(11)read命令
read -p(提示語句)-n(字符個數) -t(等待時間)
read -p "please input your name: " NAME
使用示例:
(12)if判斷
語法 if condition
then statements
[elif condition
then statements. ..]
[else
statements ]
fi
if例子
#!/bin/bash
read -p "please input your name:" NAME
#printf '%s\n' $NAME
if [ $NAME = root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME = itcast ]
then
echo "hello ${NAME}, welcome !"
else
echo "SB, get out here !"
fi
(13)判斷語句
[ condition ] (注意condition先後要有空格)
#非空返回true,可以使用$?驗證(0爲true,>1爲false)
[ itcast ]
#空返回false
[ ]
[ condition ] && echo OK || echo notok 條件知足,執行後面的語句
(14)經常使用判斷條件
= 字符串比較
-lt 小於
-le 小於等於
-eq 等於
-gt 大於
-ge 大於等於
-ne 不等於
-r 有讀的權限
-w 有寫的權限
-x 有執行的權限
-f 文件存在而且是一個常規的文件
-s 文件存在且不爲空
-d 文件存在並是一個目錄
-b文件存在而且是一個塊設備
-L 文件存在而且是一個連接
(15)Shell自定義函數
注意
1.必須在調用函數地方以前,先聲明函數,shell腳本是逐行運行。不會像其它語言同樣先預編譯
2.函數返回值,只能經過$? 系統變量得到,能夠顯示加:return 返回,若是不加,將以最後一條命令運行結果,做爲返回值。 return後跟數值n(0-255)
腳本調試
sh -vx helloWorld.sh
或者在腳本中增長set -x
(16)sed命令
sed全稱是:Stream EDitor即流編輯器,是一個很好的文本處理工具,自己是一個管道命令,處理時,把當前處理的行存儲在臨時緩衝區中,接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行。它是以行爲單位進行處理,能夠將數據行進行替換、刪除、新增、選取等特定工做。
sed選項
-n :使用安靜(silent)模式。在通常 sed 的用法中,全部來自 STDIN 的數據通常都會被列出到終端上。但若是加 上 n 參數後,則只有通過sed 特殊處理的那一行(或者動做)纔會被列出來。
-e :直接在命令列模式上進行 sed 的動做編輯;
-i :直接修改讀取的文件內容,而不是輸出到終端。
sed function
a :新增, a 的後面能夠接字串,而這些字串會在新的一行出現(目前的下一行)
d :刪除,由於是刪除啊,因此 d 後面一般不接任何內容
i :插入, i 的後面能夠接字串,而這些字串會在新的一行出現(目前的上一行)
p :列印,亦即將某個選擇的數據印出。一般 p 會與參數 sed -n 一塊兒運行
s :取代,能夠直接進行取代的工做!一般這個 s 的動做能夠搭配正規表示法!例如 1,20s/old/new/g
(17)awk命令
AWK是一種優良的文本處理工具。其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母,AWK 提供了極其強大的功能:能夠進行樣式裝入、流控制、數學運算符、進程控制語句甚至於內置的變量和函數。它具有了一個完整的語言所應具備的幾乎全部精美特性。實際上 AWK 的確擁有本身的語言:AWK 程序設計語言, 三位建立者已將它正式定義爲「樣式掃描和處理語言」。它容許您建立簡短的程序,這些程序讀取輸入文件、爲數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其餘的功能。
awk命令格式:awk 'pattern1 {action1} pattern2 {action2} ...' filename
最後:以上是linux中shell編程入門的所有內容;若是你對這塊知識感興趣,請持續關注博主文章,同時歡迎同博主交流。