Linux Shell編程


在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
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命令哈

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM