1. 程式人生 > >Shell編程基礎知識(一)

Shell編程基礎知識(一)

ble 啟動 繼承 ignore 負數 -s 系統 限制 出了

一.基本的運行Linux程序的3種方法:

(1) 使文件具有可執行權限,直接運行文件。eg: chmod a+x testfile.sh ./testfile.sh

(2) 直接調用命令解釋器來執行程序。eg: python testfile.sh (根據文件開頭聲明的命令解釋器進行調用)

(3) 使用source執行文件 eg: source testfile.sh .testfile.sh (t通常用於重新執行剛修改的初始化文件,使之立即生效)

Shell的命令有3種:內建命令,Shell函數和外部命令。

(a).內建命令:Shell程序本身包含的命令,這些命令集成在解釋器中。部分內建命令的存在是為了修改Shell的屬性設置(環境變量),在執行內建命令的時候,沒有進程的消失和創建;另一部分內建命令則是I/O命令,eg. echo命令。

(b).Shell函數就是一系列代碼,以Shell函數寫成,可以被其他命令引用。

(c).外部命令是獨立於shell的可執行程序。例如 find,grep。命令shell在執行外部命令時,會創建一個當前Shell的復制進程來執行。執行過程中,存在進程的創建和消失。(子進程創建初期和父進程一樣環境,但是子進程不能改變父進程的參數變量)

外部命令執行過程:

1.調用POSIX系統fork函數接口,創建一個命令行Shell進程的復制(子進程);

2.在子進程的運行環境中,查找外部命令在Linux文件系統中的位置,如果外部命令給出了完全路徑,則跳過查找這一步;

3.在子進程裏,以新程序取代Shell復制並執行(exec),此時父進程進入休眠,等待子進程執行完畢;

4.子進程執行完畢後,父進程接著從終端讀取下一條命令。

二.Linux Shell的變量

  Linux shell並不對變量區分類型。一切值都是字符串,並且和變量名一樣,值並沒有字符長度限制。更加神奇的是,bash也允許比較操作和整數操作。其中關鍵因素是:變量中的字符串值是否為數字。

單雙引號引用問題:單引號是強引用,雙引號是弱引用(強引用就是禁止變量替換,弱引用就是可以進行變量替換)

eg:

$var=123
echo $var       #此處是單引號,故結果是$var
$var
echo  "$var"     #雙引號,結果為123
123

在Shell世界中,變量可以是空值("NULL"值),就是不包含任何字符。但是在算術操作中,未初始化的變量為0。

eg:

echo "$uninit"            #未初始化變量
                                #此行為空,沒有輸出
let    "$uninit+=5"       #未初始化變量加5
echo  "$uninit"
5                          

Linux Shell中的變量根據影響範圍分為兩種:局部變量和全局變量。

局部變量:可見範圍為代碼塊或者函數中,且必須用local聲明,否在在代碼塊中,也是全局可見。

全局變量:全局可見,不需要添加修飾詞,環境變量是全局變量的一種。

eg:

#! /bin/bash
#測試全局變量和局部變量的適用範圍
num=123
func1()
{
num=321                #在代碼中聲明的變量
echo $num
}
func2()
{
local num=456         #聲明為局部變量
echo $num
}
echo $num               #顯示初始時的num變量
func1()
echo $num
func2()
echo $num

運行結果:

123
321
321
456
321

三.環境變量的相關操作

  每次當運行一個Shell時,它都會創建適合自己的環境變量的shell變量。或者更新添加一個新的環境變量的時候,這個Shell都會立即更新它自己的環境,讓所有後繼子進程都能夠繼承這個環境變量。

  一個腳本只能夠export變量到這個腳本所產生的子進程,也就說只能對這個腳本所產生的命令和進程起作用。如果腳本是從命令行中被調用的,那麽這個腳本export的變量是不能夠影響命令行環境的,即子進程是不能夠export變量來影響產生自己的父進程的環境的。但是source命令執行腳本時,因為沒有子進程的產生,故可以立即同步執行環境。

export命令用於設置或者顯示當前Shell進程的環境變量,作用時間僅僅是當前Shell消亡前。

語法:export [-fnp] [變量名稱]=[變量值]

-f:代表[變量名稱]中為函數名稱。

-n:刪除指定的變量。(變量實際上並未刪除,只是不輸出到後續指令的執行環境中)

-p:列出所有的Shell賦予程序的環境變量。

如若想永久設置環境變量,在啟動文件(/etc/profile,/etc/bashrc)相對應的文件中進行設置。

eg:

#設置環境變量PATH
export PATH=/bin:/usr/bin:/usr/local/bin

env命令在未提供command時,顯示所有的變量名稱和值;提供command時,根據參數重建環境變量後,在新的環境中運行command。

語法:env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]

-i:不帶環境變量啟動(--ignore-environment)

-u:從環境變量中刪除一個變量(--unset=NAME)

unset命令從當前Shell刪除函數或者變量。

語法:unset [-v] variable..

unset-f function..

-v:默認選項,刪除指定的變量。

-f:刪除函數操作,參數為函數名稱。

Env函數和set函數不同。Env函數顯示的環境變量,而set函數顯示的是所有本地變量,包括用戶定義的變量。

一些常用的環境變量有:

HOME:用戶的專屬目錄,在Linux中用~擴展。

PATH:外部命令的搜索路徑。

HISTSIZE:保存歷史命令記錄的太條數。

LOGNAME:當前用戶的登錄名。

HOSTNAME:主機的名稱。

SHELL:當前用戶使用shell的類型。

MAIL:當前用戶的郵件存放目錄。

LANG/LANGUAGE:語言相關的環境變量,使用多種語言的用戶可以修改此變量。

PS1/PS2:PS1是基本提示符,對於root用戶是#,對於普通用戶是$。PS2是負數提示符默認是>。

一般來說,PATH變量中存儲路徑以:分開,路徑中至少包含/bin和/usr/bin這兩個目錄。當Shell接收到一個命令非內部命令時,也沒有給出完整路徑時,Shell則在Path變量中從左到右依次搜索目錄,如果有一個命令在兩個不同目錄中都有,則在前面一個會被執行。

Shell編程基礎知識(一)