在linux系統中,我們一般都是用C語言寫服務端程序,但是一般我們不直接啟動這個程序,而是通過一個shell腳本啟動和關閉(需要設置一些環境變量和防止打開多個改程序,打開多個后需要找到pid才能關閉)
那么shell是什么呢?
說白了shell是操作系統提供給我們的一種語言,用來將用戶的命令輸送到內核中執行
shell編程
1首先我新建一個test2.sh,存放下面的一段shell代碼
2保存后,修改這個shell為可執行文件 chmod +x test2.sh
#! /bin/sh #定義變量 name=張三 echo $name echo "參數:$*" echo "參數個數$#"
輸出結果:

下面分別介紹字段的含義
第一行:一般默認第一行都是上面這段#! /bin/sh,通知系統用/bin/sh來執行下面的程序。
以“#”開頭的行代表注釋
echo代表輸出后面一段話的到用戶界面
$name代表使用了name這個變量(定義shell變量在下面介紹)
$* 代表所有的參數(我們在shell命令后面加了hello 和world兩個參數)
$#代表參數的個數
有了初步的認識,我們就開始踏入shell編程吧!
1shell變量
定義shell變量:(注意等號左邊右邊不可以有空格)
shellname=value
使用shell變量
$shellname
2$數字
代表第幾個參數
例如$1代表第一個參數,按照上面的代碼就是hello
還有下面的一些$符號的使用。

可能會對$?有一點費解,例如我們在shell中調用了一個C語言程序mydemo,其中mydemo這個主函數會返回100(這里不寫c代碼了)
#! /bin/sh ./mydemo echo $?
shell輸出值:100
也可以是執行一段shell函數,獲取該函數的返回值(最后講函數說到)
3shell中執行命令
如果我們想在shell中執行一段命令,並將該命令的值存放到一個變量中,就要用到` `符號(在1數字旁邊)
#! /bin/sh result=`ls` echo result=$result
ls命令顯示當前文件夾下有哪些文件
輸出結果:result=test.sh ...
4讀取鍵盤
我們在運行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等計算
if語句(兩種)
(一)第一種if(用來判斷條件是否正確)
格式:(fi代表這個if結束)
if (test condition) then commands else commands fi
#! /bin/sh if (test "start" = "${1}" ) then echo "start" else echo "end" fi

(二)第二種if(用來判斷文件或者文件夾是否存在)
格式:
if [ -option file]; then commands else commands fi
代碼:
#! /bin/sh if [ -d "${1}" ]; then echo exist else echo notexist fi
運行

查看dir1文件夾是否存在,因為我創建了一個,所以是存在的。
其中還有一些其他選項

while循環
代碼格式:([右邊和]左邊都要有一個空格哦,done代表循環結束,當條件不成立時候循環結束)
while [ expr ]; do commands done
代碼demo(大家可以自己驗證哈)
#! /bin/sh tmp=0 while [ "$tmp" != "5" ]; do echo "curtmp=$tmp" tmp=$[ $tmp + 1 ] done
case分支語句
同樣也支持像switch那樣的分支選擇語句的
代碼格式:(如果有一個pattern匹配到跟string內容一樣,執行這里面的內容,否則執行最下面的*分支,;;兩個分號代表退出case循環,跟C語言的break)
case "string" in pattern_1) commands ;; pattern_2) commands ;; *) commands ;; esac
for循環
代碼格式:(會遍歷這個list數組,將當前值存放到varname變量中,后面的分號也是必不可少的哦
for varname in list ; do commands done
#! /bin/sh for name in $*; do echo "$name" done
exit語句
exit code
函數
shell同樣也是支持函數的哈function funcname
{
commands
}
#! /bin/sh function fun1 { echo "第一個參數:$1" echo "第二個參數: $2" return 100 } fun1 3 4 echo "函數返回值:$?"
總結demo
#! /bin/sh me=`whoami` PID=`ps -u $me |grep mydemo|awk {'print $1'}` if( test "$PID" = "" ) then `mydemo` fi
