1. 程式人生 > >shell指令碼基礎教程

shell指令碼基礎教程

一、什麼是shell:

shell解釋:引用別人的話說:“Shell 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言。”

  簡而言之,shell是命令直譯器之外的一種程式語言。

shell可以做什麼:批處理、自動化管理、監控管理、日誌資料處理、自動資料備份等等。

二、組成部分和執行方式

1、shell指令碼組成部分

    1)註釋:#開頭

    2)命令:shell基本語法

    3)變數:shell支援字串變數和整數變數。

    4)結構控制語句:流程控制語句

2、執行方式

兩種執行方式

    1)sh shelltest

    2)./shelltest

說明:兩種執行方式的許可權控制不一樣。

三、語法說明

1、註釋、指定執行方式、退出

  • 註釋等說明資訊,要以#開頭。
  • 指令碼的第一行呼叫時表明基於bash的方式執行:#!/bin/bash(說明:如果系統預設是bash執行,不寫也行)
  • 退出時最好寫上:exit 0

示例:

#!/bin/bash
# 我是註釋 :-e特殊字元(\a、\n)轉義
echo -e "Hello World!\a\n" 
exit 0

2、變數和變數的計算

定義變數:name=aa

說明:

  • name:變數名,變數名用小寫字母命名
  • =:賦值符號,兩邊絕對不能有空格
  • aa:可以為字串,可以為數值

引用變數:$name(表示引用name的值)

變數的數值計算:

        語法:需要使用雙層小括號括起來,模運算:% 冪運算:**

示例:實現a + b

#!/bin/bash
a=10
b=20
echo $(($a+$b)) 
echo $((100+20-20*2)) 

./shelltest執行,結果為:

30
80

字串操作:

複製程式碼

${#string} : 計算長度

${string:position} : 從position開始擷取

${string:position:length} : 從position開始擷取length長度

${string#substring} : 刪除開始的字串

複製程式碼

示例:

${string#I*.} : 刪除從I到.的所有字元(最短匹配)

${string##I*} : 刪除開始I到.所有字元(最長匹配)

3、語句判斷

1)判斷語句test命令

可以使用:man test檢視test的語法說明。

以下為test的幾個基本使用:

複製程式碼

-f:檔案是否存在

-d:目錄是否存在

-r:檔案是否有讀許可權

-w:檔案是否有寫許可權

-x:檔案是否有執行許可權

複製程式碼

示例:

#!/bin/bash
filename=/home/zhangsan
test -f $filename && echo 'exist' || 'not exist'

通過./shelltest執行,會顯示'not exist'

2)[]判斷

注意:

1)中括號中必須用空格隔開

2)中括號中的變數最好以雙引號括起來

3)中括號中的常數,最好以單引號括起來

eg:
[ "$a" == "$b" ]&&echo 'yes' || echo 'no'
[ '12' == '10' ]&&echo 'yes' || echo 'no'

4、條件分支

三種條件分支:單分支、雙分支、多分支

1)單分支判斷

語法:

if[];then
echo 'aa'
fi

示例:

#!/bin/bash
filename=/home/asdf
if[ test -f $filename ];then
  echo 'aa'
fi

2)雙分支判斷

#!/bin/bash
if[];then
  echo 'aa'
else
  echo 'bb'
fi

3)多分支判斷

多分支判斷有兩種方式:if elif else方式、case in方式。

第一種:if elif else方式

示例:

複製程式碼

#!/bin/bash
if[];then
  echo 'aa'
elif
  echo 'bb'
elif
  echo 'cc'
fi

複製程式碼

第二種:case in方式

語法:

case $name in
1);;
echo 'aa'
esac

多分支示例:

從終端接收一個輸入引數,然後進行條件判斷。(read:接收使用者輸入)

複製程式碼

#!/bin/bash
echo '輸入一個值:'
read number
if[ $number == 1 ];then
  echo '2'
elif[ $number == 2 ];then
  echo '2'
else
  echo '錯誤'
fi

複製程式碼

示例,檢視硬體資訊指令碼:

複製程式碼

#!/bin/bash
echo '輸入一個值:'
read hd
if[ $hd == cpu ];then
  cat /proc/cpuinfo
elif[ $hd == mem ];then
  cat /proc/meminfo
elif[ $hd == hard ];then
  df -h
else
  echo '錯誤'
fi

複製程式碼

case in方式的示例:

複製程式碼

#!/bin/bash
echo '輸入一個值:'
read number
case $number in
1)
  echo '1';;
2)
  echo '2';;
*)
  echo '錯誤';;
esac

複製程式碼

5、迴圈語句

迴圈語句有三種方式:while do迴圈、until do迴圈、for迴圈

說明:[]中要使用以下轉義符號;(())不需要轉義。shell推薦使用[]。

[] : -eq -ne -gt -ge -lt -le

(()): == != > >= < <=

1)while do迴圈

說明:示例中[ $i -eq 5 ] 等價於 (($i==5))。

#!/bin/bash
i=10
while [ $i -eq 5 ];do 
  echo $i;
  ((i--));
done;

2)until do迴圈:直到..才執行

#!/bin/bash
i=10
until (($a<0));do
  echo $i;
  ((i--));
done;

3)for迴圈

#!/bin/bash
for((i=1;i<=10;i++));do
  echo $i
done;

6、函式(方法)

參考示例,檔名為shelltest

複製程式碼

#!/bin/bash
function print(){
  echo '$1'
}

case $1 in
"one")
  print 1;;
"two")
  print 2;;
*)
  print '錯誤';;
esac

複製程式碼

執行的時候可以直接通過控制檯直接傳參:

$ ./shelltest one

以下執行結果為:2

$ ./shelltest two

以上為shell指令碼的基本使用,熟練使用後,再結合linux其他基本命令擴充套件一下,就能基本掌握shell指令碼程式設計了。