Shell編程

Shell編程

【學習筆記】程序員

認識Shell腳本

Shell 腳本(Shell Script)與Windows/DOS 下的批處理類似,也就是將各種命令預先放入其中,方便一次性執行的一個程序文件,主要用以方便管理員進行設置或者管理。可是Shell 腳本比Windows 下的批處理更強大,比用其餘編程程序編輯的程序效率更高,畢竟它使用了Linux/UNIX 下的命令。shell

Shell腳本的基本語法

開頭

可使用任何一種編輯器來編輯數據庫

gedit、kedit、emacs、vi等等編程

#!/bin/bash	#表示系統用bash來執行程序
……

編輯該文件後不能當即執行它,需給文件設置可執行程序權限bash

chmod [權限] [文件名]		#添加可執行程序權限(如權限777)

而後可使用./[filename]來運行程序編輯器

執行

有三種方法函數

方法一:

./test.sh

方法二:

bash test.sh

方法三:

export PATH=/home/pyma/Shell:$PATH	#添加到環境變量中
./test.sh		#執行

註釋

在進行Shell 編程時,以#開頭的句子表示註釋,直到這一行的結束學習

變量

用戶自定義變量

(1)首個字母必須位字母(az,AZ)或者下劃線(_)測試

(2)中間不能有空格,可使用下劃線(_)this

(3)不能使用其餘標點符號

變量賦值
變量名=值			#DATA=2

這裏要注意:變量賦值時,等號兩邊都沒有空格。在Shell 編程中一般使用全大寫變量,方便識別。

從右向左賦值

#!/bin/bash
Y=y
X=$Y
echo X=$X
變量調用

要取用一個變量的值,只需在變量名前面加一個$

#!/bin/bash
# 對變量賦值:
VAR="hello world" #等號兩邊均不能有空格存在
# 打印變量VAR 的值:
echo "VAR is:" $VAR
用花括號區分變量和字母

可使用花括號來告訴Shell 咱們要打印的是num 變量

num=2
echo "this is the ${num}nd"
unset 命令可刪除變量的賦值
Z=hello
echo $Z
#輸出會打印hello
#在命令行裏邊輸入
unset Z
#再打印Z將會爲空

位置參數及命令行參數

位置參數的值能夠用$N 獲得,N 是一個數字,若是爲1,即$1

$0 與鍵入的命令行同樣,包含腳本文件名
$1,$2,…,$9 分別包含第一個到第九個命令行參數

預約義變量

預約義變量是在Shell 一開始時就定義了的變量,全部預約義變量都是由$符和另外一個符號組成的。

·$#:包含命令行參數的個數。
·$@:包含全部命令行參數:「$1,$2,…,$9」。
·$?:包含前一個命令的退出狀態,正常退出返回0,反之爲非0 值。
·$*:包含全部命令行參數:「$1,$2,…,$9」。
·$$:包含正在執行進程的ID 號。

環境變量

環境變量用於全部的用戶進程。在Linux 中,登陸進程稱爲父進程,Shell 中執行的用戶程序均稱爲子進程。環境變量能夠在命令行中設置,但用戶註銷時這些值將丟失,所以最好在$HOME/目錄下的.profile 中定義,傳統上環境變量均爲大寫。

常見環境變量
·HOME: /etc/passwd 文件中列出的用戶主目錄。
·IFS:內部字段分隔符(Internal Field Separator), 默認爲空格,tab 及換行符。
·PATH :shell 搜索路徑。
·PS1,PS2:默認提示符($)及換行提示符(>)。
·TERM:終端類型,經常使用的有vt100、ansi、vt200、xterm 等。
·HISTSIZE:保存歷史命令記錄的條數。
·LOGNAME:當前用戶登陸名。
·HOSTNAME:主機名稱,若應用程序要用到主機名的話,通常是從這個環境變量中取得。
·SHELL:當前用戶用的是哪一種Shell。
·LANG/LANGUGE:和語言相關的環境變量,使用多種語言的用戶能夠修改此環境變量。
·MAIL:當前用戶的郵件存放目錄。
·TMOUT :用來設置腳本過時的時間,好比TMOUT=3,表示該腳本3 秒後過時。
·UID : 已登陸用戶的ID。
·USER :顯示當前用戶名字。
·SECONDS:記錄腳本從開始到結束耗費的時間。
設置環境變量
·echo:顯示指定環境變量。
·export:設置新的環境變量。
·env:顯示全部環境變量。
·set:顯示全部本地定義的Shell 變量。
·unset:清除環境變量。
export PATH=[代碼所在路徑]:$PATH

注意:必定要加$PATH(表示應用PATH變量之前的內容),不然,以前的環境變量會被覆蓋掉

Shell程序和語句

說明性語句

說明性語句即註釋行

功能性語句

一、鍵盤讀入變量值

存放目錄的變量爲DIRECTORY,其讀入語句爲read DIRECTORY

#!/bin/bash
echo 「please input name of directory」
read DIRECTORY
ls $DIRECTORY -a

二、算數運算命令

算術運算命令expr 主要用於進行簡單的整數運算,包括加(+)、減(-)、乘(*)、整除(/)和求模(%)等操做。

#!/bin/bash
echo "please input tow numbers:"
read var1
read var2
add=`expr $var1 + $var2`
sub=`expr $var1 - $var2`
mul=`expr $var1 \* $var2`
div=`expr $var1 / $var2`
mod=`expr $var1 % $var2`
echo '$var1+$var2'=$add
echo '$var1-$var2'=$sub
echo '$var1*$var2'=$mul
echo '$var1/$var2'=$div
echo '$var1%$var2'=$mod

【注意】表達式z=expr $x + $y中的符號「」爲鍵盤左上角的「」鍵,即反引號

三、test命令

(1)字符串測試

s1 = s2 測試兩個字符串的內容是否徹底同樣
s1 != s2 測試兩個字符串的內容是否有差別
-z s1 測試s1 字符串的長度是否爲0
-n s1 測試s1 字符串的長度是否不爲0

(2)整數測試

a -eq b 測試a 與b 是否相等
a -ne b 測試a 與b 是否不相等
a -gt b 測試a 是否大於b

a -ge b 測試a 是否大於等於b
a -lt b 測試a 是否小於b
a -le b 測試a 是否小於等於b

(3)文件測試

-d name 測試name 是否爲一個目錄
-f name 測試name 是否爲普通文件
-L name 測試name 是否爲符號連接
-r name 測試name 文件是否存在且爲可讀
-w name 測試name 文件是否存在且爲可寫
-x name 測試name 文件是否存在且爲可執行
-s name 測試name 文件是否存在且其長度不爲0
f1 -nt f2 測試文件f1 是否比文件f2 更新
f1 -ot f2 測試文件f1 是否比文件f2 更舊

四、tput命令

tput 命令主要用於設置終端工做模式,或讀出終端控制字符。tput 命令與終端控制代碼數據庫terminfo 相連, 根據Shell 環境變量TERM 的值, 讀出這種終端的指定功能控制代碼

結構性語句

一、條件測試語句

if 表達式
	then 命令表1
	else 命令表2
fi
#若是表達式爲真, 則執行命令表1 中的命令, 並退出if 語句;不然執行命令表2 中的語句, 再退出if 語句

二、多路分支語句

多路分支語句case 用於多重條件測試, 語法結構清晰天然

case 字符串變量 in #(case 語句只能檢測字符串變量)
	模式1) #(各模式中可用文件名元字符,以右括號結束)
		命令表1
		;; #(命令表以單獨的雙分號行結束,退出case 語句)
	模式2)
		命令表2
		;;
	……
	模式n) #(模式n 常寫爲字符* 表示全部其餘模式)
		命令表n
		;; #(最後一個雙分號行能夠省略)
esac

三、循環語句

循環體由語句括號do 和done 來限定

(1)for循環

for 變量名 in 單詞表
do
	命令表
done

(2)while循環

while 命令或表達式
do
	命令表
done

四、循環控制語句

Shell 腳本中,循環控制語句有break 和continue。break n 表示跳出n 層;continue 語句表示立刻轉到最近一層循環語句的下一輪循環上,continue n 則轉到最近n 層循環語句的下一輪循環上。

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
	if [ $i -eq 5 ]
	then
		continue
	fi
	echo "$i"
done

Shell函數

在Shell 程序中, 經常把完成固定功能、且屢次使用的一組命令(語句)封裝在一個函數裏,每當要使用該功能時只需調用該函數便可。

函數在調用前必須先定義,即在順序上函數說明必須放在調用程序的前面。
調。

調用程序可傳遞參數給函數, 函數可用return 語句把運行結果返回給調用程序。

函數只在當前Shell 中起做用, 不能輸出到子Shell 中。

函數定義格式

方式一:

function_name ( )
{
	command1
	……
	commandn
}

方式二:

function function_name ( )
{
	command1
	……
	commandn
}

函數調用格式

方式一:

value_name=`function_name [arg1 arg2 …]`	#函數的全部標準輸出都傳遞給了主程序的變量。

方式二:

function_name [arg1 arg2 …]
echo $?	# $?表示獲取函數的返回的狀態。

Shell腳本調用

在Shell 腳本的執行過程當中,支持調用另外一個Shell 腳本,調用的格式爲

腳本名

注意:
(1)在Linux 編輯中命令區分大小寫字符;
(2)在Shell 語句中加入必要的註釋,以便之後查詢和維護,註釋以#開頭;
(3)對Shell 變量進行數字運算,使用乘法符號「*」時,要用轉義字符「\」進行轉義;
(4)因爲Shell 對命令中多餘的空格不進行任何處理,所以程序員能夠利用這一特性調整程序縮進,達到加強程序可讀性效果;
(5)在對函數命名時最好能使用有含義且容易理解的名字,即便函數名可以比較準確地表達
函數所完成的任務,同時建議對於較大的程序要創建函數名和變量命名對照表。

選自華清遠見《嵌入式操做系統》

相關文章
相關標籤/搜索