linux shell編程

shell是用戶與內核進行交互操做的一種接口,目前最流行的shell稱爲bash shell,bashshell編程以其簡潔、高效而著稱,多年來成爲linux程序員和系統管理員解決實際問題的利器。linux

bash編程是面向過程的,依靠bash解釋器邊解釋邊執行,腳本的編寫格式:程序員

第一行:寫明解釋器; #!/bin/bashshell

註釋行:全部以#開頭的行均爲註釋行;會被解釋器忽略編程

下面來看一個經典的小程序:小程序

#!/bin/bash數組

echo "hello world"bash

它的第一行表示這個腳本程序由/bin/bash來解釋.第二行在終端上打印出一行」Hello World」ide

1、給腳本傳參數函數

bash腳本咱們還能夠給它傳遞參數,在腳本里經過調用位置變量來實現測試

#!/bin/bash
echo $*       #$*
表示全部參數列表

echo $@       #$@表示全部參數列表
echo $0       #$0是指腳本名稱
echo $1       #$1表示腳本的第1個位置參數
echo $#       #$# 表示當前腳本的位置參數個數

2、條件測試

條件測試: test 表達式

           [表達式 ]

           [[表達式 ]]

測試表達式:

(1) 整數測試:     整數測試:A, B

                   A -gt B: 大於

                   A -ge B: 大於等於

                   A -eq B: 等於

                   A -lt B: 小於

                   A -le B: 小於等於

                   A -ne B: 不等於

(2) 字符串測試:   字符串測試:A, B

                   A > B

                   A < B

                   A >= B

                   A <= B

                   A == B或A =B:等值比較

                   A != B: 不等於

                   -z A: 判斷A是否爲空;空則爲真,不空則假

                   -n A:判斷A是否不空;不空則爲值,空則爲假

(3) 文件測試:     -e$file: 是否存在;存在則爲真

                   -f $file: 文件是否存在,且爲普通文件

                   -d $file: 是否存在且爲目錄

                   -h $file: 是否存在且爲符號連接文件

                   -L $file:同上

                   -b $file: 是否存在且爲塊設備文件

                   -c $file: 是否存在且爲字符設備文件

                   -S $file: 是否存在且爲套接字文件

                   -p $file: 是否存在且爲管道文件

-r$file: 當前用戶對此文件是否擁有讀權限

                   -w $file: 當前用戶對此文件是否擁有寫權限

                   -x $file: 當前用戶對此文件是否擁有執行權限

-u$file: 文件是否擁有suid權限

                   -g $file:文件是否擁有sgid權限

                   -k $file: 文件是否擁有sticky權限

-O$file: 當前用戶是否爲文件的屬主

                   -G $file: 當前用戶是否屬於文件的屬組

-N $file:文件自從上一次被讀取以後,是否被修改過

$f1 -nt$f2: 文件f1是否比文件f2新

                   $f1 -ot $f2: 文件f1是否比文件f2舊

                   $f1 -ef $f2:f1和f2是否爲同一個文件的硬連接

3、流程控制

1、for循環

for 變量 in列表; do

     循環體

done

如咱們要打印1到10,咱們能夠這樣寫

#!/bin/bash

for i in {1..10};do

   echo "$i"

done

2、if條件判斷

if 條件;then

   條件爲真時執行命令

else

   條件爲假時執行命令

fi

例如:

#!/bin/bash

if [ 5 -eq 4 ];then

   echo "true"

else

   echo "false"

fi

3、case條件判斷,一般用於判斷字符串

case 變量 in

值1)

     變量值等於值1執行語句

     ;;

值2)

     變量值等於值2執行語句

     ;;

*)

     變量值等於其餘值執行語句

     ;;

esac

例如:

#!/bin/bash

case $1 in 

cpu)

    lscpu ;;

*)

    exit 0 ;;

esac

4、while和until循環

whileCONDITION; do

    循環體

    循環控制變量的修正表達式

done

untilCONDITION; do

    循環體

    循環控制變量修正表達式

done

例如

#!/bin/bash

declare -i i=1

while [ $i -le 10 ];do

   echo $i

   let i++

done

5、循環控制命令break和continue

    break:提早退出循環;

    break [N]: 退出N層循環;N省略時表示退出break語句所在的循環;

    continue: 提早結束本輪循環,而直接進入下輪循環;

    continue [N]:提早第N層的循環的本輪循環,而直接進入下輪循環;

 

4、函數

定義函數的目的:將有特定功能的代碼塊,定義一個函數名稱,在要使用此代碼塊時,直接調用函數,而不用再寫一遍此代碼塊,也能夠給函數傳遞參數

function_name(){

函數代碼塊

}

例如

#!/bin/bash

testfuc() {

  echo "test function"

}

testfuc   #調用函數testfuc

函數的返回值:

    函數中使用打印語句:echo, printf

    函數體中OS命令執行結果的輸出

函數的退出狀態碼:

默認取決於函數體執行的最後一個命令的退出狀態碼;

自定義退出狀態碼:return [0-255]

注意:函數體運行時,一旦遇到return語句,函數即返回;

5、數組

數組元素:數組名+索引

    索引:從0開始編號

聲明數組:declare -a ARRAR_NAME

關聯數組:declare -A ARRAY_NAME

數組元素的賦值:

(1) 一次只賦值一個元素

    ARRAY[index]=VALUE

    a[0]="hello"

(2) 一次賦值所有元素

    ARRAY=("mon""tue" "wed")

(3) 指定索引進行賦值

    ARRAY=([0]="sun"[1]="mon" [5]="fri")

(4) read -a ARRAY

引用數組元素:${ARRAY[index]}

數組的長度:  ${#ARRAY[*]}, ${#ARRAY[@]}

例如

#!/bin/bash

declare -a testarry

for i in {0..9};do

   testarry[$i]=$RANDOM

done

echo "${testarry[*]}"

6、字符串操做

字符串切片:${var:offset:lenth}

取字符串最後的幾個字符:${var: -lenth}   注意:冒號以後有空格

基於模式取子串:

${var#*word}:其中word能夠是指定的任意字符;自左而右,查找var變量所存儲字符中,第一次出現的word,刪除字符開頭直至第一次wrod出現處之間的全部字符

   ${var##*word}: 其中word能夠是指定的任意字符;自左而右,查找var變量所存儲字符中,最後一次出現的word,刪除字符開頭直至最後一次wrod出現處之間的全部字符

${var%word*}:自右而左,刪除第一次word出現處的字符開始直到尾部的全部字符

${var%%word*}:自右而左,刪除最後一次word出現處的字符開始直到尾部的全部字符

例如 :   url=http://www.magedu.com:80

              取端口:${url##*:}

              取協議:${url%%:*}

查找並替換:

    ${var/pattern/substi}:查找var所表示的字串中,第一次被Pattern匹配到的字串,並以substi替換之

    ${var//patten/substi}:查找var所表示的字串中,全部被Pattern匹配到的字串,並以substi替換之

${var/#pattern/substi}:以行首錨定的方式將pattern匹配至var所表示的字串上,若是能匹配,則以substi替換之

    ${var/%pattern/substi}:以行尾錨定的方式將pattern匹配至var所表示的字串上,若是能匹配,則以substi替換之;可以使用?, *元字符

查找並刪除:

    ${var/pattern}:刪除pattern匹配到的第一次出現;

    ${var//pattern}:刪除pattern匹配到的全部出現;

    ${var/#pattern}

    ${var/%pattern}

字符串大小寫轉換:

    ${var^^}:小寫-->大寫

    ${var,,}:大寫-->小寫

變量賦值:

    ${var:-word}:若是var爲空或未設置,那麼返回word;不然,則返回var中的值;

    ${var:=word}:若是var爲空或未設置,那麼返回word,而且將word賦值給var;不然,返回var中的值;

${var:?err_info}:若是var爲空或未設置,那麼返回錯誤信息;不然,則返回var自身的值;

${var:+word}:若是var自身有正常數據,則返回word;

相關文章
相關標籤/搜索