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

一、基本格式

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

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

#!是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell。
echo 命令用於向窗口輸出文本。

Shell 腳本的執行

# 使腳本具有執行權限
chmod +x ./hello.sh  
# 執行腳本
./hello.sh    

直接寫 hello.sh, linux系統會去PATH裏尋找有沒有叫 hello.sh的。 用 ./hello.sh 告訴系統說,就在當前目錄找。

還可以作爲解釋器參數運行。 直接運行解釋器,其參數就是 shell 腳本的文件名,如:

/bin/sh /root/hello.sh

這種方式運行腳本,不需要在第一行指定解釋器信息,寫了也不生效。

二、shell變量

語法格式: 變量=值,如: your_name="itcast.cn"
注意:變量名和等號之間不能有空格,同時,變量名的命名須遵循如下規則:

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

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

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

1)花括號是可選的,加不加都行,加花括號是爲了幫助解釋器識別變量的邊界
2)已定義的變量,可以被重新定義。
3)使用 readonly 命令可以將變量定義爲只讀變量,只讀變量的值不能被改變。
4)使用 unset 命令可以刪除變量。 不能刪除只讀變量。

readonly variable_name
unset variable_name

2.1 變量類型

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

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

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

2.2 參數傳遞

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

特殊字符 :

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

例子:

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

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

*和@區別

相同點: 都表示傳遞給腳本的所有參數。
不同點:不被" “包含時, *和@都以$1 $2… n"""n 的形式組成參數列表。 被" "包含時, "*” 會將所有的參數作爲一個整體,以"$1 $2 … n""n"的形式組成一個整串; "@" 會將各個參數分開,以"$1" “2""2" … "n” 的形式組成一個參數列表。

2.3 Shell 運算符

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

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

例如,以下表示一些數據的運算

#!/bin/bash
echo "hello world"
a=4
b=20
# 加法運算
echo `expr $a + $b`
# 減法運算
echo `expr $b - $a`
# 乘法運算,注意*號前面需要反斜槓
echo `expr $a \* $b`
# 除法運算
echo `expr $b / $a`

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

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

三、流程控制

3.1 if else 語句

if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

條件表達式寫法
EQ 就是 EQUAL等於
NQ 就是 NOT EQUAL不等於
GT 就是 GREATER THAN大於 
LT 就是 LESS THAN小於
GE 就是 GREATER THAN OR EQUAL 大於等於
LE 就是 LESS THAN OR EQUAL 小於等於

#!/bin/bash

a=10
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等於 b"
else
   echo "$a -eq $b: a 不等於 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等於 b"
else
   echo "$a -ne $b : a 等於 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大於 b"
else
   echo "$a -gt $b: a 不大於 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小於 b"
else
   echo "$a -lt $b: a 不小於 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大於或等於 b"
else
   echo "$a -ge $b: a 小於 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小於或等於 b"
else
   echo "$a -le $b: a 大於 b"
fi

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

需求:使用for循環打印數字以及當前系統所有進程

#!/bin/bash
#循環打印 1 2 3這三個數字
for N in 1 2 3
do
  echo $N
done

a=1
b=2
c=3
for N in  $a $b $c
do
 echo $N
done

#打印當前系統所有進程
for N in `ps -ef`
do 
 echo $N
done

3.3 while語法

方式一:

while expression
do
command
done

方式二:

#!/bin/bash
i=1
while (( i <= 3))
do 
 let i++
 echo $i
done

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

方式三: 無限循環

while true
do
command
done

3.4 case語句

casein
模式 1)
command1
command2
...
commandN
;;
模式 2)
command1
command2
...
commandN
;;
esac

使用case語句實現交互會話

#!/bin/bash
echo '輸入 1 到 4 之間的數字:'
echo '你輸入的數字爲:'
read aNum
case $aNum in
    1)  echo '你選擇了 1'
    ;;
    2)  echo '你選擇了 2'
    ;;
    3)  echo '你選擇了 3'
    ;;
    4)  echo '你選擇了 4'
    ;;
    *)  echo '你沒有輸入 1 到 4 之間的數字'
    ;;
esac

四、函數使用

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

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

1、可以帶 function fun()定義,也可以直接 fun() 定義,不帶任何參數。
2、參數返回,可以顯示加 return ,如果不加,將以最後一條命令運行結果,作爲返回值。 return 後跟數值 n(0-255)。

4.1 函數參數

在 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

定義我們自己的函數並在shell腳本當中調用函數

#!/bin/bash
hello(){
 echo "hello world"
 echo "第一個參數爲 $1"
 echo "第二個參數爲 $2"
}
hello abc 123
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章