【學習筆記】程序員
Shell 腳本(Shell Script)與Windows/DOS 下的批處理類似,也就是將各種命令預先放入其中,方便一次性執行的一個程序文件,主要用以方便管理員進行設置或者管理。可是Shell 腳本比Windows 下的批處理更強大,比用其餘編程程序編輯的程序效率更高,畢竟它使用了Linux/UNIX 下的命令。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"
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變量之前的內容),不然,以前的環境變量會被覆蓋掉
說明性語句即註釋行
一、鍵盤讀入變量值
存放目錄的變量爲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 程序中, 經常把完成固定功能、且屢次使用的一組命令(語句)封裝在一個函數裏,每當要使用該功能時只需調用該函數便可。
函數在調用前必須先定義,即在順序上函數說明必須放在調用程序的前面。
調。
調用程序可傳遞參數給函數, 函數可用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 腳本,調用的格式爲
腳本名
注意:
(1)在Linux 編輯中命令區分大小寫字符;
(2)在Shell 語句中加入必要的註釋,以便之後查詢和維護,註釋以#開頭;
(3)對Shell 變量進行數字運算,使用乘法符號「*」時,要用轉義字符「\」進行轉義;
(4)因爲Shell 對命令中多餘的空格不進行任何處理,所以程序員能夠利用這一特性調整程序縮進,達到加強程序可讀性效果;
(5)在對函數命名時最好能使用有含義且容易理解的名字,即便函數名可以比較準確地表達
函數所完成的任務,同時建議對於較大的程序要創建函數名和變量命名對照表。
選自華清遠見《嵌入式操做系統》