Linux系統Bash(Shell)基礎知識(4)

來源:互聯網
上載者:User

標籤:設定檔   基礎知識   背景色   底線   紫紅色   

  今天給大家總結一下關於bash的顏色,設定檔,變數,數組和相關shell指令碼編程的基本概念;

  一.bash的顏色顯示規則

  吧是的顏色顯示,說白了就是Ascll碼對於顏色的調用設定,而在於顏色代碼當中,字串個功能實現如下:

  \033:表示ctrl鍵;

  [:控制字元和顏色代碼之間的佔空間字元;

  0m:關閉顏色屬性;

  1m:加粗顯示文本字元;

  4m:為文本字元加底線標識;

  5m:使文本字元閃爍;

  7m:將背景色和前景色彩調換,白變黑,黑變白;

  8m:隱藏字元,將文本字元的背景色和前景色彩設定為相同顏色,同為黑或同為白;


  30m-39m設定文本字元的前景色彩,即字型顏色,38m和39m暫時沒有用到;

  40m-49m:設定文本字元的背景色,即一個黑色字元的背景後是什麼顏色,48m和49m暫時沒有用到;

  前景   背景    顏色  

   30m    40m    黑色

   31m    41m    紅色

   32m    42m    綠色

   33m    43m    黃色

   34m    44m    藍色

   35m    45m    紫紅色

   36m    46m    青藍色

   37m    47m    白色

  加粗顯示文本字元

  [[email protected] wjq]# echo -e "\033[1mhello worl\033[0m"

  hello worl

  

  為文本字元加底線標識

  [[email protected] wjq]# echo -e "\033[4mhello worl\033[0m"

  hello worl

  

  加粗和設定底線同時進行,利用“;”分隔;

  [[email protected] wjq]# echo -e "\033[1;4mhello worl\033[0m"

  hello worl


  二.設定檔

  一個完整的程式通常包含四類檔案:

  二進位檔案:可執行檔;

  標頭檔,庫檔案;

  協助文檔;

  設定檔;

  所有在命令列進行命令的操作,只要沒有設計到檔案的修改都只是在當前生命週期有效,當關閉系統後,再開啟則無法使用;設定檔是實現資料永久顯示的基本方法,將資料的改動放入設定檔中,當系統重啟後還能重複調用,如修改alias別名放入設定檔bashrc的文字文件當中,bashrc就是一個設定檔;

  設定檔分為私人設定檔與通用設定檔

  通用設定檔:/etc/bashrc,/etc/profile

  私人設定檔:~/.bashrc,~/.bash_profile

          

  注意:一般情況下定義變數都是先做先用,並不需要改設定檔(聲明變數在設定檔中可能使系統出現漏洞)沒有必要就不要改;

  設定檔又分為三類:

  profile類:

  為互動式登陸的shell進程實現功能初始化的設定檔;

  bashrc類:

  為非互動式登陸的shell進程實現功能啟動配置的設定檔;

  logout類:

  為互動式登陸的shell進程提供終止及清理類功能的設定檔;


  互動式登入:

  1.通過某個終端輸入帳號密碼來開啟的shell進程;

  2.通過su - username開啟的shell進程;

  非互動式登陸:

  1.在圖形介面,通過右鍵菜單開啟終端的shell進程;

  2.通過su username開啟的shell進程;


  profile類:

  /etc/profile

  /etc/profile.d/*.sh

  全域:在上述路徑中對設定檔進行修改,能對所有登陸的使用者進行改變;

  往往在profile檔案中,如果一個設定檔中的內容過多,系統會把其切割成一個個片段,如profile.d,將切割出來的片段統

  一的存放在”程式名稱.d“目錄,在該目錄下有關於片段的所有檔案大多以統一的檔案名稱尾碼來命名;

  

  ~/.bash_profile

  局部:僅針對當前家目錄的使用者,對其進行改變,不影響其他使用者;


 bashrc類:

 /etc/bashrc

 全域:可以定義對系統全部使用者有效命令別名,本地變數,以及遮罩碼umask;

 ~/.bashrc

 局部:定義對於目前使用者有效命令別名,本地變數,以及遮罩碼umask;


 三.變數應用

 1.字串切片

 ${#var:}:返回變數var的字串長度;

 ${var:offset}:返回字串變數var的第offset個字元後面的字串;

 ${var:offset:number}:返回字串變數var的第offset個字元後面的number個字元;

 例

 [[email protected] wjq]# var="hello world"

 [[email protected] wjq]# echo ${#var}

 11

 返回第六個字元後的字串

 [[email protected] wjq]# echo ${var:6}

 world

 返回第六個字元後的兩個字串

 [[email protected] wjq]# echo ${var:6:2}

 wo

 

 2.基於模式取字串:根據不同方式取符合pattern的字串

 ${var#*pattern}:在var字串變數中,從左至右搜尋第一個匹配字串pattern的字元,刪除從開始到第一個匹配到pattern的所有字元;


 ${var##*pattern}:在var字串變數中,從左至右搜尋最後一個匹配字串pattern的字元,刪除從開始到最後一個匹配到pattern的所有字元;


 ${var%pattern*}:在var字串變數中,從右至左搜尋第一個匹配到pattern的字元,刪除從開始到從右至左匹配的第一個pattern之間的所有字元;


 ${var%%pattern*}:在var字串變數中,從右至左搜尋最後一個匹配到pattern的字元,刪除從開始到從右至左最後一個匹配到的字元之間的所有字元;

 

 例

 ①

 [[email protected] wjq]# var=/etc/passwd

 [[email protected] wjq]# echo ${var#*p}

 asswd

 ②

 [[email protected] ~]$ var=/etc/passwd

 [[email protected] ~]$ echo "${var##*/}"

 passwd

 ③

 [[email protected] ~]$ var=/etc/passwd

 [[email protected] ~]$ echo "${var%s*}"

 /etc/pas

 [[email protected] ~]$ 

 ④

 [[email protected] ~]$ var=/etc/passwd

 [[email protected] ~]$ echo "${var%%s*}"

 /etc/pa

 [[email protected] ~]$ 


 3.尋找替換:利用不同方式,搜尋字串中匹配pattern的字元,並用substring字串對其進行替換;

 ${var/pattern/substring}:在var字串變數中,搜尋第一個匹配到pattern的字串,並用substring字串對其進行替換;


 ${var//pattern/substring}:在var字串變數中,搜尋所有匹配到字串pattern的字串,並用substring字串進行替換;


 ${var/#pattern/substring}:在var字串變數中,搜尋行首匹配到字串pattern的字串,並用substring字串進行替換;


 ${var/%pattern/substring}:在var字串變數中,搜尋行尾匹配到字串pattern的字串,並用substring字串進行替換;


 例

 ①

 [[email protected] ~]$ var=/etc/passwd

 [[email protected] ~]$ echo "${var/e/wu}"

 /wutc/passwd

 ②

 [[email protected] ~]$ var=/etc/passwd

 [[email protected] ~]$ echo "${var//s/wu}"

 /etc/pawuwuwd

 ③

 [[email protected] ~]$ var=/etc/passwd

 [[email protected] ~]$ echo "${var/#\//wu}"

 wuetc/passwd

 ④

 [[email protected] ~]$ var=/etc/passwd

 [[email protected] ~]$ echo "${var/%d/wu}"

 /etc/passwwu


 4.尋找刪除:利用不同方式,搜尋匹配到的字串並刪除;

 ${var/pattern}:在字串變數var中,將第一次匹配到pattern的字串刪除;


 ${var//pattern}:在字串變數var中,將全部匹配到pattern的字串刪除;


 ${var/#pattern}:在字串變數var中,將行首匹配到pattern的字串刪除;

 

 ${var/%pattern}:在字串變數var中,將行尾匹配到pattern的字串刪除;


 例

 ①

 [[email protected] ~]$ var=/etc/passwd

 [[email protected] ~]$ echo "${var/p}"

 /etc/asswd

 ②

 [[email protected] ~]$ var=/etc/passwd

 [[email protected] ~]$ echo "${var//s}"

 /etc/pawd

 ③

 [[email protected] ~]$ echo "${var/#\/}"

 etc/passwd

 ④

 [[email protected] ~]$ echo "${var/%wd}"

 /etc/pass


 5.字元的大小寫轉換:

 ${var^^}:將字串var變數中的所有小寫字母轉換成大寫字母;

 ${var,,}:將字串var變數中的所有大寫字母轉換成小寫字母;


 例

 ①

 [[email protected] ~]$ var=/etc/passwd

 [[email protected] ~]$ echo "${var^^}"

 /ETC/PASSWD

 [[email protected] ~]$ 



 6.變數賦值:

 ${var:-value}:如果變數var為空白或未被設定,那麼直接返回value值,否則返回變數var值;


 ${var:+value}:如果變數var不為空白,則返回value,為空白則返回var;


 ${var:=value}:如果變數var為空白或者未被設定,那麼直接返回value值,並且將value值賦值給變數var,否則返回var值;


 例

 ①

 [[email protected] ~]$ var=//

 [[email protected] ~]$ echo "${var:-qq}"

 //

 [[email protected] ~]$ var=

 [[email protected] ~]$ echo "${var:-qq}"

 qq


 ②

 [[email protected] ~]$ var=

 [[email protected] ~]$ echo "${var:+qq}"

 [[email protected] ~]$ var=a

 [[email protected] ~]$ echo "${var:+qq}"

 qq


 7.變數的間接引用:

 如果第一個變數的值恰好是第二個變數的變數名,從第一個變數引用第二個變數的值的方法,就稱為間接變數引用;

 var1=var2

 var2=value

 bash提供了兩種格式的間接變數引用方式:

 eval myvar=\$$var1==>\$var2

 myvar=$(!var1)


 四.數組

 數組:相當於幾個變數的集合,存放著一個或多個記憶體空間;

 在bash中只提供一維數組,並且沒有限定數組大小,利用下標存取數組中的元素,數組元素由下標0開始編號即數組的索引結點:0,1,2...,數組可以採用連續的索引結點進行賦值——稠密數組,也可以採用不連續的索引結點進行賦值——稀疏數組。

 數組名[下標]=值

 例如:

 $a[0]=beijing

 $a[1]=hainan

 $a[2]=shanghai


 數組的聲明:

 1.數組可以採用上述聲明方式逐個賦值

 2.直接對數組元素進行賦值:

 $a=("beijing" "shanghai" "tianjin")或者$a=([0]="beijing" [1]="shanghai" [3]="tianjin")

 3.利用declare命令建立數組:

 $declare -a 數組名

 

 引用數組元素:

 1.$name或${name},兩者相同,若變數未定義則用空值替換;

 2.引用固定的數組元素:${name[n]}引用索引結點為n的值;

 3.引用整個數組的所有元素:${name[*]}或${name[@]}


 例

 [[email protected] ~]$ a[0]=beijing

 [[email protected] ~]$ echo "${a[0]}"

 beijing


 [[email protected] ~]$ a=("wujunqi zhengzhong shaoning")

 [[email protected] ~]$ echo "${a[0]} ${a[1]} ${a[2]}"

 wujunqi zhengzhong shaoning 


 查看數組的長度:

 可以通過${#name[*]}顯示出這個數組有多少個有意義的元素;

 例

 [[email protected] ~]$ a=(wujunqi zhengzhong shaoning)

 [[email protected] ~]$ echo "${#a[*]}"

 3


 數組切片:

 ${name:offset}:顯示包括offset數字所表示的索引位置及以後的所有元素,去掉從第一個數組開始的offset個數組元素

 ${name:offset:number}:顯示包括offset數字所表示的索引位置及包括offset個元素的number個元素;

 如${name:3:2}:丟棄0-2的陣列變數,只取3,4陣列變數;

 

 撤銷數組:

 unset array_name


 刪除數組中的元素:

 unset array_name[index]


 RANDOM變數:可以產生一組在0-32767之間的隨機變數

 例

 [[email protected] ~]$ echo "$RANDOM"

 16952

 [[email protected] ~]$ echo "$RANDOM"

 6653

 

 五.bash指令碼編程

 shell指令碼編程有三種:

 過程式程式設計語言

 指令碼類程式設計語言

 解釋性語言

 其中指令碼類程式設計語言在實現功能時是通過調用外部檔案來實現的;

 

 過程式程式設計語言有三種結構,順序執行結構,選擇執行結構和迴圈分支結構;

 1.順序執行結構:

 根據使用者所寫的指令碼命令,從左至右,從上到下按順序執行;

 

 2.選擇執行結構:

 對於某特定語句,重複執行0次,一次或多次;如if,case語句;

 if語句:

 單分支語句:

 if 測試條件

 then 命令

 fi


 雙分支語句:

 if 測試條件

 then 命令1

 else 命令2

 fi


 多分支語句:

 if 測試條件

 then 命令1

 elif 測試條件

 then 命令2

 。。。

 fi

 

 例

 計算100以內所有整數的和;

 #!/bin/bash

 #

 read -t 5 -p "Please input a integer[0]: " INTEGER

 if [ -z $INTEGER ] ; then

 INTEGER=0

 fi

 if ! echo $INTEGER | grep -q "^\<[[:digit:]]\+\>$" ; then

 echo "You must input an integer."

 exit 5

 fi


 case語句:

 可以進行多重條件選擇,相對於if,else的多分支語句,case語句的優勢就在於節約了系統所消耗的資源,其文法格式為:

 case 變數引用 in

    模式1)

      分支1

      ;;

    模式2)

      分支2

      ;;

      ...

      *)

    預設分支

    ;;

  esac

 其執行過程是,利用變數引用所代表的值分別與各類模式進行比較,如果發現變數引用的值與某一類模式相同時,就執行該模式字串之後的各個命令,直到遇到兩個分號結束為止;

 case語句的模式可以匹配數字,字串,萬用字元等模式;

 注意:

 ①每個模式字串後面可有一條或多條命令,最後一條命令必須要由“;;”隔開

 ②模式字串可以使用萬用字元;

 ③如果一個模式字串包含多個模式,則應用“|”隔開;

 ④各模式字串應唯一;

 ⑤以關鍵字esac結束;


 3.迴圈分支結構

 將一段代碼重複的執行0次,1次或多次;一個好的迴圈結構必須要包括兩個最重要的環節,即進入迴圈的條件:開始迴圈時所滿足的條件;

 退出迴圈的條件:

 迴圈結束所滿足的條件;

 shell中有三種用於迴圈的語句,即for,whie,until,select語句;

 for語句:

 for語句是最常用的迴圈結構語句。其使用方式主要有兩種,一種是值表方式,另一種是算術運算式方式;for迴圈特點,幾乎不會死迴圈,在執行迴圈的過程中,需要將這個LIST載入到記憶體當中;因此對於大列表來說可能會過多的消耗記憶體和cpu資源;

 值表方式

 其一般運算式為

 for 變數 [in 值表];do 命令表;done

 ①值表可以是檔案Regex,其格式為:

 for 變數 in 檔案Regex

 do

   命令表

 done

 其執行過程是,變數的值依次取目前的目錄下與Regex相匹配的檔案名稱,每取值一次,就進入迴圈體執行命令表,直至所有檔案名稱取完為止;

  

 bash指令碼編程之使用者互動:

 位置參數變數:$1,$2,$3,...

 特殊變數:

  $#:所有位置參數的總數;

  $*:所有位置參數列表;當使用“”引用時,整個參數被當作一個字串;

  [email protected]:所有位置參數列表;當使用“”引用時,每個參數作為單獨的字串存在;

  $0:所執行指令檔自身的路徑;

 

 ②for迴圈指令碼也可以是全部的位置參數$#與$*

 for 變數 in $*

 do

   命令

 done

 

 ③

 for迴圈指令碼可以直接使用純整數列表

 {1..100}:表明從1-100,中間只能為兩點;

 for i in {1..100}

 do

   命令

 done


 seq:輸出一個整數列表

 seq [OPTION]... FIRST INCREMENT LAST

 seq 10:從1-10

 seq 5 10:從5-10

 for i in $(seq 10)

 do

   命令

 done

 

 在這裡擴充一下關於read命令的功能

 read 命令:從鍵盤上讀取資料,然後賦給指定變數;

 read [-a 數組] [-p 提示符] [-t 逾時] []

 利用read命令可互動的為變數賦值,輸入資料時,資料間以空格或定位字元作為分隔字元;

 ①

 變數個數與給定資料個數相同,則依次賦值

 $read x y z

 $today is sunny

 $echo $x $y $z

 today is sunny

 ②

 變數個數少於資料個數,則從左至右賦值,但最後一個變數被賦予剩餘的所有數;

 ③

 變數個數多於資料個數,則依次對應賦值,而沒有資料與之對應的變數取空串;

 例

 在指令碼中-p選項給提示資訊,相當於echo

 $read -p "please enter" name

 

 -t選項5秒鐘內如果沒有進行輸入則返回,預設名字為link;

 $read -t 5 -p "please enter[link]" name || [ -z $name] && name=link

  

 算術運算式方式:

 其一般格式為

 for((運算式1; 運算式2; 運算式3 ))

 do

   命令表

 done

 運算式1:為變數賦初值;

 運算式2:迴圈允出準則;

 運算式3:變數值的變化規律;

 如

 for((T=1;I<=100;I++));do let "sum+=I";done;echo $sum


 while語句:

 格式:

 ①while 命令;do 命令;done

 ②while CONDITION;do

   迴圈體

   done

   當CONDITION為真時,進入執行迴圈體中的語句,直至CONDITION為假時,跳出迴圈;

   例當位置參數$1存在時執行while迴圈

   while [ $1 ]

   do

    if [ -f $1 ]

    then

      echo "該檔案為普通文字檔"

    else

      echo "$1 is not a file"

    fi

   done


 until語句:

 格式:

 ①until 命令;do 命令;done

 ②until CONDITION;do

    迴圈體

  done

  當CONDITION為假時,進入執行迴圈體中的語句,直至CONDITION為真時,跳出迴圈;


 迴圈控制命令:

 continue語句:

 跳出當前迴圈語句,回到本層迴圈的開頭,進入下一輪條件判斷,若符合條件則進入下一輪迴圈;

 若處在多層嵌套迴圈中,如:

 for

   while 

      for 

        continue [3]

 跳出到最外層的迴圈,進行最外層迴圈的下一輪條件判斷,若符合則繼續迴圈;

 例如:

 for i in 1 2 3

 do

   if [ $i -eq 2 ]

   then

      continue

   fi

   echo "$i"

 done


 break語句:

 break語句可以使指令碼從迴圈體中退出來,同continue相似,文法格式為:

 break [n]

 n預設值為1,即跳出一層迴圈;

 若n=3時,表示連續跳出三層迴圈;

 例如

 for i in $*

 do

   if [ $i -eq 5 ]

   then

       break

   else

       echo "$i"

   fi

 done

 當位置參數等於5時退出當前迴圈;


函數:

 由某些功能封裝在一起,在需要的時候可以直接調用,將這種封裝起來的功能體稱作為函數;

 函數與shell程式在形式上是一致的,但是,shell程式是可以直接執行的,但函數中的語句是要通過函數調用過後才能被執行;此外,函數中的命令是在當前shell的環境中運行,而shell程式中的命令是在子shell環境中運行;

 函數應先定義之後才能被執行,可以像普通命令一樣直接使用,直接利用函數名,如show,不必帶圓括弧即可調用;shell指令碼與函數之間可以進行參數傳遞,函數中的$1,$2所對應的值是函數在調用時所帶的實參,還可以使用$*或[email protected]的方式引用所有位置參數;還可以使用$#計算為函數傳遞的參數個數;這一點與普通命令不同;函數的生命週期是從被調用開始直到遇到return結束命令或全部的命令語句執行完為止;

 如

 show arg1 arg2

 arg1和arg2作為函數的實參;


 函數定義格式:

 文法一:

 函數名()

 {

 命令表

 }

 文法二:

 function 函數名()

 {

  命令表

 }

 

 使用set命令可以查看所有當前shell中生效的函數;

 使用unset命令可以撤銷已經定義的函數;

 

 調用函數之後函數的傳回值有兩種:

 ①函數結果的傳回值

 如echo,print等輸出結果;

 ②函數狀態傳回值;

 return [0];

 函數的傳回值不能用exit命令,n為退出函數時的退出值,即$?的值,n值預設時,則退出值是最後一個命令執行後的傳回值;

 

 

 


Linux系統Bash(Shell)基礎知識(4)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.