Shell腳本入門

最近發現公司不少腳本都是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
相關文章
相關標籤/搜索