莫名的奇怪,抄寫一遍總能記住,不抄寫好像總是暈暈乎乎的~
大概抄一遍這知識它就能進腦子了吧 >_<
#!
告訴系統其後路徑所指定的程序即是解釋此腳本文件的 Shell 程序
運行 Shell 腳本的兩種方法
- 作爲可執行程序
chmod +x ./test.sh #使腳本具有執行權限 ./test.sh #執行腳本
- 作爲解釋器參數
/bin/sh test.sh /bin/php test.php
Shell 變量
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script" # 用$或者${}來使用變量
done
your_name="tom"
echo $your_name
your_name="alibaba" # 變量可以被重新定義
echo $your_name
readonly your_name # 定義爲只讀變量
Shell 字符串
your_name='runoob' # 單引號 1.字符串中的變量是無效的; 2.不能出現單獨一個的單引號(對單引號使用轉義符後也不行)
str="Hello, I know you are \"$your_name\"! \n" # 雙引號中 1.可以出現變量;2.可以出現轉義字符
echo -e $str
- 拼接字符串
# 使用雙引號拼接
greeting="hello, "$your_name" !" # 輸出爲 hello, runoob ! hello, runoob !
greeting_1="hello, ${your_name} !" # 輸出爲 hello, runoob ! hello, runoob !
echo $greeting $greeting_1
# 使用單引號拼接
greeting_2='hello, '$your_name' !' # 輸出爲 hello, runoob ! hello, runoob !
greeting_3='hello, ${your_name} !' # 輸出爲 hello, runoob ! hello, ${your_name} !
echo $greeting_2 $greeting_3
- 獲取字符串長度
echo ${#string}
- 提取子字符串
echo ${string:1:4}
- 查找子字符串
echo "expr index ${string} io"
Shell 數組
在 Shell 中,用括號來表示數組,數組元素用"空格"符號分割開。Bash Shell 只支持一維數組(不支持多維數組),初始化時不需要定義數組大小(與 PHP 類似)。定義數組的一般形式爲:
array_name=(A B "C" D))
array_name[0]=value0 # 單獨定義數組的各個分量
# 取得數組元素的個數
length=${#array_name[@]} # 使用 @ 符號可以獲取數組中的所有元素,例如:
# 或者
length=${#array_name[*]}
# 取得數組單個元素的長度
lengthn=${#array_name[n]}
Shell 傳遞參數
腳本內獲取參數的格式爲:$n
。n 代表一個數字,1 爲執行腳本的第一個參數,2 爲執行腳本的第二個參數,以此類推……
echo "Shell 傳遞參數實例!";
echo "執行的文件名:$0";
echo "第一個參數爲:$1";
echo "參數個數爲:$#";
還有幾個特殊字符用來處理參數$?
、$!
、$@
、$-
、$*
、$$
基本運算符
-
算數運算符
原生bash不支持簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
expr 是一款表達式計算工具,使用它能完成表達式的求值操作。#!/bin/bash val=`expr 2 + 2` # 兩個數相加(注意使用的是反引號 ` 而不是單引號 '): echo "兩數之和爲 : $val" a=10 b=10 val=`expr $a + $b` echo "a + b : $val" val=`expr $a \* $b` echo "a * b : $val" if [ $a == $b ] then echo "a 等於 b" fi
Tips:
- 乘號(*)前邊必須加反斜槓()才能實現乘法運算;
- 在 MAC 中 shell 的 expr 語法是:$((表達式)),此處表達式中的 “*” 不需要轉義符號 “” 。
-
關係運算符:
-eq
|檢測兩個數是否相等,相等返回 true。 |[ $a -eq $b ]
返回 false。-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。
-
布爾運算符
- 與
-a
- 或
-o
- 非
!
- 與
-
邏輯運算符
- AND
&&
- OR
||
- AND
-
字符串運算符
-z
檢測字符串長度是否爲0,[ -z $a ] 返回 false
。-n
檢測字符串長度是否不爲 0,[ -n "$a" ] 返回 true
。$
檢測字符串是否爲空,[ $a ] 返回 true
。
-
文件測試運算符
抄寫不動了,直接看吧
printf
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543
Shell 流程控制
if
a=10
b=20
if [ $a == $b ]
then
echo "a 等於 b"
elif [ $a -gt $b ]
then
echo "a 大於 b"
elif [ $a -lt $b ]
then
echo "a 小於 b"
else
echo "沒有符合的條件"
fi
for
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
while
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
以上實例使用了 Bash let 命令,它用於執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量,具體可查閱:Bash let 命令
while循環可用於讀取鍵盤信息。下面的例子中,輸入信息被設置爲變量FILM,按結束循環。
echo '按下 <CTRL-D> 退出'
echo -n '輸入你最喜歡的網站名: '
while read FILM
do
echo "是的!$FILM 是一個好網站"
done
until
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
case
while :
do
echo '輸入 1 到 4 之間的數字:'
read aNum
case $aNum in
1|2|3) echo '$aNum' is "$aNum"
;;
4) echo '$aNum' is 4
;;
*) echo '你沒有輸入 1 到 4 之間的! 遊戲結束'
break
;;
esac
done
case工作方式如上所示。取值後面必須爲單詞in,每一模式必須以右括號結束。取值可以爲變量或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;;
。如果無一匹配模式,使用星號 * 捕獲該值,再執行後面的命令。
shell 函數
- 可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。
- 參數返回,可以顯示加:return 返回,如果不加,將以最後一條命令運行結果,作爲返回值。 return後跟數值n(0-255
- 在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數…
- 函數返回值在調用該函數後通過
$?
來獲得。$?
僅對其上一條指令負責,一旦函數返回後其返回值沒有立即保存入參數,那麼其返回值將不再能通過$?
獲得。
addTowNum(){
echo "第一個參數爲 $1 !"
echo "參數總數有 $# 個!"
echo "輸入第一個數字: "
read aNum
echo "輸入第二個數字: "
read bNum
return `expr $aNum + $bNum`
}
addTowNum 1 2 # 傳遞參數
echo "輸入的兩個數字之和爲 $?" # 函數返回值在調用該函數後通過 $? 來獲得。
Shell 文件包含
. ./test1.sh # #使用 . 號來引用test1.sh 文件。注意點號(.)和文件名中間有一空格
# 或
source filename