在linux系統中,我們一般都是用c語言寫服務端程式,但是一般我們不直接啟動這個程式,而是通過乙個shell指令碼啟動和關閉(需要設定一些環境變數和防止開啟多個改程式,開啟多個後需要找到pid才能關閉)
那麼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程式設計吧!
定義shell變數:(注意等號左邊右邊不可以有空格)
shellname=value
使用shell變數
$shellname
代表第幾個引數
例如$1代表第乙個引數,按照上面的**就是hello
還有下面的一些$符號的使用。
可能會對$?有一點費解,例如我們在shell中呼叫了乙個c語言程式mydemo,其中mydemo這個主函式會返回100(這裡不寫c**了)
#! /bin/shshell輸出值:100./mydemo
echo $?
也可以是執行一段shell函式,獲取該函式的返回值(最後講函式說到)
如果我們想在shell中執行一段命令,並將該命令的值存放到乙個變數中,就要用到` `符號(在1數字旁邊)
#! /bin/shls命令顯示當前資料夾下有哪些檔案result=`ls`
echo result=$result
輸出結果: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結束)
iftest是乙個固定關鍵字,用來判斷condition的描述是否正確(test condition) then
commands
else
commands
fi
#! /bin/sh執行結果:if (test "
start
" = "$"
) then
echo
"start
"else
echo
"end
"fi
格式:
if [ -option file]; then**:commands
else
commands
fi
#! /bin/sh執行if [ -d "$"
]; then
echo exist
else
echo notexist
fi
檢視dir1資料夾是否存在,因為我建立了乙個,所以是存在的。
其中還有一些其他選項
**格式:([右邊和]左邊都要有乙個空格哦,done代表迴圈結束,當條件不成立時候迴圈結束)
while**demo(大家可以自己驗證哈)[ expr ];
docommands
done
#! /bin/sh同樣也支援像switch那樣的分支選擇語句的tmp=0
while [ "
$tmp
" != "5"
];do
echo
"curtmp=$tmp
"tmp=$[ $tmp + 1
]done
**格式:(如果有乙個pattern匹配到跟string內容一樣,執行這裡面的內容,否則執行最下面的*分支,;;兩個分號代表退出case迴圈,跟c語言的break)
case**格式:(會遍歷這個list陣列,將當前值存放到varname變數中,後面的分號也是必不可少的哦"string"in
pattern_1)
commands
;;pattern_2)
commands
;;*)
commands
;;esac
for varname in**demolist ;
docommands
done
#! /bin/sh上面的**會輸出所有的引數。for name in $*;
doecho
"$name
"done
跟c語言的exit很類似,代表退出當前shell
**格式:(code代表退出碼)
exit code可以在乙個ashell中呼叫另乙個bshell,可以在ashell通過$?得到bshellexit退出嗎
shell同樣也是支援函式的哈
**格式:(使用前必須先定義函式)
function funcname**demo:
#! /bin/sh上面**輸出什麼大家應該知道了。可以再驗證一下function fun1
fun1 34
echo
"函式返回值:$?
"
最後寫乙個demo,代表開啟某個程序(如果已經開啟就不再重複開啟)
#! /bin/shpid的變數用來獲取mydemo的pid值,me=`whoami`
pid=`ps -u $me |grep mydemo|awk `
if( test "
$pid
" = ""
) then
`mydemo`
fi
grep代表搜尋mydemo這個程序
awd標識輸出這一行的第一列,也就是pid的值
大家可以了解一下ps,grep,awk命令哈
linux shell 程式設計
bin bash comments your commands go here 首行中的符號 告訴系統其後路徑所指定的程式bash即是解釋此指令碼檔案的shell程式。除第一行外,以 開頭的行就是注釋行,直到此行的結束。如果一行未完成,可以在行尾加上 這個符號表明下一行與此行會合併為同一行。有環境變...
linux shell 程式設計
1 程式設計入門 shell的簡介。從程式設計師的角度來看,shell本身是一種用c語言編寫的程式,從使用者的角度來看,shell是使用者與linux作業系統溝通的橋梁。使用者既可以輸入命令執行,又可以利用 shell指令碼程式設計,完成更加複雜的操作。在linux gui日益完善的今天,在系統管理...
Linux Shell 程式設計
檔案描述 shell 代號 dev stdin 標準輸入,一般指的是鍵盤輸入 dev stdout 標準輸出,一般指終端顯示器 dev stderr 標準錯誤,一般指終端顯示器 l輸出重定向 l輸入重定向 l追加重定向 l錯誤重定向 2 l輸出和錯誤同時重定向 應用例子 1.將 ls的結果輸出到檔案...