shell編程 learning

shell 菜鳥教程

莫名的奇怪,抄寫一遍總能記住,不抄寫好像總是暈暈乎乎的~
大概抄一遍這知識它就能進腦子了吧 >_<

  • #! 告訴系統其後路徑所指定的程序即是解釋此腳本文件的 Shell 程序

運行 Shell 腳本的兩種方法

  1. 作爲可執行程序
    chmod +x ./test.sh  #使腳本具有執行權限
    ./test.sh  #執行腳本
    
  2. 作爲解釋器參數
    /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 "參數個數爲:$#"; 

還有幾個特殊字符用來處理參數$?$!$@$-$*$$

基本運算符

  1. 算數運算符
    原生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 語法是:$((表達式)),此處表達式中的 “*” 不需要轉義符號 “” 。
  2. 關係運算符:

    • -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。
  3. 布爾運算符

    • -a
    • -o
    • !
  4. 邏輯運算符

    • AND &&
    • OR ||
  5. 字符串運算符

    • -z檢測字符串長度是否爲0,[ -z $a ] 返回 false
    • -n檢測字符串長度是否不爲 0,[ -n "$a" ] 返回 true
    • $檢測字符串是否爲空,[ $a ] 返回 true
  6. 文件測試運算符
    抄寫不動了,直接看吧

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 函數

  1. 可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。
  2. 參數返回,可以顯示加:return 返回,如果不加,將以最後一條命令運行結果,作爲返回值。 return後跟數值n(0-255
  3. 在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數…
  4. 函數返回值在調用該函數後通過 $? 來獲得。 $? 僅對其上一條指令負責,一旦函數返回後其返回值沒有立即保存入參數,那麼其返回值將不再能通過 $? 獲得。
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章