Shell編程

Shell介紹

Shell 是一個用 C 語言編寫的程序,通過 Shell 用戶可以訪問操作系統內核服務。它類似於 DOS 下的 command 和後來的 cmd.exe。Shell 既是一種命令語言,又是一種程序設計語言

Shell script 是一種爲 shell 編寫的腳本程序。Shell 編程一般指 shell腳本編程,不是指開發 shell 自身。

Shell 編程跟 java、php 編程一樣,只要有一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就可以了

Linux 的 Shell 種類衆多,一個系統可以存在多個 shell,可以通過 cat/etc/shells 命令查看系統中安裝的 shell。

Bash 由於易用和免費,在日常工作中被廣泛使用。同時,Bash 也是大多數Linux 系統默認的 Shell。

 

1 . 基本格式

使用 vi 編輯器新建一個文件 hello.sh。擴展名並不影響腳本執行,見名知意。比如用 php 寫 shell 腳本,擴展名就用 .php

#!/bin/bash
echo "Hello World !"

#!是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell。

echo 命令用於向窗口輸出文本。

  執行:chmod 777 ./hello.sh    使腳本具有執行權限

     ./hello.sh  當前路徑執行腳本

     /bin/sh /root/hello.sh  這種方式運行腳本,不需要在第一行指定解釋器信息,寫了也不生效

 

2 . Shell  變量

2.1.  語法格式


變量=值,如:your_name="itcast.cn"

注意:變量名和等號之間不能有空格,同時,變量名的命名須遵循如下規則:

 首個字符必須爲字母(a-z,A-Z)
 中間不能有空格,可以使用下劃線(_)
 不能使用標點符號
 不能使用 bash 裏的關鍵字(可用 help 命令查看保留關鍵字)

2.2.  變量使用

使用一個定義過的變量,只要在變量名前面加 $ 即可。

your_name="itcast.cn"
echo $your_name
echo ${your_name}

花括號是可選的,加不加都行,加花括號是爲了幫助解釋器識別變量的邊界。
已定義的變量,可以被重新定義。

使用 readonly 命令可以將變量定義爲只讀變量,只讀變量的值不能被改變。

使用 unset 命令可以刪除變量。不能刪除只讀變量。

readonly variable_name
unset variable_name

2.3.  變量類型

局部變量 局部變量在腳本或命令中定義,僅在當前 shell 實例中有效,其他 shell 啓動的程序不能訪問局部變量。

環境變量 所有的程序,包括 shell 啓動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行。可以用過 set 命令查看當前環境變量。

shell 變量 shell 變量是由 shell 程序設置的特殊變量。shell 變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了 shell 的正常運行。

 

3 . Shell參數傳遞

腳本內獲取參數的格式爲:$n。n 代表一個數字,1 爲執行腳本的第一個參數,2 爲執行腳本的第二個參數,以此類推…… $0 表示當前腳本名稱。

3.1.特殊字符

$#傳遞到腳本的參數個數
$*以一個單字符串顯示所有向腳本傳遞的參數。
$$腳本運行的當前進程 ID 號
$!後臺運行的最後一個進程的 ID 號
$@與$*相同,但是使用時加引號,並在引號中返回每個參數。
$? 顯示最後命令的退出狀態。0 表示沒有錯誤,其他任何值表明有錯誤。

例子:

#!/bin/bash
echo "第一個參數爲:$1";
echo "參數個數爲:$#";
echo "傳遞的參數作爲一個字符串顯示:$*";

執行腳本:./test.sh 1 2 3

 

3.2. $*和 和$@ 區別

    相同點:都表示傳遞給腳本的所有參數。

    不同點:

  不被" "包含時,$*和$@都以$1 $2… $n 的形式組成參數列表。被" "包含時,"$*" 會將所有的參數作爲一個整體,以"$1 $2 … $n"的形式組成一個整串;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式組成一個參數列表。

 

4 . Shell運算符

  Shell 和其他編程語音一樣,支持包括:算術、關係、布爾、字符串等運算符。原生 bash 不支持簡單的數學運算,但是可以通過其他命令來實現,例如expr。expr 是一款表達式計算工具,使用它能完成表達式的求值操作。

    例如,兩個數相加:

val=`expr 2 + 2`
echo $val

 

    注意:

表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2。
完整的表達式要被 ` ` 包含,注意不是單引號,在 Esc 鍵下邊。

此外,還可以通過(())、$[]進行算術運算。

count=1
((count++))
echo $count
a=$((1+2))
a=$[1+2]

 

5 .  流程控制

5.1. if else

if condition1
then
  command1
elif condition2
then
  command2
else
  commandN
fi

 

5.2. for

方式一

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

 

5.3.  while

 

方式一

while expression
do
  command

done

 

方式二

i=1
while ((i<=3))
do
  echo $i
  let i++
done

let 命令是 BASH 中用於計算的工具,用於執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量。自加操作: let n++ 自減操作: let n--

 

方式三:無限循環

while true
do
  command
done

 

5.4.  case

case 值 in
模式 1)
  command1
  command2
  ...
  commandN
  ;;
模式 2)
  command1
  command2
  ...
  commandN
  ;;
esac

 

6 . 函數

所有函數在使用前必須定義。這意味着必須將函數放在腳本開始部分,直至shell 解釋器首次發現它時,纔可以使用。調用函數僅使用其函數名即可

[ function ] funname [()]
{
  action;
  [return int;]
}

 

1、[]代表可選,可以帶 function fun()定義,也可以直接 fun() 定義,不帶任何參數。

2、參數返回,可以顯示加 return ,如果不加,將以最後一條命令運行結果,作爲返回值。 return 後跟數值 n(0-255)。

 

函數參數

在 Shell 中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1 表示第一個參數,$2 表示第二個參數...

注意,當 n>=10 時,需要使用${n}來獲取參數。

funWithParam(){
  echo "第一個參數爲 $1 !"
  echo "第二個參數爲 $2 !"
  echo "第十個參數爲 $10 !"
  echo "第十個參數爲 ${10} !"
  echo "第十一個參數爲 ${11} !"
  echo "參數總數有 $# 個!"
  echo "作爲一個字符串輸出所有參數 $* !"
}

funWithParam 1 2 3 4 5 6 7 8 9 34 73

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章