shell-快速入門_批處理腳本編程語言

1. Shell概述

 

1.1. Shell是什麼

Shell是一門批處理腳本編程語言。java

 

 

批處理是什麼?linux

操做系統都分爲(GUI)圖形界面,命令界面(command)。shell

 

命令操做的能夠不用一一條執行。能夠組命令同時執行。咱們將多條命令同時執行的操做稱爲批處理。數據庫

 

 

什麼是腳本編程語言。express

  1. 腳本語言是不須要就能夠執行的編程語言。《解釋型編程語言》
  2. 特徵,任何的腳本語言是必須有宿主程序的。

 

--JavaScript腳本語言。必須須要依賴瀏覽器才能夠執行。因此瀏覽器就是JavaScript的宿主程序。apache

--SQL腳本語言,必須須要數據庫啓動了才能夠執行,SQL語言的宿主是數據庫編程

--Shell腳本語言,必須依賴linux的系統。linux系統就是它宿主程序。windows

 

shell腳本,是批處理的程序,因此也可使用任何的linux命令瀏覽器

shell腳本,是一門腳本語言,因此它不須要編譯直接執行tomcat

shell腳本是一門編程語言,必須符合編寫語言的特徵。變量,常量,標識符,註釋,判斷,循環

 

 

1.2. 語法結構

問題:linux是有多種shell的語言的。如,bash shell csh 等。爲何有多種?

答:緣由是linux是一個開源的操做系統。不一樣的人均可以對它進行制定。功能穩定後能夠提交合併到主核中。

 

#!/bin/bash  ##指定使用的shellbash shell

 

##輸出hello world

echo 「hello world」

 

##這是一行註釋

 

bash shell的註釋是使用#,但咱們建議使用##號。

 

需求:使用root,在~目錄的shell文件裏面,建立一個 demo.sh shell腳本。輸出hello world

 

 

 

2. 變量

 

2.1. 系統變量

變量分爲系統變量用戶自定義變量

 

所謂的系統變量就Linux系統自帶的變量。

 

 

 

如:$PWD$USER這種Linux系統自帶的變量,咱們稱爲系統變量。以及咱們在profile設置的變量。

 

需求:輸出系統變量PWD

 

使用 echo $PWD

訪問變量使用$訪問,無論是系統變量函數,用戶自定義變量。

 

2.2. 用戶自定義變量

2.2.1. 語法

變量=值 (例如STR=abc

等號兩側不能有空格

變量名稱通常習慣爲大寫(無論學任何編程語言,保持語法風格和API的一致)

使用變量: $STR

 

注意:若是值是有空格等特殊字符串,必須有使用雙引號或者單引號。

 

2.2.2. 雙引號和單引號有區別

     雙引號僅將空格脫意,

     單引號會將變量引用好比$param脫意

 

  1. 設置a=aaa

使用命令 a=aaa

    2.設置變量 b= 「$a bbb」

--僅將空格脫意的意思是指,除了空格字符串輸出,其餘的有特殊含義的字符仍是轉義輸出的

 

    3.若是設置的變量b = ‘$a bbb’

--變量引用脫意,全部的空格以及引用都字符串輸出

 

 

 

2.2.3. 有無export的區別

當前shell有效的變量,當前shell文件內部調用

 

不加 export的變量就是當前shell有效的變量,若是在一個shell腳本里面

聲明一個STR=aaa,shell腳本不能夠調用該變量!!

 

若是加一個shell腳本里面聲明的變量使用了export。表示全局變量,shell腳本能夠調用。

--編寫一個demo-03.sh

 

--編寫一個demo-04.sh

 

 

--執行demo-03.sh,能夠輸出

 

 

2.3. 反單引號賦值

echo `ls -l` 。反單引號,就是Tab鍵的上一個鍵。

 

A=`ls -la`    ## 反引號,運行裏面的命令,並把結果返回給變量A

A=$(ls -la)   ## 等價於反引號

 

 

2.4. 特殊變量

$? 表示上一個命令退出的狀態碼

狀態碼

描述

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 $@"

 

結果

 

 

3. 運算符

3.1. expr(能夠忽略)

--注意:默認狀況下,shell的變量都是一個字符串。

--如何讓字符串均可以運算呢?

答:可使用expr命令。

--注意事項:運算符之間必需要有空格。

 

例如計算(23 )×4 的值

--第一步

S=`expr 2 + 3`

--第二步

--注意事項:*linux裏面是一個通配符,因此須要轉義

expr $S \* 4

 

一步完成計算

方案1 expr  `expr 2 + 3` \* 4

--注意;`也是一個特殊字符,表示$()的意思。若是在運算表達式裏面,也須要轉義

方案2 echo `expr \`expr 2 + 3\` \* 4`

 

 

3.2. $(())

((C語言語法))裏面的表達式,使用標準C語言的語法來操做運算符。

((1+2))

(((2+3)*4))

count=1

((count++))

echo $count

 

 

 

3.3. $[]

通常用於邏輯運算。

a=$[1+2]

echo $a

 

問題:Shell的語法爲何那麼奇怪呢?

答:就是當時寫系統的臨時想出來的解決方案。因此語法語法結構比較古老。

 

4. 流程控制

 

4.1. if語法

--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

注意事項:

  1. 關鍵字必須有換行
  2. []的對比判斷,必需要有空格 如 [ $NAME = ranger ]
  3. 若是關鍵字不想換行可使用;結束

 

 

4.2. case語法

--javacase語法

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

 

5. 循環

5.1. while

--語法結構

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";

 

注意事項:

  1. 分號和換行都是表示語句結束的意思。
  2. 最後的done必需要有一個空格或;

5.2. for語法

5.2.1. 方式一

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

 

 

5.2.2. 方式二

for ((i = 0; i <= 5; i++))

do

echo "welcome $i times"

done

for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done

 

6. 案例-Tomcat開機自動啓動的實現

tomcat開機啓動。

 

  1. 方案1,放在rc.local (很差)

爲何很差,這樣作,雖然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

 

7. 總結

  1. 理解系統變量與用戶自定義的區別
  2. 理解用戶自定義變量,加export和沒有export的區別
  3. 注意,變量的聲明,等號兩邊不能有空格
  4. 注意 使用方括號 [] 每個變量必需要有空格,注意等號使用的=,不是==
  5. 注意((寫的是C語言的語法))
  6. 注意變量必需要使用$訪問
  7. 注意可使用換行或者;斷句。要求若是不使用;斷句。必須關鍵字須要斷句的必定要換行。
  8. whilefor循環done後面有空格或者使用;結束。
  9. window的編號和linux是不一樣的。注意,使用cat -A檢查
相關文章
相關標籤/搜索