1桦踊,shell相關(guān)概念簡(jiǎn)介
1)shell椅野,C語(yǔ)言編寫,是命令語(yǔ)言又是程序設(shè)計(jì)語(yǔ)言。
2)shell程序從腳本中逐行讀取并執(zhí)行命令竟闪。交互式:解釋執(zhí)行用戶輸入的命令离福,批處理:一次將腳本中的命令執(zhí)行完。
3)常見的shell(解釋器)瘫怜,bash(linux默認(rèn)的)术徊、sh、csh鲸湃、ksh赠涮、zsh等。
4)解釋型語(yǔ)言(腳本語(yǔ)言)暗挑,執(zhí)行時(shí)讀取源碼(source code)轉(zhuǎn)換成目標(biāo)代碼(object code)笋除,再由計(jì)算機(jī)執(zhí)行。由于沒有預(yù)先編譯炸裆,效率一般略低于編譯性語(yǔ)言
2垃它,語(yǔ)法相關(guān)
1)#! 開頭約定,告訴系統(tǒng)使用哪一種解釋器來(lái)執(zhí)行烹看。
which sh国拇; which bash
2)給腳本賦予可執(zhí)行的權(quán)限。chmod +x ./hzq.sh
惯殊,文件的擴(kuò)展名不影響腳本的執(zhí)行酱吝。./hzq.sh執(zhí)行腳本,若直接hzq.sh會(huì)在環(huán)境變量path中尋找hzq.sh命令
3)定義變量土思。var="hzq"
變量名和等號(hào)之間不能有空格务热。首字符為字母,不能有標(biāo)點(diǎn)和空
使用變量己儒。${var}推薦加上花括號(hào)崎岂。
4)特殊變量。
$0:當(dāng)前腳本名稱闪湾。
$n:傳遞給腳本的第n個(gè)參數(shù)
$#:參數(shù)的個(gè)數(shù)
$* 或者$@:所有參數(shù)
$?:上個(gè)命令的退出狀態(tài)或者函數(shù)的返回值冲甘。執(zhí)行成功會(huì)返回 0,失敗返回 1响谓。
$$:當(dāng)前shell進(jìn)程的pid损合。
5)轉(zhuǎn)義與替換。
echo "hzq\n"hzq\n
echo -e "hzq\n"hzq
命令替換是shell先執(zhí)行命令娘纷,將結(jié)果保存嫁审。
DATE=`date`
echo "Date is ${DATE}"
6)expr 表達(dá)式計(jì)算
算數(shù)運(yùn)算符
var=`expr 2 \* 3`
echo "2 * 3 :${var}"
關(guān)系運(yùn)算符
if [${a} -lt 100 -a $ -gt 15]
then
echo "a < 100 && b > 15"
fi
布爾運(yùn)算符
-o:或赖晶, -a:與律适,!:非
字符串測(cè)試運(yùn)算符
=:相等辐烂,-z:長(zhǎng)度是否為0,-n:長(zhǎng)度不為0返回true捂贿,str:[$a]不空返回true
文件測(cè)試運(yùn)算符
-d file:目錄測(cè)試纠修,-f file:普通文件,-r厂僧、-w扣草、-x權(quán)限測(cè)試,-e 文件或者目錄存在測(cè)試颜屠。
7)重定向
command > file 輸出重定向辰妙,覆蓋
command >>file 輸出重定向,追加
command <file 輸入重定向到文件
8)文件包含甫窟。(將外部腳本合并到當(dāng)前腳本)
. filename 或者 source filename被包含的腳本不需要有執(zhí)行權(quán)限
3密浑,注意點(diǎn)
1)注釋可以使用函數(shù)封裝,不調(diào)用
java function fun(){注釋內(nèi)容 }
2)單引號(hào)字符串:原樣輸入粗井,變量無(wú)效尔破。不能出現(xiàn)單引號(hào),轉(zhuǎn)義也不行浇衬。
雙引號(hào)字符串:可以有變量懒构,可以出現(xiàn)轉(zhuǎn)義字符。
3)重定向耘擂。
stdin:標(biāo)準(zhǔn)輸入痴脾,一般指鍵盤設(shè)備,文件描述符為0 stdout:標(biāo)準(zhǔn)輸出梳星,一般指顯示器,文件描述符為1 stderr:標(biāo)準(zhǔn)錯(cuò)誤滚朵,一般指顯示器冤灾,文件描述符為2
將標(biāo)準(zhǔn)輸入重定向到文件,將stdout和stderr標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤辕近,重定向到文件韵吨。command < file1 >> file2 2>&1n > &m將輸出文件n和m合并
command > /dev/null 2>&1,執(zhí)行命令command移宅,屏蔽輸出归粉。/dev/null特殊文件,寫入的內(nèi)容都會(huì)被丟棄
4漏峰,符號(hào)糠悼。
1)[] 單中括號(hào)用于算數(shù)比較或者文件測(cè)試。
echo [ $RETVAL = 0 ] ; echo [ -d $var ];
2)[[]]雙中括號(hào)浅乔。用于比較字符串是否相等倔喂。[[ $str1 = $str2 ]]
3)$()括號(hào)或者``都可以用來(lái)包含命令組铝条。
4){}取變量的值。
5席噩,常用語(yǔ)法
反引號(hào)表示:引用的字符將被視為shell命令來(lái)執(zhí)行班缰。
1,獲取一條命令的輸出結(jié)果悼枢。
var=`ps -C java --no-heading|wc -l`
2埠忘,var=`ps -C maxscale --no-heading|wc -l`
或者var=$(ps -C java --no-heading | wc -l)
3,for...do...done循環(huán)馒索。
for i in `cat roomId.csv`;
do cat -n /usr/local/tomcat/.../..log | grep "dddafefe";
done;
5,
1)./a.sh &莹妒,&對(duì)SIGINT 信號(hào)免疫
程序終止(interrupt)信號(hào), 在用戶鍵入INTR字符(通常是Ctrl-C)時(shí)發(fā)出,用于通知前臺(tái)進(jìn)程組終止進(jìn)程双揪。
Ctrl + C动羽,a.sh照樣運(yùn)行。
2)nohup的意思是忽略SIGHUP信號(hào)渔期。本信號(hào)在用戶終端連接(正吃讼牛或非正常)結(jié)束時(shí)發(fā)出
nohup ./a.sh
3)nohup ./a.sh & 并且不要直接關(guān)閉term終端,需要ctrl + D退出疯趟。