1.1 簡介python
Shell是一個C語言編寫的腳本語言,它是用戶與Linux的橋樑,用戶輸入命令交給Shell處理,Shell將相應的操做傳遞給內核(Kernel),內核把處理的結果輸出給用戶。shell
下面是處理流程示意圖:編程
Shell既然是工做在Linux內核之上,那咱們也有必要知道下Linux相關知識。bash
Linux是一套免費試用和自由傳播的類Unix操做系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操做系統。多線程
1983年9月27日,Richard Stallman(理查德-馬修-斯托曼)發起GNU計劃,它的目標是建立一套徹底自由的操做系統。爲保證GNU軟件能夠自由的使用、複製、修改和發佈,全部的GNU軟件都有一份在禁止其餘人添加任何限制的狀況下受權全部權利給任何人的協議條款,GNU通用公共許可證(GNU General Plubic License,GPL),說白了就是不能作商業用途。運維
GNU是"GNU is Not Unix"的遞歸縮寫。UNIX是一種普遍使用的商業操做系統的名稱。ssh
1085年,Richard Stallman又創立了自由軟件基金會(Free Software Foundation,FSF)來爲GNU計劃提供技術、法律以及財政支持。編程語言
1990年,GNU計劃開發主要項目有Emacs(文本編輯器)、GCC(GUN Compiler Collection,GNU編譯器集合)、Bash等,GCC是一套GNU開發的編程語言編譯器。還有開發一些UNIX系統的程序庫和工具。編輯器
1991年,Linuxs Torvalds(林納斯- 託瓦茲)開發出了與UNIX兼容的Linux操做系統內核並在GPL條款下發布。ide
1992年,Linux與其餘GUN軟件結合,徹底自由的GUN/Linux操做系統正式誕生,簡稱Linux。
1995年1月,Bob Young創辦ACC公司,以GNU/Linux爲核心,開發出了RedHat Linux商業版。
Linux基本思想有兩點:第一,一切都是文件;第二,每一個軟件都有肯定的用途。與Unix思想十分相近。
1.2 Shell基本分兩大類
1.2.1 圖形界面Shell(GUI Shell)
GUI爲Unix或者類Unix操做系統構造一個功能完善、操做簡單以及界面友好的桌面環境。
主流桌面環境有KDE,Gnome等。
1.2.2 命令行界面Shell(CLI Shell)
CLI是在用戶提示符下鍵入可執行指令的界面,用戶經過鍵盤輸入指令,完成一系列操做。
在Linux系統上主流的CLI實現是Bash,是許多Linux發行版默認的Shell。還有許多Unix上用的Shell,例如tcsh、csh、ash、bsh、ksh等等。
1.3 第一個Shell腳本
本教程主要講解在大多Linux發行版下默認Bash Shell。Linux系統是RedHat下的CentOS操做系統,徹底免費。與其商業版RHEL(Red Hat Enterprise Linux)出自一樣的源代碼,不一樣的是CentOS並不包含封閉源代碼軟件和售後支持。
用vi打開test.sh,編寫:
# vi test.sh #!/bin/bash echo "Hello world!"
第一行設置運行環境,第二行打印Hello world!
寫好後,開始執行,執行Shell腳本有三種方法:
方法1:直接用bash解釋器執行 # bash test.sh Hello world! 方法2:添加可執行權限 # ll test.sh -rw-r--r--. 1 root root 32 Aug 18 01:07 test.sh # chmod +x test.sh # ./test.sh -bash: ./test.sh: Permission denied # chmod +x test.sh # ./test.sh # ./在當前目錄 Hello world! 方法3:source命令執行,以當前默認Shell執行 # source test.sh Hello world!
1.4 Shell變量
1.4.1 系統變量
在命令行提示符直接執行env、set查看系統或環境變量。env顯示用戶環境變量,set顯示Shell預先定義好的變量以及用戶變量。能夠經過export導出成用戶變量。
一些寫Shell腳本時經常使用的系統變量:
$SHELL | 默認Shell |
$HOME | 當前用戶家目錄 |
$IFS | 默認內部域分隔符 |
$LANG | 默認語言 |
$PATH | 默承認執行程序路徑 |
$PWD | 當前目錄 |
$UID | 用戶ID |
$USER | 當前用戶 |
$HISTSIZE | 歷史命令大小,可經過HISTTIMEFORMAT變量設置命令執行時間 |
1.4.2 普通變量與臨時環境變量
普通變量定義:VAR=value
臨時環境變量定義:export VAR=value
變量引用:$VAR
下面看下他們之間區別:
Shell進程的環境變量做用域是Shell進程,當export導入到系統變量時,則做用域是Shell進程及其Shell子進程。
ps axjf輸出的第一列是PPID(父進程ID),第二列是PID(子進程ID)
當SSH鏈接Shell時,當前終端PPID(-bash)是sshd守護程序的PID(root@pts/0),所以在當前終端下的全部進程的PPID都是-bash的PID,好比執行命令、運行腳本。
因此當在-bash下設置的變量,只在-bash進程下有效,而-bash下的子進程bash是無效的,當export後纔有效。
進一步說明:再從新鏈接SSH,去除上面定義的變量測試下
因此在當前shell定義的變量必定要export,不然在寫腳本時,會引用不到。
還須要注意的是退出終端後,全部用戶定義的變量都會清除。
在/etc/profile下定義的變量就是這個原理,後面有章節會講解Linux經常使用變量文件。
1.4.3 位置變量
位置變量指的是函數或腳本後跟的第n個參數。
$1-$n,須要注意的是從第10個開始要用花括號調用,例如${10}
shift可對位置變量控制,例如:
#!/bin/bash echo "1: $1" shift echo "2: $2" shift echo "3: $3" # bash test.sh a b c 1: a 2: c 3:
每執行一次shift命令,位置變量個數就會減一,而變量值則提早一位。shift n,可設置向前移動n位。
1.4.4 特殊變量
$0 | 腳本自身名字 |
$? | 返回上一條命令是否執行成功,0爲執行成功,非0則爲執行失敗 |
$# | 位置參數總數 |
$* | 全部的位置參數被看作一個字符串 |
$@ | 每一個位置參數被看作獨立的字符串 |
$$ | 當前進程PID |
1.5 變量引用
1.5.1 自定義變量與引用
# VAR=123 # echo $VAR 123
Shell中全部變量引用使用$符,後跟變量名。
有時個別特殊字符會影響正常引用,那麼須要使用${VAR},例如:
# VAR=123 # echo $VAR 123 # echo $VAR_ # Shell容許VAR_爲變量名,因此此引用認爲這是一個有效的變量名,故此返回空 # echo ${VAR} 123
還有時候變量名與其餘字符串緊礙着,也會誤認爲是整個變量:
# echo $VAR456 # echo ${VAR}456 123456
1.5.2 將命令結果做爲變量值
# VAR=`echo 123` # echo $VAR 123 # VAR=$(echo 123) # echo $VAR 123
這裏的反撇號等效於$(),都是用於執行Shell命令。
博客地址:http://lizhenliang.blog.51cto.com
QQ羣:323779636(Shell/Python運維開發羣)
1.6 雙引號和單引號
在變量賦值時,若是值有空格,Shell會把空格後面的字符串解釋爲命令:
# VAR=1 2 3 -bash: 2: command not found # VAR="1 2 3" # echo $VAR 1 2 3 # VAR='1 2 3' # echo $VAR 1 2 3
看不出什麼區別,再舉個說明:
# N=3 # VAR="1 2 $N" # echo $VAR 1 2 3 # VAR='1 2 $N' # echo $VAR 1 2 $N
單引號是告訴Shell忽略特殊字符,而雙引號則解釋特殊符號原有的意義,好比$、!。
1.7 註釋
Shell註釋也很簡單,只要在每行前面加個#號,即表示Shell忽略解釋。