實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令并且把它們送到內核。不僅如此,Shell有自己的編程語言用于對命令的編輯,它允許用戶編寫由shell命令組成的程序。Shell編程語言具有普通編程語言的很多特點,比如它也有循環結構和分支控制結構等,用這種編程語言編寫的Shell程序與其他應用程序具有同樣的效果。
引言
SHELL在處理一些問題的時候有得天獨厚的優勢,快捷方便,學會了還可以顯擺顯擺,當然了,shell的語法有點坑爹,沒有系統的學過,只能一點一點的積累。
今天這個是在實現一個刷新數據庫數據的腳本的時候碰到的一些知識點,刷新的時候用到了正則匹配、數學運算、比較等等。
shell中的數組
數組的定義
- arr=(1 2 3 4 5)
- arr=(燕睿濤 yrt lulu yanruitao)
- arr=('^[0-9]+$' '^yrt/.(/d+)/.log$')
- arr=(
- "燕睿濤" /
- "yanruitao" /
- "today is a good day!"
- )
數組的使用
- len=${#arr[@]} #返回的是數組元素的個數
- echo ${arr[0]} #數組中的第一個元素,這個和其他語言的數組類似,下表從0開始
- echo ${arr[2]} #數組中的第3個元素
實際的例子
- [yanruitao@boss_runtime sh]$ arr=(
- > "燕睿濤"
- > "http:////www/.baidu/.com//(/d+)/.html"
- > "yanruitao"
- > "lulu"
- > "yrt"
- > )
- [yanruitao@boss_runtime sh]$ echo ${#arr[@]}
- 5
- [yanruitao@boss_runtime sh]$ echo ${arr[1]}
- http:////www/.baidu/.com//(/d+)/.html
- [yanruitao@boss_runtime sh]$ echo ${arr[0]}
- 燕睿濤
- [yanruitao@boss_runtime sh]$ echo ${arr[5]}
- [yanruitao@boss_runtime sh]$
shell中的大小比較
- #第一種(())
- if((6 <8)); then echo "yes 燕睿濤"; fi #輸出——yes 燕睿濤
- if(($a>8)); then echo "yes 燕睿濤"; fi
- if(($a<=$b)); then echo "yes 燕睿濤"; fi
- #第二種[] [[]]
- if [ 2 -gt 1 ]; then echo "iforever 燕睿濤"; fi
- if [[ 'abc' > 'ab' ]]; then echo "iforever 燕睿濤"; fi #iforever 燕睿濤
- if [[ 2 < 10 ]]; then echo "iforever 燕睿濤"; fi #無輸出
- if [[ 2 -lt 10 ]]; then echo "iforever 燕睿濤"; fi #iforever 燕睿濤
可以看到上面這幾種還是有些規律的:
雙小括號[(())]里面是可以直接使用大于小于號進行比較(>、<、<=、>=),而且不需要“坑爹”的空格,用于數學計算
單中括號([])里面比較必須使用-gt、-lt、-ne、-eq這些運算符,而且必須要有嚴格的空格要求
雙中括號([[]])里面比較可以使用>、<、-gt、-lt......這兩種格式,但是還是必須要有嚴格的空格要求,而且雙中括號中的>、<對類似于字符串的比較,所以在使用的時候需要注意
shell中的括號
- #看看小括號的用法,首先是在for循環里面,相當于還是數學計算
- [yanruitao@boss_runtime ad]$ for((a=0;a<10;a++))
- > do
- > echo $a
- > done
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- #對變量進行++,還是相當于數序運算
- [yanruitao@boss_runtime ad]$ i=1
- [yanruitao@boss_runtime ad]$ echo $i
- 1
- [yanruitao@boss_runtime ad]$ let i++
- [yanruitao@boss_runtime ad]$ echo $i
- 2
- [yanruitao@boss_runtime ad]$ ((i++))
- [yanruitao@boss_runtime ad]$ echo $i
- 3
- #數學運算
- [yanruitao@boss_runtime ad]$ echo 1+2
- 1+2
- [yanruitao@boss_runtime ad]$ echo $((1+2))
- 3
- #單括號里面是一個命令組,括號中的命令將會新開一個shell順序執行,所以這個里面相當于一個封閉的空間,里面的變量什么的不能被剩余代碼使用
- [yanruitao@boss_runtime ad]$ a=1
- [yanruitao@boss_runtime ad]$ (a=3;echo $a)
- 3
- [yanruitao@boss_runtime ad]$ echo $a
- 1
- #括號中and的使用
- if [[ -n "$ret" && $ret -gt 123 ]]... #[[]]雙中括號中只能使用&&,不能使用-a
- if [ -n "$ret" -a $ret -gt 123 ]... #[]單中括號中只能使用-a,不能使用&&
- if(($ret)) && (($ret >123 ))... #(())雙小括號使用&&
shell中函數的定義
- function getId()
- {
- local url=$1 #local限定了變量url的作用域只在函數里面,不然會污染全局的作用域
- ereg="http:////www/.baidu/.com///([0-9]/+/)/.html"
- local ret=$(expr $url : $ereg)
- if [[ -n "$ret" && $ret -gt 0 ]]; then #當ret為null時使用[]會報錯,-n這里的雙引號一定要加上,不然當$ret為null時,一直返回真
- echo $ret
- return 0
- fi
- return 1
- }
- [yanruitao@boss_runtime sh]$ echo $?
- 0
- [yanruitao@boss_runtime sh]$ getId "http://www.baidu.com/123.htl"
- [yanruitao@boss_runtime sh]$ echo $?
- 1
- [yanruitao@boss_runtime sh]$ getId "http://www.baidu.com/123.html"
- 123
- [yanruitao@boss_runtime sh]$ echo $?
- 0
函數的整體形式如上面的例子,這里面注意兩點:
首先就是返回值,通過return的返回值只能是整數,并且在調用完成之后使用echo $?可以查看返回值。
要使用賦值的形式需要有echo,就像ret=$(getId "http://www.baidu.com.1234.html"),只有echo的值會傳遞給ret變量。
雜項知識點
字符串轉數組
- [yanruitao@boss_runtime sh]$ str="燕睿濤 lulu yrt yanruitao"
- [yanruitao@boss_runtime sh]$ arr=($str) #這一步將字符串轉化為了數組
- [yanruitao@boss_runtime sh]$ echo ${arr[*]}
- 燕睿濤 lulu yrt yanruitao
- [yanruitao@boss_runtime sh]$ echo ${#arr[@]}
- 4
常用判斷標志
[ -z STRING ] “STRING” 的長度為零則為真。
[ -n STRING ] or [ STRING ] “STRING” 的長度為非零 non-zero則為真。
[ -d FILE ] 如果 FILE 存在且是一個目錄則為真。
[ -a FILE ] 如果 FILE 存在則為真。
linux后臺運行相關
- & #在一個命令的最后加上這個命令,可以將該命令放到后臺執行
- ./update.sh 100 500 &
- ctrl + z #講一個正在前臺執行的命令放到后臺,并且處于暫停狀態
- jobs #查看當前后臺運行的命令
- jobs -l #可以顯示所有后臺任務的PID
- [yanruitao@boss_runtime sh]$ jobs -l
- [1] 9681 Running ./t.sh 100 300 &
- [2] 9683 Running ./t.sh 100 300 &
- [3]- 9685 Running ./t.sh 100 300 &
- [4]+ 9688 Running ./t.sh 100 300 &
- fg #把后臺中的命令調至前臺繼續運行,如果后臺有多個命令可以使用`fg %jobnumber`將選中命令調出
- [yanruitao@boss_runtime sh]$ jobs -l
- [2] 10033 Running ./t.sh 100 300 &
- [3] 10035 Running ./t.sh 100 300 &
- [4]- 10037 Running ./t.sh 100 300 &
- [5]+ 10039 Running ./t.sh 100 300 &
- [yanruitao@boss_runtime sh]$ fg %2
- ./t.sh 100 300
- bg #講一個在后臺暫停的命令變成在后臺繼續執行。同樣,如果有多個命令,可以使用bg %jobnumber
- [yanruitao@boss_runtime sh]$ jobs -l
- [1]- 11655 Running ./t.sh 100 300 &
- [2]+ 11662 Running ./t.sh 100 300 &
- [yanruitao@boss_runtime sh]$ fg %1
- ./t.sh 100 300
- ^Z
- [1]+ Stopped ./t.sh 100 300
- [yanruitao@boss_runtime sh]$ jobs -l
- [1]+ 11655 Stopped ./t.sh 100 300
- [2]- 11662 Running ./t.sh 100 300 &
- [yanruitao@boss_runtime sh]$ bg %1
- [1]+ ./t.sh 100 300 &
- [yanruitao@boss_runtime sh]$ jobs -l
- [1]- 11655 Running ./t.sh 100 300 &
- [2]+ 11662 Running ./t.sh 100 300 &
- kill #終止進程
- kill %num #通過jobs查看的job號,進行殺死
- kill pid #通過進程號殺掉進程
- ctrl + C #終止當前前臺的進程
以上所述就是本文的全部內容了,希望能夠對大家熟悉Linux shell命令有所幫助。
新聞熱點
疑難解答