測(cè)試方法:
[ ? ?expression ? ?]:命令測(cè)試法
[ [ expression ] ]:關(guān)鍵字測(cè)試法
test expression
bash中常用的條件測(cè)試有有一種:
? ? 整數(shù)測(cè)試:
? ? ? ? ? ? ?-gt:大于
? ? ? ? ? ? ?-le:小于等于
? ? ? ? ? ? ?-ne:不等于
? ? ? ? ? ? ?-eq:等于
? ? ? ? ? ? ?-ge:大于等于
? ? ? ? ? ? ?-lt:小于
eg
? ? ? INT1=63
? ? ? INT2=77
? ? ? [ ? $INT1 -eq $INT2 ? ]
? ? ? [ [ ?$INT1 ?-eq $INT2 ] ]
? ? ? test $INT1 -eq $INT2
? ? ?文件測(cè)試:
? ? ? ?-e FILE:測(cè)試文件是否存在
? ? ? ?-f ?FILE:測(cè)試文件是否為普通文件
? ? ? ?-d FILE:測(cè)試指定路徑是否為目錄
? ? ? ?-r ?FILE:測(cè)試指定文件對(duì)當(dāng)前用戶(hù)來(lái)講是否可讀
? ? ? ?-w FILE:測(cè)試指定文件對(duì)當(dāng)前用戶(hù)來(lái)講是否可寫(xiě)
? ? ? ?-x ?FILE:測(cè)試指定文件對(duì)當(dāng)前用戶(hù)來(lái)講是否可執(zhí)行
測(cè)試腳本是否有語(yǔ)法錯(cuò)誤:
bash -n 腳本
bash -x ?腳本:?jiǎn)尾綀?zhí)行
bash變量的類(lèi)型:
? ? ? ? 本地變量(局部變量):作用域當(dāng)前shell進(jìn)程
? ? ? ? 環(huán)境變量:當(dāng)前shell進(jìn)程和子進(jìn)程
? ? ? ? 位置變量:$1,$2,...
? ? ? ? ? ? ? ? ? ? ? ? ? 在腳本中如何引用作用對(duì)象
? ? ? ? ? ? ? ? ? ? ? ? ? eg ? ?./filetest.sh ? /etc/fstab ?/etc/inittab ....
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $1:/etc/fstab ?腳本中的第一個(gè)參數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $2:/etc/inittab ?腳本中的第二個(gè)參數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? …:腳本中的第n個(gè)參數(shù)
shift:位置參數(shù)可以用shift命令左移。比如shift 3表示原來(lái)的$4現(xiàn)在變成$1描融,原來(lái)的$5現(xiàn)在變成$2等等铝噩,原來(lái)的$1、$2窿克、$3丟棄骏庸,$0不移動(dòng)。不帶參數(shù)的shift命令相當(dāng)于shift 1年叮。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 特殊變量:
? ? ? ? ? ? ? ? ? ? ? $?:是返回腳本或者命令執(zhí)行之后的退出狀態(tài)具被,默認(rèn)返回值是0或者1,0代表退出成功谋右,無(wú)錯(cuò)誤硬猫,1代表退出失敗,某處有錯(cuò)誤改执。也可以自己設(shè)置退出值啸蜜,在腳本命令最后加上exit n,n表示任何一 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?個(gè)整數(shù)辈挂,比如exit 100衬横,那么退出狀態(tài)$?=100。
? ? ? ? ? ? ? ? ? ? ? $#:參數(shù)的個(gè)數(shù)
? ? ? ? ? ? ? ? ? ? ? $*:參數(shù)列表
? ? ? ? ? ? ? ? ? ? ? $@:參數(shù)列表
exit:退出腳本
exit #
如果腳本沒(méi)有明確定義退出狀態(tài)碼终蒂,那么蜂林,最后執(zhí)行的一條命令的退出狀態(tài)碼即為腳本的退出狀態(tài)碼
判斷文件是否存在
#!/bin/bash
FILE=/etc/inittab
if [ -e $FILE ]; then
? ?? ?? ?? ?? ? echo “ok”
else
? ?? ?? ?? ?? ? echo “nosuch file”
fi
測(cè)試腳本是否有語(yǔ)法錯(cuò)誤:bash–n +腳本名
寫(xiě)一個(gè)腳本
給定一個(gè)文件遥诉,如果是普通文件就顯示,如果是一個(gè)目錄亦顯示之噪叙,否則此為無(wú)法識(shí)別之文件
#!/bin/bash
FILE=/etc/rc.d/rc.sysinit
if [ ! –e $FILE ]; then
? ?? ?? ?? ?? ? echo “nosuch file”
fi
if [ -f $FILE ]; then
? ?? ?? ?? ?? ? echo “commonfile”
elif [-d $FILE ]; then
? ?? ?? ?? ?? ? echo “directory”
else
? ?? ?? ?? ?? ? echo”unknow”
fi
寫(xiě)一個(gè)腳本矮锈,能接受一個(gè)參數(shù)(文件路徑),判定此參數(shù)如果是一個(gè)存在的文件睁蕾,就顯示ok苞笨,否則顯示nosuch file
#!/bin/bash
echo $#(特殊變量,參數(shù)的個(gè)數(shù))
if [ -e $1 ]; then(位置變量)
? ?? ?? ?? ?? ? echo“ok”
else
? ?? ?? ?? ?? ? echo”nosuch file”
fi
寫(xiě)一個(gè)腳本子眶,給腳本傳遞2個(gè)參數(shù)(整數(shù))瀑凝,顯示2個(gè)數(shù)的和與積
#!/bin/bash
If [ $# -lt 2 ]; then
? ?? ?? ?? ?? ? Echo”usage:cacl.sh ARG1 ARG2”
? ?? ?? ?? ?? ? Exit
Fi
Echo “the sum is : $[ $1 + $2]”
Echo “the prod is: $[ $1 * $2 ]”
06_02_sed命令
Linux三大文本處理工具:grep, sed(流編輯器), awk?????
sed基本用法:
sed: Stream EDitor
?行編輯器?(全屏編輯器: vi),逐行讀取
sed:?模式空間
默認(rèn)不編輯原文件臭杰,僅對(duì)模式空間中的數(shù)據(jù)做處理粤咪;而后,處理結(jié)束后渴杆,將模式空間打印至屏幕寥枝;
sed [options] 'AddressCommand' file ...
?-n:?靜默模式,不再默認(rèn)顯示模式空間中的內(nèi)容
?-i:?直接修改原文件
?-e SCRIPT -e SCRIPT:可以同時(shí)執(zhí)行多個(gè)腳本
?-f /PATH/TO/SED_SCRIPT: 從文件中讀取命令磁奖,把命令寫(xiě)入文件脉顿,不需要單引號(hào)括起來(lái)
?sed -f /path/to/scripts?file
?-r:?表示使用擴(kuò)展正則表達(dá)式
Address:
1、StartLine,EndLine
?比如1,100
?$:最后一行
2点寥、/RegExp/
?/^root/
3、/pattern1/,/pattern2/
?第一次被pattern1匹配到的行開(kāi)始来吩,至第一次被pattern2匹配到的行結(jié)束敢辩,這中間的所有行
4、LineNumber
?指定的行
5弟疆、StartLine, +N
?從startLine開(kāi)始戚长,向后的N+1行;
Command:
?d:?刪除符合條件的行怠苔;
?p:?顯示符合條件的行同廉;
?a \string:?在指定的行后面追加新行,內(nèi)容為string
?\n:可以用于換行
?i \string:?在指定的行前面添加新行柑司,內(nèi)容為string
?r FILE:?將指定的文件的內(nèi)容添加至符合條件的行處
?w FILE:?將地址指定的范圍內(nèi)的行另存至指定的文件中;
?s/pattern/string/修飾符:?查找并替換迫肖,默認(rèn)只替換每行中第一次被模式匹配到的字符串
? ? ? ? ? ? ? ? ? ?匹配多個(gè)字符串,需要加修飾符:
? ? ? ? ? ? ? ? ? ? ? ?g:?全局替換
? ? ? ? ? ? ? ? ? ? ? ?i:?忽略字符大小寫(xiě)
? ? ?s///: 也可以使用其他字符做分隔符攒驰,只要一樣就行蟆湖,如s###, s@@@?
?后項(xiàng)引用:\(\), \1, \2
???????????????????&:?引用模式匹配整個(gè)串
?l..e->l..er: like-->liker
? ? ? ? ? ? ? ? ? ????love-->lover
sed 's#\(l..e\)#\1r#g'
? ? ?sed 's#l..e#&r#g'
l..e->L..e:?like-->Like
? ? ? ? ? ? ??? ? ? ? ? ?love-->Love
? ? ? ? sed 's#l\(..e\)#L\1#g'
sed練習(xí):
1、刪除/etc/grub.conf文件中行首的空白符玻粪;
sed -r 's@^[[:spapce:]]+@@g' /etc/grub.conf?
2隅津、替換/etc/inittab文件中"id:3:initdefault:"一行中的數(shù)字為5诬垂;
sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab
3、刪除/etc/inittab文件中的空白行伦仍;
sed '/^$/d' /etc/inittab
4结窘、刪除/etc/inittab文件中開(kāi)頭的#號(hào);
sed 's@^#@@g' /etc/inittab
5、刪除某文件中開(kāi)頭的#號(hào)及后面的空白字符充蓝,但要求#號(hào)后面必須有空白字符;
sed -r 's@^#[[:space:]]+@@g' /etc/inittab
6隧枫、刪除某文件中以空白字符后面跟#類(lèi)的行中的開(kāi)頭的空白字符及#
sed -r 's@^[[:space:]]+#@@g' /etc/inittab
7、取出一個(gè)文件路徑的目錄名稱(chēng);
echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'?????