Shell是一門批處理腳本編程語言。java
批處理是什麼?linux
操做系統都分爲(GUI)圖形界面,命令界面(command)。shell
命令操做的能夠不用一一條執行。能夠組命令同時執行。咱們將多條命令同時執行的操做稱爲批處理。數據庫
什麼是腳本編程語言。express
--JavaScript腳本語言。必須須要依賴瀏覽器才能夠執行。因此瀏覽器就是JavaScript的宿主程序。apache
--SQL腳本語言,必須須要數據庫啓動了才能夠執行,SQL語言的宿主是數據庫編程
--Shell腳本語言,必須依賴linux的系統。linux系統就是它宿主程序。windows
shell腳本,是批處理的程序,因此也可使用任何的linux命令瀏覽器
shell腳本,是一門腳本語言,因此它不須要編譯直接執行tomcat
shell腳本是一門編程語言,必須符合編寫語言的特徵。變量,常量,標識符,註釋,判斷,循環
問題:linux是有多種shell的語言的。如,bash shell csh 等。爲何有多種?
答:緣由是linux是一個開源的操做系統。不一樣的人均可以對它進行制定。功能穩定後能夠提交合併到主核中。
#!/bin/bash ##指定使用的shell是bash shell
##輸出hello world echo 「hello world」
##這是一行註釋 |
bash shell的註釋是使用#,但咱們建議使用##號。
需求:使用root,在~目錄的shell文件裏面,建立一個 demo.sh 的shell腳本。輸出hello world
變量分爲系統變量與用戶自定義變量。
所謂的系統變量就Linux系統自帶的變量。
|
如:$PWD,$USER這種Linux系統自帶的變量,咱們稱爲系統變量。以及咱們在profile設置的變量。
需求:輸出系統變量PWD
使用 echo $PWD。
訪問變量使用$訪問,無論是系統變量函數,用戶自定義變量。
變量=值 (例如STR=abc)
等號兩側不能有空格
變量名稱通常習慣爲大寫(無論學任何編程語言,保持語法風格和API的一致)
使用變量: $STR
注意:若是值是有空格等特殊字符串,必須有使用雙引號或者單引號。
雙引號僅將空格脫意,
單引號會將變量引用好比$param脫意
使用命令 a=aaa 2.設置變量 b= 「$a bbb」 --僅將空格脫意的意思是指,除了空格字符串輸出,其餘的有特殊含義的字符仍是轉義輸出的
3.若是設置的變量b = ‘$a bbb’ --變量引用脫意,全部的空格以及引用都字符串輸出
|
當前shell有效的變量,當前shell文件內部調用
不加 export的變量就是當前shell有效的變量,若是在一個shell腳本里面
聲明一個STR=aaa,子shell腳本不能夠調用該變量!!
若是加一個shell腳本里面聲明的變量使用了export。表示全局變量,子shell腳本能夠調用。
--編寫一個demo-03.sh
|
--編寫一個demo-04.sh
|
--執行demo-03.sh,能夠輸出
|
echo `ls -l` 。反單引號,就是Tab鍵的上一個鍵。
A=`ls -la` ## 反引號,運行裏面的命令,並把結果返回給變量A
A=$(ls -la) ## 等價於反引號
$? 表示上一個命令退出的狀態碼
狀態碼 |
描述 |
0 |
命令成功結束 |
1 |
通用未知錯誤 |
2 |
誤用Shell命令 |
126 |
命令不可執行 |
127 |
沒找到命令 |
128 |
無效退出參數 |
128+x |
Linux信號x的嚴重錯誤 |
130 |
命令經過Ctrl+C控制碼越界 |
255 |
退出碼越界 |
$$ 表示當前進程編號
$0 表示當前腳本名稱
$n 表示n位置的輸入參數(n表明數字,n>=1)
$# 表示參數的個數,經常使用於循環
$*和$@ 都表示參數列表
注:$*與$@區別
$* 和 $@ 都表示傳遞給函數或腳本的全部參數
ü 不被雙引號" "包含時--
$* 和 $@ 都以$1 $2 … $n 的形式組成參數列表
ü 當它們被雙引號" "包含時--
"$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"的形式組成一個整串;
"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式組成一個參數列表
需求:編寫一個段腳本。直接輸出參數值,以及shell腳本的名字。
#!/bin/bash echo "my file name is $0" echo "param 1 is $1" echo "param 2 is $2" echo "param count is $# " echo "param list $*" echo "param list $@" |
結果
|
--注意:默認狀況下,shell的變量都是一個字符串。
--如何讓字符串均可以運算呢?
答:可使用expr命令。
--注意事項:運算符之間必需要有空格。
例如計算(2+3 )×4 的值
--第一步
S=`expr 2 + 3`
--第二步
--注意事項:*在linux裏面是一個通配符,因此須要轉義
expr $S \* 4
一步完成計算
方案1 :expr `expr 2 + 3` \* 4
--注意;`也是一個特殊字符,表示$()的意思。若是在運算表達式裏面,也須要轉義
方案2 : echo `expr \`expr 2 + 3\` \* 4`
((C語言語法))裏面的表達式,使用標準C語言的語法來操做運算符。
((1+2))
(((2+3)*4))
count=1
((count++))
echo $count
|
通常用於邏輯運算。
a=$[1+2]
echo $a
問題:Shell的語法爲何那麼奇怪呢?
答:就是當時寫系統的臨時想出來的解決方案。因此語法語法結構比較古老。
--java 語法
if (condition ){ //statements }else if(condition ){ //statements }else{ //statements } |
語法結構
if condition then //statements elif condition then //statements else //statements fi |
示例:
需求:編寫程序,若是輸入的參數爲 root 輸出歡迎語句,若是參數是sxt也輸出歡迎語句
不然,不認識你
#!/bin/bash read -p "please input your name:" NAME ## read命令用於從控制檯讀取輸入數據 ## printf '%s\n' $NAME if [ $NAME = root ] then echo "hello ${NAME}, welcome !" elif [ $NAME = ranger ] then echo "hello ${NAME}, welcome !" else echo "SB, get out here !" fi |
注意事項:
--java的case語法
switch (value) case val1: //statements break; case val2: //statements break; default //statements break; |
語法結構
case <變量> in value1) //邏輯處理 ;; value2) //邏輯處理 ;; *) //邏輯處理 esac |
需求:經過參數傳值,若是是start ,輸出 starting 若是是 stop ,輸出stoping 不然,輸出 (start|stop)
示例
case $1 in start) echo "starting" ;; stop) echo "stoping" ;; *) echo "Usage: {start|stop}" esac |
--語法結構
while expression do command … done
|
示例
#!/bin/bash read -p "請輸入一個數:" NUM echo "$NUM" i=0 sum=0 while ((i< $NUM)) do ((i++)) sum=$(($sum+$i)) done;
echo "sum is $sum";
|
注意事項:
for N in 1 2 3 do echo $N done 或 for N in 1 2 3; do echo $N; done 或 for N in {1..3}; do echo $N; done
|
for ((i = 0; i <= 5; i++)) do echo "welcome $i times" done 或 for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done |
tomcat開機啓動。
爲何很差,這樣作,雖然tomcat啓動了。可是在服務裏面看不見。
需求:讓tomcat也可使用service來管理。
--注意,tomcat自己沒有提供服務腳本。因此須要咱們自定義實現。
--注意:windows系統的編碼linux是不一樣。因此從window複製過去的shell是有問題。
能夠經過 cat -A <文件確認編碼問題>
編寫腳本
#!/bin/bash # This is a Tomcat Service # chkconfig: 2345 90 10 # desricption: This is a Tomcat Service export JAVA_HOME=/opt/jdk1.8.0_181/ case $1 in start) echo "Tomcat Service strating...." /opt/apache-tomcat-8.5.34/bin/startup.sh echo "SUCCESS!!!!" ;; stop) echo "Tomcat Service stoping...." /opt/apache-tomcat-8.5.34/bin/shutdown.sh echo "SUCCESS!!!!" ;; *) echo "(start|stop)" esac
|
將腳本複製在 /etc/init.d/目錄下,文件名爲tomcat
注意:tomcat文件必須有給全部人授予執行的權限
若是成功。可使用
service tomcat start
service tomcat stop
測試。。。
將服務加入到開機啓動
chkconfig --add tomcat
查看增長是否成功
chkconfig --list