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 系統默認的 Shellphp
使用 vi 編輯器新建一個文件 hello.sh。 擴展名並不影響腳本執行,見名知
意。 好比用 php 寫 shell 腳本,擴展名就用 .php。
#!/bin/bash
echo "Hello World !"
#!是一個約定的標記,它告訴系統這個腳本須要什麼解釋器來執行,即便用
哪種 Shell。java
echo 命令用於向窗口輸出文本。
Shell 腳本的執行:linux
chmod +x ./hello.sh #使腳本具備執行權限shell
./hello.sh #執行腳本express
直接寫 hello.sh, linux系統會去PATH裏尋找有沒有叫 hello.sh的。 用 ./hello.sh 告訴系統說,就在當前目錄找。編程
還能夠做爲解釋器參數運行。 直接運行解釋器,其參數就是 shell 腳
本的文件名,如:bash
/bin/sh /root/hello.sh
/bin/php test.php
這種方式運行腳本,不須要在第一行指定解釋器信息,寫了也不生效編輯器
變量=值,如: your_name="itcast.cn"
注意:變量名和等號之間不能有空格,同時,變量名的命名須遵循以下規則:
l 首個字符必須爲字母( a-z, A-Z)
l 中間不能有空格,可使用下劃線( _)
l 不能使用標點符號
l 不能使用 bash 裏的關鍵字(可用 help 命令查看保留關鍵字)函數
使用一個定義過的變量,只要在變量名前面加 $ 便可。
your_name="itcast.cn"
echo $your_name
echo ${your_name}
花括號是可選的,加不加都行,加花括號是爲了幫助解釋器識別變量的邊界。
已定義的變量,能夠被從新定義。
使用 readonly 命令能夠將變量定義爲只讀變量,只讀變量的值不能被改變。
使用 unset 命令能夠刪除變量。 不能刪除只讀變量。
readonly variable_name
unset variable_name工具
局部變量在腳本或命令中定義,僅在當前 shell 實例中有效,其
他 shell 啓動的程序不能訪問局部變量。
全部的程序,包括 shell 啓動的程序,都能訪問環境變量,有些程
序須要環境變量來保證其正常運行。 能夠用過 set 命令查看當前環境變量。
shell 變量是由 shell 程序設置的特殊變量。 shell 變量中有一
部分是環境變量,有一部分是局部變量,這些變量保證了 shell 的正常運行
在執行 Shell 腳本時, 能夠向腳本傳遞參數。
腳本內獲取參數的格式爲: $n。 n 表明一個數字, 1 爲執行腳本的第一個參
數, 2 爲執行腳本的第二個參數,以此類推…… $0 表示當前腳本名稱。
$# |
傳遞到腳本的參數個數 |
$* |
以一個單字符串顯示全部向腳本傳遞的參數。 |
$$ |
腳本運行的當前進程 ID 號 |
$! |
後臺運行的最後一個進程的 ID 號 |
$@ |
與$*相同,可是使用時加引號,並在引號中返回每一個參數。 |
$? |
顯示最後命令的退出狀態。 0 表示沒有錯誤,其餘任何值代表有錯誤。 |
例子:
#!/bin/bash
echo "第一個參數爲: $1";
echo "參數個數爲: $#";
echo "傳遞的參數做爲一個字符串顯示: $*";
執行腳本: ./test.sh 1 2 3
相同點: 都表示傳遞給腳本的全部參數。
不一樣點:
不被" "包含時, $*和$@都以$1 $2… $n 的形式組成參數列表。
被" "包含時, "$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"
的形式組成一個整串; "$@" 會將各個參數分開,以"$1" "$2" … "$n" 的
形式組成一個參數列表。
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]
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
方式一
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
方式一
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
case 值 in
模式 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;]
}
、能夠帶 function fun()定義,也能夠直接 fun() 定義,不帶任何參數。
二、參數返回,能夠顯示加 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
定義咱們本身的函數並在shell腳本當中調用函數
#!/bin/bash
hello(){
echo "hello world"
echo "第一個參數爲 $1"
echo "第二個參數爲 $2"
}
hello abc 123