5分鐘快速搞懂Shell基礎知識

1.1 簡介

Shell是一個C語言編寫的腳本語言,它是用戶與Linux的橋樑,用戶輸入命令交給Shell處理,Shell將相應的操作傳遞給內核(Kernel),內核把處理的結果輸出給用戶。

下面是處理流程示意圖:

5分鐘快速搞懂Shell基礎知識

Shell既然是工作在Linux內核之上,那我們也有必要知道下Linux相關知識。

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是一種廣泛使用的商業操作系統的名稱。

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條款下發布。

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子進程。

5分鐘快速搞懂Shell基礎知識

5分鐘快速搞懂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,去除上面定義的變量測試下

5分鐘快速搞懂Shell基礎知識

所以在當前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忽略解釋。


分享到:


相關文章: