Shell編程
【學習筆記】
認識Shell腳本
Shell 腳本(Shell Script)與Windows/DOS 下的批處理相似,也就是將各類命令預先放入其中,方便一次性執行的一個程式檔案,主要用以方便管理員進行設定或者管理,但是Shell 腳本比Windows 下的批處理更強大,比用其他編程程式編輯的程式效率更高,畢竟它使用了Linux/UNIX 下的命令,
Shell腳本的基本語法
開頭
可以使用任何一種編輯器來編輯
gedit、kedit、emacs、vi等等
#!/bin/bash #表示系統用bash來執行程式
……
編輯該檔案后不能立即執行它,需給檔案設定可執行程式權限
chmod [權限] [檔案名] #添加可執行程式權限(如權限777)
然后可以使用./[filename]來運行程式
執行
有三種方法
方法一:
./test.sh
方法二:
bash test.sh
方法三:
export PATH=/home/pyma/Shell:$PATH #添加到環境變數中
./test.sh #執行
注釋
在進行Shell 編程時,以#開頭的句子表示注釋,直到這一行的結束
變數
用戶自定義變數
(1)首個字母必須位字母(az,AZ)或者下劃線(_)
(2)中間不能有空格,可以使用下劃線(_)
(3)不能使用其他標點符號
變數賦值
變數名=值 #DATA=https://www.cnblogs.com/AkiyamaYusuke/p/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程式和陳述句
說明性陳述句
說明性陳述句即注釋行
功能性陳述句
1、鍵盤讀入變數值
存放目錄的變數為DIRECTORY,其讀入陳述句為read DIRECTORY
#!/bin/bash
echo “please input name of directory”
read DIRECTORY
ls $DIRECTORY -a
2、算數運算命令
算術運算命令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中的符號“”為鍵盤左上角的“”鍵,即反引號
3、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 更舊
4、tput命令
tput 命令主要用于設定終端作業模式,或讀出終端控制字符,tput 命令與終端控制代碼資料庫terminfo 相連, 根據Shell 環境變數TERM 的值, 讀出這種終端的指定功能控制代碼
結構性陳述句
1、條件測驗陳述句
if 運算式
then 命令表1
else 命令表2
fi
#如果運算式為真, 則執行命令表1 中的命令, 并退出if 陳述句;否則執行命令表2 中的陳述句, 再退出if 陳述句
2、多路分支陳述句
多路分支陳述句case 用于多重條件測驗, 語法結構清晰自然
case 字串變數 in #(case 陳述句只能檢測字串變數)
模式1) #(各模式中可用檔案名元字符,以右括號結束)
命令表1
;; #(命令表以單獨的雙分號行結束,退出case 陳述句)
模式2)
命令表2
;;
……
模式n) #(模式n 常寫為字符* 表示所有其他模式)
命令表n
;; #(最后一個雙分號行可以省略)
esac
3、回圈陳述句
回圈體由陳述句括號do 和done 來限定
(1)for回圈
for 變數名 in 單詞表
do
命令表
done
(2)while回圈
while 命令或運算式
do
命令表
done
4、回圈控制陳述句
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)在對函式命名時最好能使用有含義且容易理解的名字,即使函式名能夠比較準確地表達
函式所完成的任務,同時建議對于較大的程式要建立函式名和變數命名對照表,
選自華清遠見《嵌入式作業系統》
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285831.html
標籤:其他
上一篇:Linux編程環境
