最近發現公司不少腳本都是shell腳本,平時有些命令仍是能用的,可是就沒寫過shell腳本,致使有些公司項目裏面的bash腳本看不懂。因此學習下關於shell的內容。java
1、shell基本概念linux
1.運行方式 shell
解釋運行,底層是C寫好的執行,至關於經過函數名調用函數。bash
交互式:輸入一個shell命令就執行。函數
批處理:把一連串個shell命令經過判斷,循環等控制語句寫到文件裏面,一次性執行。
學習
2.bash分類:Unix默認使用的shell是sh,linux默認使用的shell是bash。還有ash,ksh,tcsh,等等。
spa
2、第一個shell腳本
code
#!/bin/bash echo "Hello World !"
#!/bin/bash 是約定的標記,告訴系統須要經過什麼解釋器來執行。進程
chmod +x ./test.sh #使腳本具備執行權限 ./test.sh #執行腳本
chmod +x ./test.sh 讓test.sh標記爲可執行腳本。執行的以後若是不加./ 則系統會從/bin /sbin /usr/bin /usr/sbin等path路徑下找文件。it
3、bash語法
1.定義變量的時候不要加上"$"符號,定義以及賦值的時候「=」和變量名以及值不能有空格 NAME=JACK是對的 NAME = JACK就是無效的。
2.readonly NAME 只讀變量
3.read NAME 從command中讀取輸入值賦給NAME
4.unset NAME 刪除變量
5.特殊的變量
$0 當前腳本的文件名
$n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$# 傳遞給腳本或函數的參數個數。
$* 傳遞給腳本或函數的全部參數。
$@ 傳遞給腳本或函數的全部參數。被雙引號(" ")包含時,與 $* 稍有不一樣,下面將會講到。
$? 上個命令的退出狀態,或函數的返回值。
$$ 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。
$* 和 $@ 的區別
$* 和 $@ 都表示傳遞給函數或腳本的全部參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出全部參數。
可是當它們被雙引號(" ")包含時,"$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"的形式輸出全部參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出全部參數。
echo `expr $a + $b`
`expr `裏面能夠寫表達式
+ 加法 `expr $a + $b` 結果爲 30。
- 減法 `expr $a - $b` 結果爲 10。
* 乘法 `expr $a \* $b` 結果爲 200。
/ 除法 `expr $b / $a` 結果爲 2。
% 取餘 `expr $b % $a` 結果爲 0。
= 賦值 a=$b 將把變量 b 的值賦給 a。
== 相等。用於比較兩個數字,相同則返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用於比較兩個數字,不相同則返回 true。 [ $a != $b ] 返回 true。
關係運算符列表
運算符 說明 舉例
-eq 檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-ne 檢測兩個數是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 檢測左邊的數是否大於右邊的,若是是,則返回 true。 [ $a -gt $b ] 返回 false。
-lt 檢測左邊的數是否小於右邊的,若是是,則返回 true。 [ $a -lt $b ] 返回 true。
-ge 檢測左邊的數是否大等於右邊的,若是是,則返回 true。 [ $a -ge $b ] 返回 false。
-le 檢測左邊的數是否小於等於右邊的,若是是,則返回 true。 [ $a -le $b ] 返回 true。
6.if 語句
a=100 b=120 if [ $a == $b] then echo '$a == $b' else echo '$a != $b' fi
#!/bin/bash a=100 b=120 if [ $a == $b ] then echo '$a == $b' elif [ $a -gt $b ] then echo '$a > $b' else echo '$a < $b' fi
7.case
#!/bin/bash var="$1" case $var in "ab") echo "aaa" ;; bc) echo "bbb" ;; *) echo "`basename $0`:usage: [-a] | [-b]" ;; esac
8.for循環
#!/bin/bash for str in "a" "b" "c" do echo $str done
#!/bin/bash for FILE in $HOME/.vi* do echo $FILE done
9.while循環
count=0 while [ $count -lt 10 ] do echo "$count" count=`expr $count+1` done
10.函數
hello() { echo "hello $1" } hello "Jack"
11.輸入輸出重定向
ps -ef | grep java > test.txt #會覆蓋test.txt內容 ps -ef | grep java >> test.txt #追加內容到test.txt中
12.引入其餘shell文件
#!/bin/bash name="jack" hello(){ echo "hello" }
#!/bin/bash . ./function.sh hello echo $name