Linux Shell編程

在linux系統中,咱們通常都是用C語言寫服務端程序,可是通常咱們不直接啓動這個程序,而是經過一個shell腳本啓動和關閉(須要設置一些環境變量和防止打開多個改程序,打開多個後須要找到pid才能關閉)linux

 

那麼shell是什麼呢?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編程吧!

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
test是一個固定關鍵字,用來判斷condition的描述是否正確
#! /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
代碼demo
#! /bin/sh
for name in $*;
do
        echo "$name"
done
上面的代碼會輸出全部的參數。

exit語句

跟C語言的exit很相似,表明退出當前shell
代碼格式:(code表明退出碼)
exit code
能夠在一個Ashell中調用另外一個Bshell,能夠在Ashell經過$?獲得Bshellexit退出嗎

函數

shell一樣也是支持函數的哈
代碼格式:(使用前必須先定義函數)
function funcname
{
  commands
}
代碼demo:
#! /bin/sh
function fun1
{
        echo "第一個參數:$1"
        echo "第二個參數: $2"
        return 100
}
fun1 3 4
echo "函數返回值:$?"
上面代碼輸出什麼你們應該知道了。能夠再驗證一下

總結demo

 最後寫一個demo,表明打開某個進程(若是已經打開就再也不重複打開)
 #! /bin/sh
me=`whoami`
PID=`ps -u $me |grep mydemo|awk {'print $1'}`
if( test "$PID" = "" ) then
        `mydemo`
fi
PID的變量用來獲取mydemo的pid值
grep表明搜索mydemo這個進程
awd標識輸出這一行的第一列,也就是pid的值
你們能夠了解一下ps,grep,awk命令哈
相關文章
相關標籤/搜索