小編給大家分享一下Linux shell知識點(diǎn)有哪些,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)公司是專業(yè)的鄄城網(wǎng)站建設(shè)公司,鄄城接單;提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行鄄城網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
入?yún)⒑湍J(rèn)變量
對于shell腳本而言,有些內(nèi)容是專門用于處理參數(shù)的,它們都有特定的含義,例如:
/home/shouwang/test.sh para1 para2 para3 $0 $1 $2 $3 腳本名 ***個(gè)參數(shù) 第三個(gè)參數(shù)
其中$0代表了執(zhí)行的腳本名,$1,$2分別代表了***個(gè),第二個(gè)參數(shù)。除此之外,還有一些其他的默認(rèn)變量,例如:
# 代表腳本后面跟的參數(shù)個(gè)數(shù),前面的例子中有3個(gè)參數(shù) $@ 代表了所有參數(shù),并且可以被遍歷 $* 代表了所有參數(shù),且作為整體,和$*很像,但是有區(qū)別 $$ 代表了當(dāng)前腳本的進(jìn)程ID $? 代表了上一條命令的退出狀態(tài)
變量
給變量賦值,使用等號即可,但是等號兩邊千萬不要有空格,等號右邊有空格的字符串也必須用引號引起來:
para1="hello world" #字符串直接賦給變量para1
unset用于取消變量。例如:
unset para1
如何使用變量呢?使用變量時(shí),需要在變量前加$,例如要打印前面para1的內(nèi)容:
echo "para1 is $para1" #將會(huì)輸出 para1 is hello world
或者變量名兩邊添加大括號:
echo "para1 is ${para1}!" #將會(huì)輸出 para1 is hello world!
命令執(zhí)行
在shell中執(zhí)行命令通常只需要像在終端一樣執(zhí)行命令即可,不過,如果想要命令結(jié)果打印出來的時(shí)候,這樣的方式就行不通了。因此,shell的命令方式常有:
a=`ls` #`是左上角~鍵,不是單引號
或者使用$,后面括號內(nèi)是執(zhí)行的命令:
echo "current path is $(pwd)" #
另外,前面兩種方式對于計(jì)算表達(dá)式也是行不通的,而要采取下面的方式:
echo "1+1=$((1+1))" #打?。?+1=2
即$后面用兩重括號將要計(jì)算的表達(dá)式包裹起來。
那如果要執(zhí)行的命令存儲在變量中呢?前面的方法都不可行了,當(dāng)然括號內(nèi)的內(nèi)容被當(dāng)成命令執(zhí)行還是成立的。要使用下面的方式,例如:
a="ls" echo "$($a)"
但是如果字符串時(shí)多條命令的時(shí)候,上面的方式又不可行了,而要采用下面的方式:
a="ls;pwd" echo "$(eval $a)"v
這是使用了eval,將a的內(nèi)容都作為命令來執(zhí)行。
條件分支
一般說明,如果命令執(zhí)行成功,則其返回值為0,否則為非0,因此,可以通過下面的方式判斷上條命令的執(zhí)行結(jié)果:
if [ $? -eq 0 ] then echo "success" elif [ $? -eq 1 ] then echo "failed,code is 1" else echo "other code" fi
case語句使用方法如下:
name="aa" case $name in "aa") echo "name is $name" ;; "") echo "name is empty" ;; "bb") echo "name is $name" ;; *) echo "other name" ;; esac
初學(xué)者特別需要注意以下幾點(diǎn):
[]前面要有空格,它里面是邏輯表達(dá)式
if elif后面要跟then,然后才是要執(zhí)行的語句
如果想打印上一條命令的執(zhí)行結(jié)果,***的做法是將 $?賦給一個(gè)變量,因?yàn)橐坏﹫?zhí)行了一條命令,$?的值就可能會(huì)變。
case每個(gè)分支***以兩個(gè)分號結(jié)尾,***是case反過來寫,即esac。
多個(gè)條件如何使用呢,兩種方式,方式一:
if [ 10 -gt 5 -o 10 -gt 4 ];then echo "10>5 or 10 >4" fi
方式二:
if [ 10 -gt 5 ] || [ 10 -gt 4 ];then echo "10>5 or 10 >4" fi
其中-o或者||表示或。這里也有一些常見的條件判定。
總結(jié)如下:
o or 或者,同||
-a and 與,同&&
! 非
整數(shù)判斷:
-eq 兩數(shù)是否相等
-ne 兩數(shù)是否不等
-gt 前者是否大于后者(greater then)
-lt 前面是否小于后者(less than)
-ge 前者是否大于等于后者(greater then or equal)
-le 前者是否小于等于后者(less than or equal)
字符串判斷str1 exp str2:
-z "$str1" str1是否為空字符串
-n "$str1" str1是否不是空字符串
"$str1" == "$str2" str1是否與str2相等
"$str1" != "$str2" str1是否與str2不等
"$str1" =~ "str2" str1是否包含str2
特別注意,字符串變量***用引號引起來,因?yàn)橐坏┳址杏锌崭?,這個(gè)表達(dá)式就錯(cuò)了,有興趣的可以嘗試當(dāng)str1="hello world",而str2="hello"的時(shí)候進(jìn)行比較。
文件目錄判斷:filename
-f $filename 是否為文件
-e $filename 是否存在
-d $filename 是否為目錄
-s $filename 文件存在且不為空
! -s $filename 文件是否為空
循環(huán)
循環(huán)形式一,和Python的for in很像:
#遍歷輸出腳本的參數(shù) for i in $@; do echo $i done
循環(huán)形式二,和C語言風(fēng)格很像:
for ((i = 0 ; i < 10 ; i++)); do echo $i done
循環(huán)打印0到9。
循環(huán)形式三:
for i in {1..5}; do echo "Welcome $i" done
循環(huán)打印1到5。
循環(huán)方式四:
while [ "$ans" != "yes" ] do read -p "please input yes to exit loop:" ans done
只有當(dāng)輸入yes時(shí),循環(huán)才會(huì)退出。即條件滿足時(shí),就進(jìn)行循環(huán)。
循環(huán)方式五:
ans=yes until [ $ans != "yes" ] do read -p "please input yes to exit loop:" ans done
這里表示,只有當(dāng)ans不是yes時(shí),循環(huán)就終止。
循環(huán)方式六:
for i in {5..15..3}; do echo "number is $i" done
每隔5打印一次,即打印5,8,11,14。
函數(shù)
定義函數(shù)方式如下:
myfunc() { echo "hello world $1" }
或者:
function myfunc() { echo "hello world $1" }
函數(shù)調(diào)用:
para1="shouwang" myfunc $para1
返回值
通常函數(shù)的return返回值只支持0-255,因此想要獲得返回值,可以通過下面的方式。
function myfunc() { local myresult='some value' echo $myresult } val=$(myfunc) #val的值為some value
通過return的方式適用于判斷函數(shù)的執(zhí)行是否成功:
function myfunc() { #do something return 0 } if myfunc;then echo "success" else echo "failed" fi
注釋
shell通過#來注釋一行內(nèi)容,前面我們已經(jīng)看到過了:
#!/bin/bash # 這是一行注釋 :' 這是 多行 注釋 ' ls :<日志保存
腳本執(zhí)行后免不了要記錄日志,最常用的方法就是重定向。以下面的腳本為例:
#!/bin/bash #test.sh lll #這個(gè)命令是沒有的,因此會(huì)報(bào)錯(cuò) date方式一,將標(biāo)準(zhǔn)輸出保存到文件中,打印標(biāo)準(zhǔn)錯(cuò)誤:
./test.sh > log.dat這種情況下,如果命令執(zhí)行出錯(cuò),錯(cuò)誤將會(huì)打印到控制臺。所以如果你在程序中調(diào)用,這樣將不會(huì)講錯(cuò)誤信息保存在日志中。
方式二,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都保存到日志文件中:
./test.sh > log.dat 2>&12>&1的含義可以參考《如何理解linuxshell中的2>&1》
方式三,保存日志文件的同時(shí),也輸出到控制臺:
./test.sh |tee log.dat腳本執(zhí)行
最常見的執(zhí)行方式前面已經(jīng)看到了:
./test.sh其它執(zhí)行方式:
sh test.sh #在子進(jìn)程中執(zhí)行 sh -x test.sh #會(huì)在終端打印執(zhí)行到命令,適合調(diào)試 source test.sh #test.sh在父進(jìn)程中執(zhí)行 . test.sh #不需要賦予執(zhí)行權(quán)限,臨時(shí)執(zhí)行腳本退出碼
很多時(shí)候我們需要獲取腳本的執(zhí)行結(jié)果,即退出狀態(tài),通常0表示執(zhí)行成功,而非0表示失敗。為了獲得退出碼,我們需要使用exit。例如:
#!/bin/bash function myfun() { if [ $# -lt 2 ] then echo "para num error" exit 1 fi echo "ok" exit 2 } if [ $# -lt 1 ] then echo "para num error" exit 1 fi returnVal=`myfun aa` echo "end shell" exit 0這里需要特別注意的一點(diǎn)是,使用
returnVal=`myfun aa`這樣的句子執(zhí)行函數(shù),即便函數(shù)里面有exit,它也不會(huì)退出腳本執(zhí)行,而只是會(huì)退出該函數(shù),這是因?yàn)閑xit是退出當(dāng)前進(jìn)程,而這種方式執(zhí)行函數(shù),相當(dāng)于fork了一個(gè)子進(jìn)程,因此不會(huì)退出當(dāng)前腳本。最終結(jié)果就會(huì)看到,無論你的函數(shù)參數(shù)是什么***end shell都會(huì)打印。
./test.sh;echo $? 0看完了這篇文章,相信你對“Linux shell知識點(diǎn)有哪些”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
當(dāng)前題目:Linuxshell知識點(diǎn)有哪些
分享地址:http://weahome.cn/article/goojdd.html