在linux系統中,咱們通常都是用C語言寫服務端程序,可是通常咱們不直接啓動這個程序,而是經過一個shell腳本啓動和關閉(須要設置一些環境變量和防止打開多個改程序,打開多個後須要找到pid才能關閉)linux
那麼shell是什麼呢?shell
說白了shell是操做系統提供給咱們的一種語言,用來將用戶的命令輸送到內核中執行編程
1首先我新建一個test2.sh,存放下面的一段shell代碼數組
2保存後,修改這個shell爲可執行文件 chmod +x test2.sh函數
#! /bin/sh #定義變量 name=張三 echo $name echo "參數:$*" echo "參數個數$#"
輸出結果:ui
下面分別介紹字段的含義spa
第一行:通常默認第一行都是上面這段#! /bin/sh,通知系統用/bin/sh來執行下面的程序。操作系統
以「#」開頭的行表明註釋3d
echo表明輸出後面一段話的到用戶界面code
$name表明使用了name這個變量(定義shell變量在下面介紹)
$* 表明全部的參數(咱們在shell命令後面加了hello 和world兩個參數)
$#表明參數的個數
有了初步的認識,咱們就開始踏入shell編程吧!
定義shell變量:(注意等號左邊右邊不能夠有空格)
shellname=value
使用shell變量
$shellname
表明第幾個參數
例如$1表明第一個參數,按照上面的代碼就是hello
還有下面的一些$符號的使用。
可能會對$?有一點費解,例如咱們在shell中調用了一個C語言程序mydemo,其中mydemo這個主函數會返回100(這裏不寫c代碼了)
#! /bin/sh ./mydemo echo $?
shell輸出值:100
也能夠是執行一段shell函數,獲取該函數的返回值(最後講函數說到)
若是咱們想在shell中執行一段命令,並將該命令的值存放到一個變量中,就要用到` `符號(在1數字旁邊)
#! /bin/sh result=`ls` echo result=$result
ls命令顯示當前文件夾下有哪些文件
輸出結果:result=test.sh ...
咱們在運行shell的時候,可能須要咱們輸入一些數據,除了帶參數的方式咱們還可使用read進行讀
#! /bin/sh echo "please enter a" read a echo "please enter b" read b echo "a=$a,b=$b"
輸出結果:
read命令讀取一個輸入行,直至遇到換行符。
行尾的換行符在讀入時將被轉換成一個空字符
若是read命令後有變量名,輸入內容賦給該變量。
若是read命令後未跟變量名,讀入的行將被賦值給內置變量REPLY。
shell也會像高級語言支持if,while等計算
格式:(fi表明這個if結束)
if (test condition) then commands else commands fi
#! /bin/sh if (test "start" = "${1}" ) then echo "start" else echo "end" fi
格式:
if [ -option file]; then commands else commands fi
代碼:
#! /bin/sh if [ -d "${1}" ]; then echo exist else echo notexist fi
運行
查看dir1文件夾是否存在,由於我建立了一個,因此是存在的。
其中還有一些其餘選項
代碼格式:([右邊和]左邊都要有一個空格哦,done表明循環結束,當條件不成立時候循環結束)
while [ expr ]; do commands done
代碼demo(你們能夠本身驗證哈)
#! /bin/sh tmp=0 while [ "$tmp" != "5" ]; do echo "curtmp=$tmp" tmp=$[ $tmp + 1 ] done
一樣也支持像switch那樣的分支選擇語句的
代碼格式:(若是有一個pattern匹配到跟string內容同樣,執行這裏面的內容,不然執行最下面的*分支,;;兩個分號表明退出case循環,跟C語言的break)
case "string" in pattern_1) commands ;; pattern_2) commands ;; *) commands ;; esac
代碼格式:(會遍歷這個list數組,將當前值存放到varname變量中,後面的分號也是必不可少的哦
for varname in list ; do commands done
#! /bin/sh for name in $*; do echo "$name" done
exit code
function funcname
{
commands
}
#! /bin/sh function fun1 { echo "第一個參數:$1" echo "第二個參數: $2" return 100 } fun1 3 4 echo "函數返回值:$?"
#! /bin/sh me=`whoami` PID=`ps -u $me |grep mydemo|awk {'print $1'}` if( test "$PID" = "" ) then `mydemo` fi