6 開(kāi)始shell編程
反引號(hào):``將命令輸出結(jié)果賦值給變量睹酌;
重定向:>寫(xiě)入文件,>>追加到文件憋沿,wc<test文件內(nèi)容輸入到命令;
管道:相當(dāng)有用采章!同時(shí)運(yùn)行,將命令的輸出向后依次傳遞担租;
數(shù)學(xué)運(yùn)算:記住bash僅能處理整數(shù)!
$[operation]
expr operation
bc # 設(shè)置scale以計(jì)算浮點(diǎn)數(shù)
var=`bc << EOF
scale=4
a1=10.46*43.67
b1=33.2*71
a1+b1
EOF
`
EOF用來(lái)標(biāo)識(shí)內(nèi)聯(lián)重定向數(shù)據(jù)的開(kāi)始和結(jié)尾奋救;
退出腳本:exit [0~255]
7 邏輯流控制
雙圓括號(hào):((expression))高級(jí)數(shù)學(xué)表達(dá)式(C語(yǔ)言風(fēng)格)
雙方括號(hào):[[expression]]匹配字符串
內(nèi)部字段分隔符IFS:空格反惕、制表符、換行符(包含空格的字符串利耍,使用雙引號(hào))
while:允許多個(gè)測(cè)試命令盔粹,由最后的那個(gè)決定結(jié)束循環(huán)(所有命令都被執(zhí)行,且每個(gè)命令都是單獨(dú)一行)
break/continue n:跳出循環(huán)/停止循環(huán)內(nèi)的命令舷嗡,但繼續(xù)外部循環(huán)(默認(rèn)n=1)
# 普通shell命令:執(zhí)行cmd,若exit 0捻脖,則執(zhí)行cmds_1
if cmd
then
cmds_1
elif cmd
then
cmds_2
else
cmds_3
fi
# test命令:數(shù)值(-gt)中鼠。字符串(>或<,記得加雙引號(hào))援雇、文件比較(包括目錄、文件)
if [ $var1 -gt $var2 ]
if [ "$str1" \> "$str2" ] [ -n "$str1" ] [ -z "$str1" ]
if [ -d/-e "$HOME" ] [ -f/-s "$file" ]
# case命令
case variable in
pattern1 | pattern2)
cmds_1;;
pattern3)
cmds_2;;
*)
default_cmds;;
esac
# var保持最后一次迭代的值具温;按行遍歷文件筐赔;結(jié)果重定向;結(jié)果管接給另一個(gè)命令
IFS=$'\n' IFS=: IFS=$'\n:;'"
for var in `cat "$file"`
do
echo $var
done > output.txt | sort
8 處理用戶輸入
# 讀取程序名
`basename $0`
# 參數(shù)變量
$#; ${!#}; $*/$@
# 移除參數(shù):用于遍歷參數(shù)
while [ -n $1 ]; do ... shift n; done
# getopt命令:-a -b 'test1' -c -d --'test2''test3'
argv[]="-a -b test1 -cde test2 test3"
getopt -q ab:cd $@
9 shell基礎(chǔ)
- 一切皆文件:所有資源統(tǒng)統(tǒng)抽象為文件形式
- 單一目的小程序:組合小程序完成復(fù)雜任務(wù)
- 盡量避免跟用戶交互:易于編程實(shí)現(xiàn)自動(dòng)化任務(wù)
- 使用文本文件保存配置信息
shell優(yōu)勢(shì)在于處理偏操作系統(tǒng)底層的業(yè)務(wù)达皿,符合linux簡(jiǎn)單、易用鳞绕、高效的三大原則;
python優(yōu)勢(shì)在于復(fù)雜運(yùn)維軟件、web頁(yè)面管理工具控轿、web業(yè)務(wù)的開(kāi)發(fā)。
變量鹦蠕、注釋
$+變量名在抛,推薦引用時(shí)加上{}
需要原樣輸出,加上單引號(hào)
其他沒(méi)有特別要求的字符串等最好都加上雙引號(hào)
大段注釋或臨時(shí)代碼加上{}刚梭,定義成函數(shù)朴读,不調(diào)用就不會(huì)執(zhí)行。
myUrl="http://see.xidian.edu.cn/cpp/shell/"
readonly myUrl # 只讀變量衅金,更改會(huì)報(bào)錯(cuò)
myUrl="http://see.xidian.edu.cn/cpp/danpianji/"
unset myUrl # 刪除變量,但不能刪除只讀變量
unset .f function # 刪除函數(shù)
文件包含
source又稱為點(diǎn)操作符鉴吹,推薦使用.
被包含腳本不需要有執(zhí)行權(quán)限惩琉。
# source ./function.sh或
. ./function.sh
# 獲取絕對(duì)路徑的方法
real_path=`readlink -f $filename`
. $real_path
10 shell高級(jí)
函數(shù)(庫(kù))
function func1 {
cmds
}
func2() {
cmds
}
# 局部變量
local temp
函數(shù)被重定義時(shí),新定義覆蓋原定義琳水,不會(huì)產(chǎn)生任何錯(cuò)誤消息。
$?函數(shù)的退出狀態(tài)碼诚啃,僅代表最后一條命令是否成功運(yùn)行私沮;return整數(shù)值,賦給$?為退出碼;echo輸出魔招,賦給變量五辽;循環(huán)+echo輸出,賦給數(shù)組變量杆逗。
啟動(dòng)新shell自動(dòng)加載函數(shù):.bashrc文件
圖形化菜單
function menu {
clear
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Disply disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit program\n\n"
echo -en "\t\tEnter option: "
read -n 1 option
}
menu
case $option in
0)
break ;;
1)
diskspace ;;
2)
whoson ;;
3)
memusage ;;
*)
clear
echo "Sorry, wrong selection.";;
esac
11 正則表達(dá)式、sed進(jìn)階
[] 字符組:包含任何字符
[^] 排除字符組:之外的任何字符
[[::]] 特殊字符組:alnum=alpha+digit;blank/print/punct/space
*/+/? 0或多次/1或多次/0或1次
{m,n} 指定出現(xiàn)次數(shù):在m到n的區(qū)間
|/() OR多個(gè)模式/聚合表達(dá)式
d 刪除pattern space蠕蚜,進(jìn)入下一個(gè)循環(huán)
h/H pattern space 復(fù)制/附加 hold space
g/G hold space 復(fù)制/附加 pattern space
x pattern space 交換 hold space
b/t 跳轉(zhuǎn)(很難掌握)
& \1 \2 模式替代