第一步:ESC 進(jìn)入命令行模式
第二步:: 進(jìn)入底行模式
第三步:q! 撤銷本次修改并退出編輯
【vi編輯器的3種模式】
基本上vi可以分為三種狀態(tài),分別是命令模式( mode)、插入模式( mode)和底行模式(last line mode),各模式的功能區(qū)分如下:
1. 命令行模式 mode)
控制屏幕光標(biāo)的移動(dòng),字符、字或行的刪除,查找,移動(dòng)復(fù)制某區(qū)段及進(jìn)入 mode下,或者到 last line mode。
命令行模式下的常用命令:
移動(dòng)光標(biāo)
復(fù)制/粘貼
剪切/刪除,剪切與刪除都是dd
撤銷/恢復(fù)
2. 編輯模式( mode)
只有在 mode下,才可以做文字輸入,按「ESC」鍵可回到命令行模式。
編輯模式下常用命令:
ESC 退出編輯模式到命令行模式; 3. 底行模式(last line mode)
將文件保存或退出vi,也可以設(shè)置編輯環(huán)境,如尋找字符串、列出行號(hào)……等。
底行模式下常用命令:
保存/退出
查找/搜索
文件內(nèi)容的替換
顯示行號(hào)
:set nu
【nu = number】,行號(hào)
取消行號(hào) => :set nonu
3. shell編程
shell編程原文連接
3.1 shell簡(jiǎn)介 3.1.1 運(yùn)行shell腳本
shell腳本test.sh
#!/bin/bash
echo "Hello World"
1. 作為可執(zhí)行程序運(yùn)行
chmod +x test.sh # 賦予可執(zhí)行權(quán)限
./test.sh # 執(zhí)行程序
2. 作為解釋器參數(shù)運(yùn)行
/bin/sh test.sh # 執(zhí)行命令
/bin/php test.php # 執(zhí)行命令
3.1.2 shell注釋
單行注釋 #
# 這是一個(gè)注釋
# author:ohuohuoo
# date:`date`
多行注釋
:<
3.1.3 shell編寫(xiě)的基本步驟 建立shell文件賦予shell文件可執(zhí)行程序權(quán)限(使用chmod命令修改權(quán)限)執(zhí)行shell文件(直接運(yùn)行賦予權(quán)限后的二進(jìn)制文件) 3.2 shell變量 3.2.1 定義變量
shell編程中,定義變量是直接定義的,沒(méi)有明確的數(shù)據(jù)類型,shel允許用戶建立變量存儲(chǔ)數(shù)據(jù),但是將認(rèn)為賦給變量的值都解釋為一串字符,如下
cout=1 # 定義變量
name="ohuohuo" # 定義變量
echo $cout # 取變量值
echo $name # 取變量值
shell變量命名規(guī)則:
在變量中使用系統(tǒng)命令,需要加上 " `"符號(hào)(ESC鍵下方),如下所示
DATE1=`date`
DATE2=$(date)
3.2.2 使用變量
使用變量的時(shí),用英文符號(hào)"$"取變量值,對(duì)于較長(zhǎng)的變量名,建議加上{ }花括號(hào),幫助解釋器識(shí)別變量的邊界,如下
name="test_name"
echo "My name is ${name}and you?"
已經(jīng)定義過(guò)的變量,可以二次定義并重新被賦值覆蓋上一次的變量值
3.2.3 變量類型
運(yùn)行shell時(shí)會(huì)同時(shí)存在三種變量
局部變量:在腳本或命令中定義,僅在當(dāng)前shell實(shí)例中有效,其他shell啟動(dòng)的程序不能訪問(wèn)局部變量
環(huán)境變量:所有的程序,包括shell啟動(dòng)的程序,都能訪問(wèn)環(huán)境變量,必要的時(shí)候shell腳本也可以定義環(huán)境變量
shell變量:由shell程序設(shè)置的特殊變量。shell變量中有一部分是環(huán)境變量,有一部分是局部變量,不同類型的變量保證了shell的正常運(yùn)行
3.2.4 變量操作
shell中的變量,默認(rèn)為可讀可寫(xiě)類型,如果想要其只可讀,如同url一樣,需要將其聲明為只讀類型變量(如同const),使用命令,如下腳本
#!/bin/bash
Url="http://www.baidu.com"
readonly Url
如果想要?jiǎng)h除變量,使用unset命令解除命令賦值,但是unset不能刪除可讀變量,如下所示
#!/bin/sh
name="ohuohuo"
Url="http://www.baidu.com"
readonly Url # 設(shè)置可讀變量
unset name # 可以被刪除
unset Url # 不可被刪除
echo $name # 不被打印出
echo $Url # 打印出
3.3 shell字符串 3.3.1 字符串類型
在shell中字符串是shell編程中最常用最有用的數(shù)據(jù)類型,字符串可以用單引號(hào),也可以用雙引號(hào),也可以不用引號(hào)。
使用單引號(hào)
str='this is a string'
使用單引號(hào)的不足:
使用雙引號(hào)
name="ohouhuoo"
str="please input your \"$name"\"
echo -e $str
使用雙引號(hào)的優(yōu)勢(shì):
由此可見(jiàn),雙引號(hào)較單引號(hào)而言有更強(qiáng)大的優(yōu)勢(shì)
3.3.2 字符串操作
提取子字符串:使用字符串的截取命令,用于提取部分字符串
string="this is a test"
echo ${string:2:6} # 表示從第3個(gè)字符開(kāi)始截取
上式輸出結(jié)果為is is
查找字符串:用于查找字符的位置,輸出結(jié)果為字符在字符串中所占的數(shù)據(jù)位置,如果查找多個(gè)字符,那哪個(gè)字母先出現(xiàn)就計(jì)算哪個(gè),如下查找it中i和t兩個(gè)字符,t先出現(xiàn),輸出為1
string="this is a test"
echo `expr index "$string" it` # 輸出 1
3.4 shell數(shù)組
在bash下,僅僅支持一維數(shù)組,并且沒(méi)有限定數(shù)組的大小,不支持多維數(shù)組。類似于 C 語(yǔ)言,數(shù)組元素的下標(biāo)由 0 開(kāi)始編號(hào)(上述字符串也是這樣)。獲取數(shù)組中的元素要利用下標(biāo),下標(biāo)可以是整數(shù)或算術(shù)表達(dá)式,其值應(yīng)大于或等于 0。
3.4.1 定義數(shù)組
# 一般定義
array_name=(value1 value2 value3 value4)
# 多級(jí)定義
array_test=(
value1
value2
value3
value4
)
#
array_text[0]=value0
array_text[1]=value1
array_text[3]=value3
...
...
三種定義形式均可
3.4.2 數(shù)組操作
讀取數(shù)組:和讀取變量名相同,使用$符號(hào),需要加上下標(biāo)名
valuen=${array_name[n]}
echo ${array_name[@]} # 讀取所有
獲取數(shù)組長(zhǎng)度:獲取數(shù)組長(zhǎng)度的方法與獲取字符串長(zhǎng)度的方法相同,如所示
# 取得數(shù)組元素的個(gè)數(shù)
length=${#array_name[@]} # 從頭到尾取
# 或者
length=${#array_name[*]} # 取所有
# 取得數(shù)組單個(gè)元素的長(zhǎng)度
lengthn=${#array_name[n]} # 取特定
3.5 shell傳遞參數(shù)
在執(zhí)行 Shell 腳本時(shí),向腳本傳遞參數(shù),腳本內(nèi)獲取參數(shù)的格式為:$n。n 代表一個(gè)數(shù)字,1 為執(zhí)行腳本的第一個(gè)參數(shù),2 為執(zhí)行腳本的第二個(gè)參數(shù),以此類推……,腳本編寫(xiě)如下,保存為test.sh
echo "傳遞參數(shù)實(shí)例!";
echo "執(zhí)行的文件名:$0";
echo "第一個(gè)參數(shù)為:$1";
echo "第二個(gè)參數(shù)為:$2";
echo "第三個(gè)參數(shù)為:$3";
執(zhí)行腳本如下
chmod +x test.sh
./test.sh 1 2 3
結(jié)果
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img--61)(/Users/uru// /-user-/image-.png)]
在使用shell傳遞參數(shù)的時(shí)候,常常需要用到以下的幾個(gè)字符來(lái)處理參數(shù)
參數(shù)處理說(shuō)明
$#
傳遞到腳本的參數(shù)個(gè)數(shù)
$*
以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)。 如的形式輸出所有參數(shù)。
$$
腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)
$!
后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$@
與? 相 同 , 但 是 使 用 時(shí) 加 引 號(hào) , 并 在 引 號(hào) 中 返 回 每 個(gè) 參 數(shù) 。 如 " *相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)。 如"?相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)。如"@“用「”」括起來(lái)的情況、以"$1" “2 " … " 2" … “2”…"n” 的形式輸出所有參數(shù)。
$-
顯示Shell使用的當(dāng)前選項(xiàng),與set命令功能相同。
顯示最后命令的退出狀態(tài)。0表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤
echo "傳遞參數(shù)實(shí)例!";
echo "第一個(gè)參數(shù)為:$1";
echo "參數(shù)個(gè)數(shù)為:$#";
echo "傳遞的參數(shù)作為一個(gè)字符串顯示:$*";
結(jié)果
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img--62)(/Users/uru// /-user-/image-.png)]
? 其實(shí)就是一個(gè)輸出參數(shù)的過(guò)程
3.6 shell運(yùn)算符 3.6.1 shell運(yùn)算符種類
shell想要使用這些運(yùn)算符,需要結(jié)合其他命令和工具來(lái)使用(因?yàn)閟hell中不支持簡(jiǎn)單的數(shù)學(xué)運(yùn)算),如使用算符運(yùn)算符就需要搭配的常用的工具有兩種
運(yùn)算規(guī)則注意點(diǎn):
實(shí)例
#!/bin/bash
val=`expr 3 + 2`
echo "兩數(shù)之和為 : $val"
3.6.2 算數(shù)運(yùn)算符
shell支持的常用的如下表,舉例中這里假定變量 a 為 10,變量 b 為 20
運(yùn)算符說(shuō)明舉例
+
加法
expr $a + $b 結(jié)果為 30。
-
減法
expr $a - $b 結(jié)果為 -10。
*
乘法
expr $a \* $b 結(jié)果為 200。
/
除法
expr $b / $a 結(jié)果為 2。
%
取余
expr $b % $a 結(jié)果為 0。
=
賦值
a=$b 將把變量 b 的值賦給 a。
==
相等。用于比較兩個(gè)數(shù)字,相同則返回 true。
[ $a == $b ] 返回 false。
!=
不相等。用于比較兩個(gè)數(shù)字,不相同則返回 true。
[ $a != $b ] 返回 true。
3.6.3 關(guān)系運(yùn)算符
shell中的關(guān)系運(yùn)算符和其他編程語(yǔ)言不同,shell中使用特殊的字符表示關(guān)系運(yùn)算符,并且只支持?jǐn)?shù)字,不支持字符串,除非字符串是數(shù)字,下表為常用關(guān)系運(yùn)算符,同樣指定a為10,b為20
運(yùn)算符說(shuō)明舉例
-eq
檢測(cè)兩個(gè)數(shù)是否相等,相等返回 true。
[ $a -eq $b ] 返回 false。
-ne
檢測(cè)兩個(gè)數(shù)是否不相等,不相等返回 true。
[$a -ne $b ] 返回 true。
-gt
檢測(cè)左邊的數(shù)是否大于右邊的,如果是,則返回 true。
[ $a -gt $b ] 返回 false。
-lt
檢測(cè)左邊的數(shù)是否小于右邊的,如果是,則返回 true。
[ $a -lt $b ] 返回 true。
-ge
檢測(cè)左邊的數(shù)是否大于等于右邊的,如果是,則返回 true。
[ $a -ge $b ] 返回 false
-le
檢測(cè)左邊的數(shù)是否小于等于右邊的,如果是,則返回 true。
[ $a -le $b ] 返回 true。
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
需要注意的點(diǎn):
運(yùn)算符和數(shù)之間必須要用空格隔開(kāi)
3.6.4 布爾運(yùn)算符
shell中的布爾運(yùn)算符使用如下表,同樣指定a為10,b為20
運(yùn)算符說(shuō)明舉例
!
非運(yùn)算,表達(dá)式為true則返回false,否則返回true
[ ! false ] 返回 true
-o
或運(yùn)算,有一個(gè)表達(dá)式為true則返回true
[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a
與運(yùn)算,兩個(gè)表達(dá)式都為true才返回true
[ $a -lt 20 -a $b -gt 100 ] 返回 false
#!/bin/bash
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi
3.6.5 邏輯運(yùn)算符 運(yùn)算符說(shuō)明舉例
&&
邏輯的AND
[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||
邏輯的OR
[[$a -lt 100 || $b -gt 100]]返回true
#!/bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
需要注意的點(diǎn):
這里使用兩層的[ ]符號(hào),將兩次關(guān)系運(yùn)算的結(jié)果保存在條件句中
3.6.6 字符串運(yùn)算符
shell中常用的字符串運(yùn)算符如下表。假定變量 a 為 “abc”,變量 b 為 “efg”
運(yùn)算符說(shuō)明舉例
=
檢測(cè)兩個(gè)字符串是否相等,相等返回true
[ $a = $b ] 返回 false
!=
檢測(cè)兩個(gè)字符串是否相等,不相等返回true
[ $a != $b ] 返回 true。
-z
檢測(cè)字符串長(zhǎng)度是否為0,為0返回true
[ -z $a ] 返回 false。
-n
檢測(cè)字符串長(zhǎng)度是否為0,不為0返回true
[ -n “$a” ] 返回 true
$
檢測(cè)字符串是否為空,不為空返回true
[ $a ] 返回 true
#!/bin/bash
a="abc"
b="efg"
if [ $a != $b ]
then
echo "$a != $b : a 等于 b"
else
echo "$a != $b: a 不等于 b"
fi
3.6.7 文件測(cè)試運(yùn)算符
shell中的文件測(cè)試運(yùn)算符用于檢測(cè)在類unix系統(tǒng)中,文件的各種屬性,如下表
運(yùn)算符說(shuō)明舉例
-b file
檢測(cè)文件是否是塊設(shè)備文件,如果是,則返回 true。
[ -b $file ] 返回 false。
-c file
檢測(cè)文件是否是字符設(shè)備文件,如果是,則返回 true。
[ -c $file ] 返回 false。
-d file
檢測(cè)文件是否是目錄,如果是,則返回 true。
[ -d $file ] 返回 false。
-f file
檢測(cè)文件是否是普通文件(既不是目錄,也不是設(shè)備文件),如果是,則返回 true
[ -f $file ] 返回 true。
-g file
檢測(cè)文件是否設(shè)置了 SGID 位,如果是,則返回 true
[ -g $file ] 返回 false。
-k file
檢測(cè)文件是否設(shè)置了粘著位( Bit),如果是,則返回 true
[ -k $file ] 返回 false。
-p file
檢測(cè)文件是否是有名管道,如果是,則返回 true
[ -p $file ] 返回 false。
-u file
檢測(cè)文件是否設(shè)置了 SUID 位,如果是,則返回 true
[ -u $file ] 返回 false。
-r file
檢測(cè)文件是否可讀,如果是,則返回 true
[ -r $file ] 返回 true。
-w file
檢測(cè)文件是否可寫(xiě),如果是,則返回 true
[ -w $file ] 返回 true
-x file
檢測(cè)文件是否可執(zhí)行,如果是,則返回 true
[ -x $file ] 返回 true。
-s file
檢測(cè)文件是否為空(文件大小是否大于0),不為空返回 true
[ -s $file ] 返回 true。
-e file
檢測(cè)文件(包括目錄)是否存在,如果是,則返回 true
[ -e $file ] 返回 true。
#!/bin/bash
file="/var/www/test/test.sh"
if [ -r $file ]
then
echo "文件可讀"
else
echo "文件不可讀"
fi
3.7 shell編程中的命令 3.7.1 echo命令
echo命令在shell中用于字符串的輸出,調(diào)用的格式:
echo string
echo命令還可顯示復(fù)雜的輸出格式
顯示普通的字符串
echo "this is a test"
顯示轉(zhuǎn)義字符
echo "\this is a test\"
顯示變量
name="ohuohuo"
echo "you name is $name"
顯示換行
echo -e "Right!\n " # -e 表示開(kāi)啟轉(zhuǎn)義
echo "this is other line"
顯示結(jié)果定向重定向至文件
echo "this is a test" > testfile
顯示命令執(zhí)行結(jié)果
echo `date`
3.7.2 命令
shell中的命令如同C語(yǔ)言中一樣,調(diào)用格式也大抵相同,只是有一點(diǎn)點(diǎn)不同。與echo命令打印字符串不同的是,不會(huì)自動(dòng)調(diào)價(jià)換行符號(hào),可以手動(dòng)添加
命令的語(yǔ)法:
printf format-string [arguments...]
參數(shù)說(shuō)明:
舉例如下
$ echo "Hello, Shell" # 輸入
Hello, Shell # 輸出
$ printf "Hello, Shell\n" # 輸入
Hello, Shell # 輸出
命令可以較為強(qiáng)大的使用轉(zhuǎn)義字符,shell中常用的轉(zhuǎn)義字符如下表示所示
序列說(shuō)明
\a
警告字符,通常為ASCII的BEL字符
\b
后退
\c
抑制(不顯示)輸出結(jié)果中任何結(jié)尾的換行字符(只在%b格式指示符控制下的參數(shù)字符串中有效),而且,任何留在參數(shù)里的字符、任何接下來(lái)的參數(shù)以及任何留在格式字符串中的字符,都被忽略
\f
換頁(yè)()
\n
換行
\r
回車( )
\t
水平制表符
\v
垂直制表符
\
一個(gè)字面上的反斜杠字符
\ddd
表示1到3位數(shù)八進(jìn)制值的字符。僅在格式字符串中有效
\0ddd
表示1到3位的八進(jìn)制值字符
3.7.4 test命令
shell中的 test 命令用于檢查某個(gè)條件是否成立,它可以進(jìn)行數(shù)值、字符和文件三個(gè)方面的測(cè)試
數(shù)值測(cè)試命令表
參數(shù)說(shuō)明
-eq
等于則為真
-ne
不等于則為真
-gt
大于則為真
-ge
大于等于則為真
-lt
小于則為真
-le
小于等于則為真
#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '兩個(gè)數(shù)相等!'
else
echo '兩個(gè)數(shù)不相等!'
fi
字符串測(cè)試表
參數(shù)說(shuō)明
=
等于則為真
!=
不相等則為真
-z 字符串
字符串長(zhǎng)度為0則為真
-n 字符串
字符串長(zhǎng)度不為0則為真
# !/bin/bas
num1="name"
num2="function"
if test $num1 = $num2
then
echo '兩個(gè)字符串相等!'
else
echo '兩個(gè)字符串不相等!'
fi
文件測(cè)試表
參數(shù)說(shuō)明
-e 文件名
如果文件存在則為真
-r 文件名
如果文件存在且可讀則為真
-w 文件名
如果文件存在且可寫(xiě)則為真
-x 文件名
如果文件存在且可執(zhí)行則為真
-s 文件名
如果文件存在且至少有一個(gè)字符則為真
-d 文件名
如果文件存在且為目錄則為真
-f 文件名
如果文件存在且為普通文件則為真
-c 文件名
如果文件存在且為字符型特殊文件則為真
-b 文件名
如果文件存在且為塊特殊文件則為真
# !/bin/bash
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
3.8 shell流程控制
shell中的流程控制主要由條件、循環(huán)組成
3.8.1 if- else條件控制語(yǔ)句
if - then - fi
調(diào)用格式:
if condition
then
command1
command2
...
commandN
fi
# 寫(xiě)成單行
if condition;then command1; command2;fi

如果存在不滿足的條件的情況
if condition
then
command1
command2
...
commandN
else
command
fi
在多層嵌套條件情況
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
num1=$[6]
num2=$[8]
if test $[num1] -eq $[num2]
then
echo '兩個(gè)數(shù)字相等!'
else
echo '兩個(gè)數(shù)字不相等!'
fi
3.8.2 case條件
shell中case語(yǔ)句為多功能選擇語(yǔ)句字符串實(shí)現(xiàn)簡(jiǎn)單的行編輯器,與其他語(yǔ)言相通的是,可以用case語(yǔ)句匹配一個(gè)值與一個(gè)模式,如果匹配成功,執(zhí)行相匹配的命令。case語(yǔ)句調(diào)用格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
需要注意的點(diǎn):
echo '輸入 1 到 4 之間的數(shù)字:'
echo '你輸入的數(shù)字為:'
read num
case $num in
1) echo '你選擇了 1'
;;
2) echo '你選擇了 2'
;;
3) echo '你選擇了 3'
;;
4) echo '你選擇了 4'
;;
*) echo '你沒(méi)有輸入 1 到 4 之間的數(shù)字'
;;
esac
case中想要跳出循環(huán)有兩個(gè)命令:break和
break命令允許跳出所有循環(huán)(終止執(zhí)行后面的所有循環(huán))
命令與break命令類似,只有一點(diǎn)差別,它不會(huì)跳出所有循環(huán),僅僅跳出當(dāng)前循環(huán)。
3.8.3 for循環(huán)
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
# 寫(xiě)成一行同樣使用分號(hào)將語(yǔ)句分開(kāi)
for num in 1 2 3 4 5
do
echo "The value is: $num"
done
3.8.4 while循環(huán)
while condition
do
command
done
#!/bin/bash
num=1
while(( $num<=5 ))
do
echo $num
let "num++"
done
3.9 shell函數(shù) 3.9.1 定義函數(shù)
linux中的shell同樣可以定義函數(shù),然后在函數(shù)中調(diào)用執(zhí)行相關(guān)的shell命令,完成功能,shell中的函數(shù)調(diào)用格式如下:
[ function ] funname [()]
{
action;
[return int;]
}
參數(shù)說(shuō)明:
fun () 表示有返回參數(shù)的函數(shù)(如同C語(yǔ)言中的有返回類型的函數(shù)(int,char等))fun() 表示無(wú)返回參數(shù)的函數(shù)(類似于C語(yǔ)言中的void類型函數(shù))使用可以返回參數(shù)值(一般為數(shù)值n),如果不使用,將默認(rèn)以最后一條命令運(yùn)行的結(jié)果作為返回值
#!/bin/bash
FunReturn(){
echo "兩個(gè)數(shù)字進(jìn)行相加運(yùn)算..."
echo "輸入第一個(gè)數(shù)字: "
read num
echo "輸入第二個(gè)數(shù)字: "
read anothernum
echo "兩個(gè)數(shù)字分別為 $num 和 $anothernum !"
return $(($num+$anothernum)) # 分別返回?cái)?shù)值
}
FunReturn # 調(diào)用函數(shù)
echo "輸入的兩個(gè)數(shù)字之和為 $? !" # 使用通配符獲取上一條指令的返回值
所有的函數(shù)在使用前必須定義,這是因?yàn)閟hell解釋器是順序逐層執(zhí)行的,當(dāng)shell解釋器發(fā)現(xiàn)定義的函數(shù)時(shí),才會(huì)找到其對(duì)應(yīng)的功能,進(jìn)而執(zhí)行
3.9.2 參數(shù)定義
此外想要使用shell函數(shù)傳遞參數(shù)時(shí),需要在函數(shù)體的內(nèi)部,通過(guò) $n 的形式來(lái)獲取參數(shù)的值,與其他語(yǔ)言不同的是,這不是在定義函數(shù)的時(shí)候就給定參數(shù),而是在函數(shù)體中獲取到的參數(shù),例如,$1表示第一個(gè)參數(shù),$2表示第二個(gè)參數(shù),參數(shù)調(diào)用列表如下
參數(shù)處理說(shuō)明
$#
傳遞到腳本或者函數(shù)的參數(shù)個(gè)數(shù)
$*
以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)
$$
腳本運(yùn)行時(shí)的當(dāng)前進(jìn)程ID號(hào)
$!
后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$@
與$*相同,但是加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)
$-
顯示shell使用的當(dāng)前選項(xiàng),與set命令功能相同
顯示最后命令退出的狀態(tài)。0表示沒(méi)有錯(cuò)誤,其他任何之表明錯(cuò)誤
shell編程實(shí)例
來(lái)自實(shí)驗(yàn)報(bào)告五
if分支
1、 判斷輸入文件的屬性
#!/bin/bash
clear
echo "input a file or directory name ,pls"
read path_name
if [ -d $path_name ] ##after [ should have space and before ] should have space
then
echo " $path_name is a directory"
elif [ -f $path_name ]
then
echo "$path_name is a regular file"
if [ -r $path_name ]
then
echo "$path_name is a readable file"
fi
if [ -w $path_name ]
then
echo " $path_name is a writeable file"
fi
if [ -x $path_name ]
then
echo " $path_name is a executeable file"
fi
else
echo "this script cannot get the file/directory( $path_name)information ! "
fi
2、 以shell命令的返回值作為判斷條件
# !/bin/bash
echo "input a directory"
read dir_name
if cd $dir_name > /dev/ null 2>&1
then
echo "enter directory : $dir_name succeed"
else
echo "enter directory: $dir_name failed"
fi
case分支
1、 根據(jù)選擇的模式,打印不同的回答
# !/bin/bash
clear
echo "Do you like Linux?"
read like_it
case $like_it in
y | Y | yes | Yes)
echo "Linux is a good friend of us."
;;
n | N| no | No)
echo "Try it, and you will like it . "
;;
* )
echo "your answer is: $like_it"
;;
esac
循環(huán)
for循環(huán)
1、循環(huán)輸出操作系統(tǒng)的名字
# !/bin/bash
clear
for os in Linux Windows UNIX MAC
do
echo "Operation System is : $os"
done
2、用命令行參數(shù)輸入操作系統(tǒng)的名字并輸出
#! /bin/bash
for os
do
echo "Operation System is: $os"
done
while循環(huán)
1、while循環(huán)輸出1-10
# !/bin/bash
clear
loop=0
while [ $loop -ne 10 ]
do
let loop=$loop+1
echo "current value of loop is : $loop"
done
until循環(huán)
until循環(huán)輸出1-10
# !/bin/bash
clear
loop=0
until [ $loop -eq 10 ]
do
let loop=$loop+1
echo "current value of loop is : $loop"
done
函數(shù)
1、參數(shù)的使用
# !/bin/bash
function demo_fun ( )
{
echo "Your command is: $0$*"
echo "Number of parameters ( \$#) is: $#"
echo "Parameters ( \$* ) is: $*"
echo "Parameters ( \$@) is: $@"
count=1
for param in $@
do
echo "Parameters ( \$$count) is: $param"
let count=$count+1
done
}
clear
demo_fun $@
2、shift的使用
# !/bin/bash
function function_shift ( )
{
echo "Your command is: $0$*"
echo "Number of parameters ( \$#) is: $#"
echo "Parameters ( \$* ) is: $*"
echo "Parameters ( \$@) is: $@"
count=1
while [ -n "$1" ]
do
echo "Parameters ( \$$count) is: $1"
let count=$count+1
shift
done
}
clear
function_shift $@
函數(shù)返回值
1、顯式返回
# !/bin/bash
function fun_return1 ( )
{
dir_name=$1
rtn_value=0
if ! cd $dir_name > /dev/ null 2>&1; then
rtn_value=1
fi
return $rtn_value
}
clear
if fun_return1 $@; then
echo "function executes sucessfully ! "
else
echo "function executes failed ! "
fi
2、隱式返回
#! /bin/bash
function fun_return2()
{
dir_name=$1
cd $dir_name > /dev/null 2>&1
return
}
clear
if fun_return2 $@; then
echo "function executes sucessfully!"
else
echo "function executes failed!"
fi
綜合運(yùn)用
1、 帶一個(gè)(目錄)參數(shù),可瀏覽目錄下的內(nèi)容。(lsdir.sh) 實(shí)現(xiàn)功能: (1)首先判斷(if)是否帶有參數(shù),若無(wú)則顯示(echo)用法信息后,報(bào)錯(cuò)返回(exit); (2)首先判斷該參數(shù)是不是目錄。若是則列目錄的內(nèi)容(ls)字符串實(shí)現(xiàn)簡(jiǎn)單的行編輯器,否則,提示用戶不是目錄,則顯示警告信息后報(bào)錯(cuò)返回。
運(yùn)行:設(shè)程序名為lsdir.sh,為其增加執(zhí)行權(quán)chmod 755 lsdir.sh
運(yùn)行: ./lsdir.sh ./lsdir.sh dir #如果dir是個(gè)目錄,則列其內(nèi)容 ./lsdir.sh file #若file是文件或不存在則給出警告后返回
#! /bin/bash
if [ $# -ne 1 ]
then
echo "Usage: $0 dir"
exit 1
fi
if [ -d "$1" ]
then
ls -l $1/*
exit 0
fi
echo "Warn: $1 is not a directory"
exit 2
2、只用嵌套結(jié)構(gòu)if-fi實(shí)現(xiàn)上述程序 (.sh)
#! /bin/bash
if [ $# -ne 1 ]
then
echo "Usage: $0 dir"
exit 1
elif [ -d "$1" ]
then
ls $1/*
exit 0
else
echo "Warn: $1 is not a directory"
exit 2
fi
3、帶數(shù)值參數(shù),并可計(jì)算這些數(shù)值參數(shù)之和(sum.sh)
#! /bin/bash
x=0
for y in $*
do
x=`expr $x + $y`
done
echo "The sum is: $x"
4、文件備份的shell程序
#! /bin/bash
LOG_START_TIME=`date+"%Y%m%d%H%M%S"`
BACKUP_DIR=~/Lesson10/backup
BACKUP_LOG="$BACKUP_DIR/${LOG_START_TIME}.log"
function write_log(){
log_time=`date+%Y-%m-%d-%H-%M-%s`
backup_file_name=$2
err_msg="$log_time ERROR in backup file/directory($backup_file_name)"
suc_msg="$log_time SUCCESS in backup file/directory($backup_file_name)"
if [ $1 -eq 0 ] ;then
echo $suc_msg
echo $suc_msg>>$BACKUP_LOG
else
echo $ess_msg
echo $err_msg>>$BACKUP_LOG
fi
}
function backup_file(){
cp -fi$1 $BACKUP_DIR> /dev/null 2>&1
write_log $?$1
}
function create_log_file(){
if [ ! -e $BACKUP_DIR ];then
mkdir -p $BACKUP_DIR
fi
if [ -e $BACKUP_LOG ] ;then
rm -rf $BACKUP_LOG
fi
touch $BACKUP_LOG
}
clear
echo "Backup Process Begins"
create_log_file
for file in $@
do
backup_file $file
done
echo "Backup Process ends"
5、計(jì)算前n個(gè)正整數(shù)的和(sum_n.sh)
#! /bin/bash
if [ $# -ne 1 ]
then S
echo "Usage: $0 n"
exit 1
fi
x=0
y=0
while true
do
x= 'expr $x + $y'
y= 'expr $y + 1'
if [ $y -gt $1 ]
then
break
fi
done
echo "1+2+.....+$1 = $x"
6、編寫(xiě)shell程序(.sh),在/home目錄下建立10個(gè)目錄,即user1~,并設(shè)置每個(gè)目錄的權(quán)限,其中:
(1) 文件所有者的權(quán)限為:讀、寫(xiě)、執(zhí)行
(2) 文件所有者所在組的權(quán)限為:讀、執(zhí)行
(3) 其他用戶的權(quán)限為:讀
#! /bin/sh
i=1
while [ $i -le 10 ]
do
if [ -d /home ];then
mkdir -p /home/user$i
chmod 754 /home/user$i
echo "user$i"
let "i=i+1"
else
mkdir /home
mkdir -p/home/user$i
chmod 754 /home/user$i
echo "user$i"
let "i=i+1"
fi
done
7、編寫(xiě)shell程序(.sh),在/home目錄下建立10個(gè)目錄(即user1~)自動(dòng)刪除,并顯示刪除信息
#! /bin/bash
i=1
while [ $i -le 10 ]
do
if [ -d /home/user$i ];then
rm -rf /home/user$i
echo "Directory /home/user$i deleted"
fi
let "i=i+1"
done
8、編寫(xiě)九九乘法表的shell程序(.sh)
#!/bin/bash
for ((i=1;i<=9;i++))
do
for ((j=1;j<=i;j++))
do
let "sum=i*j"
echo -n " $j*$i=$sum "
done
echo
done
9、在Linux中使用ls命令時(shí),不顯示統(tǒng)計(jì)信息。要求編寫(xiě)一個(gè)shell程序(.sh),能統(tǒng)計(jì)出當(dāng)前目錄中子目錄、文件數(shù)量
#!/bin/bash
fun_directory() {
let "filenum=0"
let "dirnum=0"
for i in $( ls )
do
if [ -d $i ]
then
let dirnum+=1
else
let filenum+=1
fi
done
echo "The number of directorys is $dirnum"
echo "The number of files is $filenum"
}
fun_directory
4. Linux概念辨析 4.1 Linux簡(jiǎn)答題題目(概念) Linux操作系統(tǒng)和系統(tǒng)的區(qū)別,優(yōu)越性技術(shù)概念,和虛擬機(jī)有什么區(qū)別shell編程求計(jì)算式表達(dá)上課的冒號(hào)、反引號(hào)、單引號(hào)、雙引號(hào)有什么區(qū)別Linux操作系統(tǒng)啟動(dòng)步驟:加載、引導(dǎo)配置文件名Linux有多少種運(yùn)行級(jí)別 4.2 題目解析
Linux概念來(lái)源
1、Linux操作系統(tǒng)和系統(tǒng)的區(qū)別,優(yōu)越性
Linux系統(tǒng)優(yōu)點(diǎn):
開(kāi)放性。Linux操作系統(tǒng)遵守GNU規(guī)范,代碼共享,易于實(shí)現(xiàn)系統(tǒng)的裁剪和客制化的開(kāi)發(fā)多用戶。系統(tǒng)資源可以被不同用戶以各自的權(quán)限訪問(wèn)使用,互不影響多任務(wù)和多線程。不同任務(wù)和線程幾乎同時(shí)并發(fā)處理獨(dú)立的但內(nèi)在關(guān)聯(lián)的一系列事件設(shè)備獨(dú)立性:Linux操作系統(tǒng)把外部設(shè)備統(tǒng)一當(dāng)做設(shè)備文件看待,只要安裝他們的驅(qū)動(dòng)程序,任何用戶都可以像使用普通文件一樣操縱、使用這些設(shè)備,而不必知道他們的具體存在形式。豐富的網(wǎng)絡(luò)功能:完善的內(nèi)置網(wǎng)絡(luò)是Linux的一大特點(diǎn)。
Linux系統(tǒng)缺點(diǎn):
無(wú)特定支持廠商:因?yàn)長(zhǎng)inux上面的軟件包括系統(tǒng)都是免費(fèi)發(fā)行的,所以不會(huì)有售后圖形界面不夠友好游戲支持度不足:在Linux上開(kāi)發(fā)的大型游戲幾乎沒(méi)有。
Linux系統(tǒng)和系統(tǒng)的區(qū)別:
開(kāi)放性。Linux系統(tǒng)開(kāi)放源碼系統(tǒng),可以對(duì)其程序進(jìn)行編輯修改。而微軟的系統(tǒng)受微軟版權(quán)保護(hù),只能微軟內(nèi)部進(jìn)行開(kāi)發(fā)以及修改。價(jià)格。Linux免費(fèi)送使用,而系統(tǒng)需要花錢購(gòu)買。文件格式不同。操作系統(tǒng)內(nèi)核是NT,而Linux是shell。硬盤(pán)格式文件是fat32或者NTSF,而Linux需要的文件格式是ext2或ext3,還多一個(gè)SWAP格式的交換分區(qū)。
2、技術(shù)概念,和虛擬機(jī)有什么區(qū)別
技術(shù)概念
是一個(gè)開(kāi)發(fā),運(yùn)輸和運(yùn)行應(yīng)用程序的開(kāi)放平臺(tái)。使您可以將應(yīng)用程序與基礎(chǔ)架構(gòu)分離,以便快速交付軟件。使用,您可以像管理應(yīng)用程序一樣管理基礎(chǔ)架構(gòu)。通過(guò)利用的方法快速發(fā)送,測(cè)試和部署代碼,您可以顯著減少編寫(xiě)代碼和在生產(chǎn)中運(yùn)行代碼之間的延遲。
鏡像:鏡像是我們把應(yīng)用程序和運(yùn)行環(huán)境打包在一起的文件,可以編寫(xiě) file來(lái)告訴如何把我們的環(huán)境和應(yīng)用打包在一起,形成一個(gè)鏡像文件。倉(cāng)庫(kù):倉(cāng)庫(kù)是一臺(tái)存放鏡像的服務(wù)器。可以將開(kāi)發(fā)好的鏡像上傳倉(cāng)庫(kù),也可以從倉(cāng)庫(kù)中拉取、分享鏡像。容器:是鏡像啟動(dòng)之后的實(shí)體。一個(gè)鏡像可以啟動(dòng)多個(gè)實(shí)體。
3、shell編程求計(jì)算式表達(dá)
雙尖括號(hào) (())
雙方括號(hào)**[[]]**,支持字符串模式匹配即正則表達(dá)式
老方法
1)執(zhí)行數(shù)學(xué)表達(dá)式 expr
expr 1+5
2)單方括號(hào)
$[ ]
4、shell編程中冒號(hào)、反引號(hào)、單引號(hào)、雙引號(hào)有什么區(qū)別
冒號(hào):
參數(shù)擴(kuò)展:
:abc=1234
echo $abc
清空文件
:>123.txt
腳本注釋、占位符:在編寫(xiě)腳本的過(guò)程中,某些語(yǔ)法需要多個(gè)組成部分,但開(kāi)始階段沒(méi)有想好,這樣就可用來(lái)做占位符,執(zhí)行起來(lái)就不會(huì)報(bào)錯(cuò)了。
反引號(hào):反引號(hào)內(nèi)作為一個(gè)系統(tǒng)命令并執(zhí)行
例:time=`date`
echo "Today is $time"
結(jié)果:Today is Thu Dec 8 02:00:48 PST 2016
echo $time
結(jié)果:Thu Dec 8 02:00:48 PST 2016
單引號(hào):所有轉(zhuǎn)移符全部關(guān)閉,完整的反映括號(hào)中的內(nèi)容
例:
name="user"
echo 'My name is $name'
結(jié)果: My name is $name
雙引號(hào):部分轉(zhuǎn)義符關(guān)閉,但某些則保留(如:$ )
例: name="user"
echo "My name is $name"
結(jié)果: My name is user
5、Linux操作系統(tǒng)啟動(dòng)步驟
內(nèi)核的引導(dǎo)。
當(dāng)計(jì)算機(jī)打開(kāi)電源后,首先是BIOS開(kāi)機(jī)自檢,按照BIOS中設(shè)置的啟動(dòng)設(shè)備(通常是硬盤(pán))來(lái)啟動(dòng)。
操作系統(tǒng)接管硬件以后,首先讀入 /boot 目錄下的內(nèi)核文件。
運(yùn)行 init。
init 進(jìn)程是系統(tǒng)所有進(jìn)程的起點(diǎn),你可以把它比擬成系統(tǒng)所有進(jìn)程的老祖宗,沒(méi)有這個(gè)進(jìn)程,系統(tǒng)中任何進(jìn)程都不會(huì)啟動(dòng)。
init 程序首先是需要讀取配置文件 /etc/。
系統(tǒng)初始化。
在init的配置文件中有這么一行: si:::/etc/rc.d/rc.它調(diào)用執(zhí)行了/etc/rc.d/rc.,而rc.是一個(gè)bash shell的腳本,它主要是完成一些系統(tǒng)初始化的工作,rc.是每一個(gè)運(yùn)行級(jí)別都要首先運(yùn)行的重要腳本。
它主要完成的工作有:激活交換分區(qū),檢查磁盤(pán),加載硬件模塊以及其它一些需要優(yōu)先執(zhí)行任務(wù)。
建立終端 。
rc執(zhí)行完畢后,返回init。這時(shí)基本系統(tǒng)環(huán)境已經(jīng)設(shè)置好了,各種守護(hù)進(jìn)程也已經(jīng)啟動(dòng)了。
init接下來(lái)會(huì)打開(kāi)6個(gè)終端,以便用戶登錄系統(tǒng)
用戶登錄系統(tǒng)。
用戶的登錄方式有三種:
6、配置文件名
httpd.conf,yum安裝后,配置文件httpd.conf存放在目錄/etc/httpd/conf下
7、Linux有多少種運(yùn)行級(jí)別
運(yùn)行級(jí)別0:系統(tǒng)停機(jī)狀態(tài),系統(tǒng)默認(rèn)運(yùn)行級(jí)別不能設(shè)為0,否則不能正常啟動(dòng)
運(yùn)行級(jí)別1:?jiǎn)斡脩艄ぷ鳡顟B(tài),root權(quán)限,用于系統(tǒng)維護(hù),禁止遠(yuǎn)程登陸
運(yùn)行級(jí)別2:多用戶狀態(tài)(沒(méi)有NFS)
運(yùn)行級(jí)別3:完全的多用戶狀態(tài)(有NFS),登陸后進(jìn)入控制臺(tái)命令行模式
運(yùn)行級(jí)別4:系統(tǒng)未使用,保留
運(yùn)行級(jí)別5:X11控制臺(tái),登陸后進(jìn)入圖形GUI模式
運(yùn)行級(jí)別6:系統(tǒng)正常關(guān)閉并重啟,默認(rèn)運(yùn)行級(jí)別不能設(shè)為6,否則不能正常啟動(dòng)