Bash 基礎(chǔ)特性及shell編程基礎(chǔ)

Bash內(nèi)置基本變量

  1. PWD : 顯示當(dāng)前的工作目錄
  2. OLDPWD : 顯示上一次的工作目錄
  3. ~:用戶家目錄
  4. - : 使用cd -命令可以在上一次工作目錄和當(dāng)前工作目錄中來回切換
  5. HISTSIZE : 顯示shell中歷史命令保留數(shù)量
  6. HISTFILE : 顯示歷史命令文件存放路徑
  7. HISTFILESIZE : 顯示歷史命令文件存放命令數(shù)量
  8. HISTCONTROL : 顯示歷史命令記錄方式
    • ignoredups : 讓歷史命令保存方式為『不記錄連續(xù)重復(fù)命令』
    • ignorespace: 讓歷史命令保存方式為「不記錄以空格開頭的命令」
    • ignoreboth : 以上兩個皆有
  9. !# : 代表執(zhí)行歷史記錄中#號命令
  10. !! : 執(zhí)行上一次歷史命令
  11. Esc,. : 提取上一次命令最后一個參數(shù)
  12. !$ : 提取上一次命令最后一個參數(shù)
  13. PATH : 環(huán)境變量
  14. $? : 上一次命令的執(zhí)行狀態(tài)結(jié)果
  15. SHELL : 當(dāng)前shell
  16. home : 家目錄路徑
  17. UID : 用戶的UID
  18. GID : 用戶的GID
  19. USER: 用戶名

bash特性之命令行展開

  1. ~ : 自動展開為用戶家目錄
  2. {} :中間以多個" , "號為分隔茎活,依次展開為多個數(shù)量

bash特性之執(zhí)行狀態(tài)結(jié)果

  1. 成功 == 0
  2. 失敗 == 1-255

bash特性之命令結(jié)果引用

  1. `COMMAND`
  2. $(COMMAND)

bash特性之引用

  1. 轉(zhuǎn)義:用反斜杠在需要轉(zhuǎn)義的字符前,表示這個字符需要看作一個普通字符
  2. 強(qiáng)引用:使用” ` “把所有內(nèi)容都引起來,``號中的所有內(nèi)容都看作為普通字符骏全,除了引號自身渣触,所以不要在``號內(nèi)再加``號
  3. 弱引用:使用” “把內(nèi)容都引起來孟害,除了引號自身,把大部分字符都看作普通字符祖今,例外的有 ,$ , ` 妆距,三個特殊字符

bash特性之元字符

  1. * : 任意長度的任意字符
  2. ? : 單個字符
  3. [] : 指定范圍內(nèi)的任意字符
  4. [^] : 指定范圍外的任意字符
    • 特殊格式
      • [a-z]:任意字母(glob中不分大小寫)
      • [0-9]:任意一個數(shù)字
      • [a-z0-9]:任意一個數(shù)字和字母
      • [:alpha:] :大寫及字母
      • [:upper:] :大寫字母
      • [:lower:] :小寫字母
      • [:digit:] :數(shù)字
      • [:alnum:] :數(shù)字和字母
      • [:space:] :空白(包含空格和制表格)
      • [:punct:]:標(biāo)點符號

bash特性之hash

緩存之前命令查找的結(jié)果穷遂,就叫命令hash,也叫命令緩存,可以使用hash命令查看其緩存的命令的完事路徑及命中的次數(shù)娱据。

  • hash

    options:

      -d [COMMAND] :清除指定的緩存命令
      -r : 清空hash表
    

===============

shell編程基礎(chǔ)

shell編程之變量

什么是變量蚪黑?
內(nèi)存空間地址+數(shù)據(jù),數(shù)據(jù)是放在內(nèi)存中吸耿,即也叫有名稱的內(nèi)存地址
變量的值的類型祠锣,決定了存儲格式、表示的數(shù)據(jù)范圍咽安、參與的運算
變量賦值
`name=VALUE`
bash對變量的機(jī)制
  1. 所有都看作字符型
  2. 不支持浮點數(shù)據(jù)伴网,需借用外部機(jī)制
  3. 變量無需事先申明,相當(dāng)于妆棒,賦值和申明同時實現(xiàn)
程序中變量引用的機(jī)制
把變量名出現(xiàn)的位置澡腾,直接替換為其所指向的內(nèi)存空間中的數(shù)據(jù)
變量的命名規(guī)范
  1. 不能以數(shù)字開頭,只能包含數(shù)字糕珊、字母动分、下劃線
  2. 變量名要做到見名知義
  3. 不能使用程序語言的保留字(if else where等)
變量的引用
  1. ${var_name}
  2. $var_name
變量的類型
  1. 本地變量:作用范圍僅為當(dāng)前shell;
  2. 環(huán)境變量:作用范圍當(dāng)前進(jìn)程和其子進(jìn)程
  3. 局部變量:作用范圍為某片代碼片;
  4. 特殊變量:shell內(nèi)置的红选,有特殊功用
    • 0 = 成功
    • 1-255 = 失敗
各變量的賦值澜公、引用 、查看喇肋、刪除
本地變量
  • 變量的定義
    • var_name=VALUE
  • 變量的引用
    • ${var_name} ,$name
  • 變量的查看
    • set
  • 變量的撤消
    • unset var_name (此次不需要加$)
環(huán)境變量
  • 變量的定義

    • export var_name=value
    • var_name=value --> export var_name
    • declare -x var_name=VALUE (-x 表示定義為一個環(huán)境變量)
      • declare -i var_name=VALUE (直接將var_name定義為整形)
  • 變量的引用

    • ${var_name} $var_name
  • 變量的查看

    • export
    • declare -x
    • printenv
    • env
  • 變量的撤消

    • unset var_name
只讀變量的定義
  • declare -r var_name=VALUE (只讀變量只有進(jìn)程結(jié)果后才會消息坟乾,如果定義在環(huán)境配置文件中,需要手動清除)
  • readonly name
增強(qiáng)型變量賦值
  • i=1
  • i=$[$i+1]
  • let i+=1
  • let i+=2
變量做某種運算后存至變量中
  • let i=$i+# 等同 let i+=#
    • +=, -=, *=, /=, %= 都需要使用let命令進(jìn)行描述
  • 變量的自增
    var=$[$var+1] == let var+=1 == let var++
  • 變量的自減
    var=$[$var-1] == let var-=1 == let var--

=============

bash之切片

基于字符串切片

Usage: ${var:offset: length}

例:
    [root@localhost ~]#mypath="/etc/sysconfig/network-scripts/"    #定義一個變量蝶防,等會切這個變量
    [root@localhost ~]# echo ${mypath:5}       #偏移5個字符顯示
    sysconfig/network-scripts/
    [root@localhost ~]# echo ${mypath:10}     #偏移10個字符顯示
    nfig/network-scripts/
    [root@localhost ~]# echo ${mypath:5:5}    #偏移5個字符甚侣,取5個字符 
    sysco   
    
    取出字符串的最后幾個字符:${var: -length}
        注意:-length之前有空白字符;
    [root@localhost ~]# echo ${mypath: -10}
    k-scripts/
基于模式取子串
  • Usage:
    1. ${var#*word}:自左而右间学,查找var變量中存儲的字符串中第一次出現(xiàn)的由word所指明的字符殷费,刪除字符及其左側(cè)的所有內(nèi)容
    2. ${var##*word}:自左而右印荔,查找var變量中存儲的字符串中最后一次出現(xiàn)的由word所指明的字符,刪除字符及其左側(cè)的所有內(nèi)容
    3. ${var%word*}:自右而左详羡,查找var變量中存儲的字符串中第一次出現(xiàn)的由word所指明的字符仍律,刪除字符及其右側(cè)的所有內(nèi)容
    4. ${var%%word*}:自右而左,查找var變量中存儲的字符串中最后一次出現(xiàn)的由word所指明的字符实柠,刪除此字符及其右側(cè)的所有內(nèi)容
示例:
    [root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
    [root@localhost ~]# echo ${mypath#*/}
    etc/sysconfig/network-scripts
    
    [root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
    [root@localhost ~]# echo ${mypath##*/}
    network-scripts
    
    [root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
    [root@localhost ~]# echo ${mypath%c*}
    /etc/sysconfig/network-s
    [root@localhost ~]# echo ${mypath%%c*}
    /et
基于字串查找替換
  • Usage:
    1. ${var/pattern/replacement} :查找var變量存儲的字符中第一次由pattern匹配到的內(nèi)容染苛,并替換為replacement
    2. ${var//pattern/replacement} :查找var變量存儲的字符中所有能夠由pattern匹配到的內(nèi)容,并替換為replacement
    3. ${var/#pattern/replacement} :查找var變量存儲的字符中最開始處能夠由pattern匹配到的內(nèi)容主到,并替換為replacement
    4. ${var/%pattern/replacement} : 查找var變量存儲的字符中最后位置能夠由pattern匹配到的內(nèi)容,并替換為replacement
示例:
    [root@localhost ~]#url="http://www.baidu.com:80"
    [root@localhost ~]# echo ${url/www/WWW}
    http://WWW.baidu.com:80
    [root@localhost ~]# echo ${url/w/W}
    http://Www.baidu.com:80
    
    [root@localhost ~]# echo ${url//w/W}
    http://WWW.baidu.com:80
    
    [root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/bash"
    [root@localhost ~]# echo ${userinfo/#root/ROOT}
    ROOT:x:0:0:root user:/root:/bin/bash
    
    [root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/root"
    [root@localhost ~]# echo ${userinfo/%root/ROOT}
    root:x:0:0:root user:/root:/bin/ROOT
基于字串查找刪除
  • Usage:
    1. ${var/pattern}:查找var變量存儲的字符中第一次由pattern匹配到的內(nèi)容躯概,并刪除登钥;
    2. ${var//pattern}:查找var變量存儲的字符中所有能夠由pattern匹配到的內(nèi)容,并刪除娶靡;
    3. ${var/#pattern}:查找var變量存儲的字符中最開始處能夠由pattern匹配到的內(nèi)容牧牢,并刪除;
    4. ${var/%pattern}:查找var變量存儲的字符中最后位置能夠由pattern匹配到的內(nèi)容姿锭,并刪除塔鳍;
示例:
[root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/root"
[root@localhost ~]# echo ${userinfo/root}
:x:0:0:root user:/root:/bin/root
[root@localhost ~]# echo ${userinfo//root}
:x:0:0: user:/:/bin/
[root@localhost ~]# echo ${userinfo/#root}
:x:0:0:root user:/root:/bin/root
[root@localhost ~]# echo ${userinfo/%root}
root:x:0:0:root user:/root:/bin/
基于字符串大小寫轉(zhuǎn)換
  • Usage:
    1. ${var^^}:把var變量中的所有小寫字母,統(tǒng)統(tǒng)替換為大寫呻此;
    2. ${var,,}:把var變量中的所有大寫字母轮纫,統(tǒng)統(tǒng)替換為小寫;
示例
[root@localhost ~]# echo $userinfo
root:x:0:0:root user:/root:/bin/root
[root@localhost ~]# myinfo=${userinfo^^}
[root@localhost ~]# echo $myinfo
ROOT:X:0:0:ROOT USER:/ROOT:/BIN/ROOT
[root@localhost ~]# echo ${myinfo,,}
root:x:0:0:root user:/root:/bin/root

空變量判斷賦值

  • Usage:
    1. ${var:-word}:如果變量var為空或未聲明焚鲜,則返回word所表示的字符串掌唾;否則,則返回var變量的值, 臨時賦值

       [root@localhost ~]# echo $name
                     #這行的值為空
       [root@localhost ~]# echo ${name:-tom}
       tom
       [root@localhost ~]# name=hello 
       [root@localhost ~]# echo ${name:-tom}           hello
      
    2. ${var:=word}:如果變量var為空或未聲明忿磅,則返回word所表示的字符串糯彬,并且把word賦值為var變量;否則葱她,則返回var變量的值撩扒,直接等值

       [root@localhost ~]# echo $name
                   #這行的值為空
       [root@localhost ~]# name=${name:-tom}
       [root@localhost ~]# echo $name
       tom
       [root@localhost ~]# name=${name:-jerry}
       [root@localhost ~]# echo $name
       tom
      
    3. ${var:?error}:如果變量var為空或未聲明,則返回error為錯誤信息吨些;否則搓谆,則返回var變量的值;

       [root@localhost ~]# echo "User's name is${name:?wrong}"
       -bash: name: wrong
       [root@localhost ~]# name=tom
       [root@localhost ~]# echo "User's name is${name:?wrong}"
       User's name is tom
      
    4. ${var:+word}:如果變量var為空或未聲明锤灿,忽略挽拔;否則,則返回word但校;

       [root@localhost ~]# unset name
       [root@localhost ~]# echo "User's name is${name:+wrong}"
       User's name is 
       [root@localhost ~]# name=tom
       [root@localhost ~]# echo "User's name is${name:+wrong}"
       User's name is wrong
      

===============

bash多命令執(zhí)行

  1. 無邏輯關(guān)系的

    • COMMAND1;COMMAND2;COMMAND3...
  2. 有邏輯關(guān)系的

    • 邏輯的運算結(jié)果狀態(tài):

      • (True 螃诅,1
      • (False ,0
    • 與運算(乘法)

      • 1&&1=1
      • 1&&0=0
      • 0&&1=0
      • 0&&0=0
        • 只有兩個都為真,結(jié)果才為真,否則為假(遵守短路法則)
    • 或運算 :加法

      • 1 || 0 = 1
      • 1 || 1 = 1
      • 0 || 1 = 1
      • 0 || 0 = 0
        • 只要一個為真术裸,即為真倘是,(類似電路并鏈)
    • 非:取反

      • ! 1 = 0
      • ! 0 = 1
    • 異或:判斷是否不同

      • 不同者為真,相同者為零假
短路法則:
#COMMAND1 && COMMAND2 : 
    COMMAND1為『假』袭艺,COMMAND2不會再執(zhí)行搀崭,
    COMMAND1為『真』,COMMAND2必須執(zhí)行
#COMMAND1 || COMMAND2
    COMMAND1為『真』猾编;COMMAND2不會執(zhí)行
    COMMAND1為『假』瘤睹;COMMAND2必須執(zhí)行
    例:# id $username || useradd $username

bash的配置文件

1、bash配置文件的分類
  • profile類:為交互式shell提供配置文件
    • 全局配置
      • /etc/profile
      • /etc/profile.d/*.sh
    • 用戶個人
      • ~/.bash_profile
  • bashrc類: 為非交互式用戶提供配置文件
    • 全局配置
      • /etc/bashrc
    • 用戶個人
      • ~/.bashrc
2答倡、profile轰传、bashrc類的功用
  • profile類
    • 定義用戶的全局變量
    • 運行命令和腳本
  • bashrc類
    • 定義本地變量
    • 定義別名
3、登錄式shell瘪撇、非登錄shell讀取配置文件的順序
  1. 登錄式shell讀取順序
    • /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
  2. 非登錄式shell讀取順序
    • ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
4获茬、讓定義的配置文件立即生效
  • source /PATH/TO/PROFILE
  • . /PATH/TO/PROFILE
注意: 需要定義全局的別名,需修改/etc/bashrc文件

bash之算術(shù)運算

  1. let命令

    • let SUM=$num1+$num2
    • echo $SUM
  2. 算術(shù)運算表達(dá)式一:

    • echo $[ $num1 + $num2 ]
  3. 算術(shù)運算表達(dá)式二:

    • echo $(($num1 + $num2))
  4. 算術(shù)運算表達(dá)式三:

    • expr $num1 + $num2
  5. bash的運算符

    • + - * / ** %
注意:乘法符號在有些場景中使用需要加轉(zhuǎn)義符

Bash之條件測試:

判斷某需求是否滿足倔既,需要由測試機(jī)制來實現(xiàn)

1. 使用執(zhí)行命令恕曲,并利用命令狀態(tài)返回值來判斷

  • 0:成功,
  • 1-255:失敗

2. 測試表達(dá)式格式

  • test expression
  • [ expression ] :括號前后兩端必須有空格渤涌,否則為語法錯誤
  • [[ expression ]] :括號前后兩端必須有空格佩谣,否則為語法錯誤, 多為測試字符串

bash的測試類型:

  1. 數(shù)據(jù)測試
    • 數(shù)值比較
      • -eq : 是否等;[ $nu1 -eq $num2 ]
      • -ne : 是否不等于歼捏;
      • -gt : 是否大于
      • -ge : 大于等于
      • -lt : 是否小于
      • -le : 是否小于等于
        • 注意:可以使用[],[[ ]],建立使用[]
    • 字符串測試 : 1稿存、字符串要加引號引用 ;2瞳秽、做比較時使用雙中括號[[ ]]
      • == :是否等于
      • > : 是否大于瓣履,此處也要使用雙中括號
      • < : 是否小于,此處也要使用雙中括號
      • != :是否不等于
      • =~ :左側(cè)的字符串是否能被右側(cè)的pattern所匹配练俐,匹配為一部分袖迎,不是精確匹配
      • -z “STRING” : 判斷指定的字串是否為空,空則為真腺晾,不空則假
      • -n “string” :判斷指定的字串是否不空燕锥,空則為假,不空則真
        • 注意:字符串與變量比較時悯蝉,最好能在變量上加” ”引起來,在字符串比較的時候归形, 最好能使用雙中括號,建議使用[[ ]] 鼻由,做等值比較時暇榴,必須要在等號前后空格厚棵,如果引用是變量,也是需要加空格蔼紧,變量名可以不用引號引起來
  2. 文件測試
    • 存在性測試:
      • -a FILE
      • -e FILE
        • 文件的存在性測試婆硬,存在則為真,否則則為假
    • 存在性及文件類型
      • -b FILE : 是否存在奸例,并且為塊設(shè)備文件
      • -c FILE : 是否存在彬犯,并且為字符設(shè)備文件
      • -d FILE : 是否存在,并且為目錄文件
      • -f FILE : 是否存在查吊, 并且為普通文件
      • -h FILE 或者 -L FILE : 是否存在并且為符號連接文件
      • -p FILE : 是否存在谐区, 且為命名管道文件
      • -S FILE :是否存在,且為套接字文件
  3. 文件權(quán)限測試
    • -r FILE : 是否存在逻卖,并且可讀卢佣,對當(dāng)前用戶可讀
    • -w FILE : 是否存在, 并且可寫
    • -x FILE : 是否存在箭阶, 并且可執(zhí)行
  4. 特殊權(quán)限測試
    • -g FILE : 是否存在煎饼, 并且擁有SGID權(quán)限
    • -u FILE : 是否存在嚎杨,并且擁有SUID權(quán)限
    • -k FILE : 是否存在迷殿, 且擁有sticky權(quán)限
  5. 文件是否有內(nèi)容
    • -s FILE :是否存在看尼,并且是否有內(nèi)容
  6. 時間戳測試
    • -N FILE : 文件自從上一次讀取操作后晴楔,是否被修改過
  7. 從屬關(guān)系測試:
    • -O FILE : 當(dāng)前用戶是否為文件的屬主
    • -G FILE : 當(dāng)前用戶是否屬于文件的屬組
  8. 雙目測試(文件新舊對比)
    • FILE1 -ef FILE2 : FILE1 與FILE2是否為指向同一個文件系統(tǒng)上的相同的inode的硬連接
    • FILE1 -nt FILE2 : FILE1是否新于FILE2
    • FILE1 -ot FILE2 : FILE1是否舊于FILE2
  9. 組合測試條件
    • 邏輯運算:
      • 第一種:
        • COMMAND1 && COMMAND2
        • COMMAND1 || COMMAND2
        • !COMMAND
          • 例:[ -O FILE ] && [ -r FILE] :是否可讀并且為屬主
      • 第二種:
        • [ expression1 -a expression2 ]
        • [ expression1 -o expression2 ]
        • ![ expression1 ]
          • 例: [ -O FILE -a -x FILE ] : 是否是屬主并且有執(zhí)行權(quán)限
注意:-a -o 只能在[]中使用载矿,如果需要在雙括號中使用邏輯換算漆羔,需要使用 && || 來代替

Bash腳本之狀態(tài)返回值:

  • 默認(rèn)是腳本中執(zhí)行的最后一條命令的狀態(tài)返回值剿干。
  • 自定義狀態(tài)退出狀態(tài)碼:
    • exit [n] :n為自己指定的狀態(tài)碼婆芦;0表示成功怕磨,非零表示失敗
      • 注意:shell進(jìn)程遇到exit時,即會中止消约,因此整個腳本執(zhí)行即為結(jié)束

bash編程之向腳本傳遞參數(shù)

  1. 位置參數(shù)變量
    • 例:myscript.sh argu1 argu2
  2. 腳本中引用方式:
    • $1,$2…….${10},${11},….
  3. 位置參數(shù)變量輪替
    • shift : 把引用過的參數(shù)T掉肠鲫,在腳本中永遠(yuǎn)只使用$1引用下一個
      • 例: shift 2 : 踢兩個,這樣就可以在腳本中永遠(yuǎn)以$1和$2來引用后面的參數(shù)

bash編程之特殊變量

  • $0 :腳本文件路徑本身或粮; 取文件名:basename $0
  • $# : 腳本參數(shù)個數(shù)
  • $* : 所有參數(shù)导饲,每個參數(shù)當(dāng)作為一個字串,一般用于保存用戶的參數(shù)
  • $@: 所有參數(shù)氯材,所有參數(shù)當(dāng)作為一個字串渣锦,一般用于保存用戶的參數(shù)

bash編程之語句類型

  1. 順序執(zhí)行:逐條運行
  2. 選擇執(zhí)行:
    • 兩個或者以上的分支:滿足條件時只會執(zhí)行其中一個滿足條件的分支
  3. 循環(huán)執(zhí)行:
    • 某代碼片斷(循環(huán)體)要執(zhí)行0、1或多個來回

腳本之語法錯誤檢查

  • bash -n script.sh
  • bash -x script.sh

腳本之用戶交互的實現(xiàn)

  1. read [option]...[name...]
    • -p PROMPT: 直接提示輸入信息氢哮,保存至變量
    • -t TIMEOUT : 超時設(shè)置袋毙,默認(rèn)秒為單位

1、 選擇執(zhí)行:

  1. 單分支的if語句
     if 測試條件冗尤;then
         代碼分支
     fi 
    
  2. 雙分支的if語句
     if 測試條件;then
         條件為真時執(zhí)行的分支
     else
         條件為假時執(zhí)行的分支
     fi
    
  3. 多分支的if語句
     if 測試條件听盖;then
         條件為真時執(zhí)行
     elif
         條件為真時執(zhí)行
     else
         條件為假是執(zhí)行
     fi
    

2胀溺、循環(huán)執(zhí)行

  1. for循環(huán)語句
     for VAR in LIST;do
         循環(huán)體
     done
    
進(jìn)入條件:只要列表有可用元素,即可進(jìn)入循環(huán)
退出條件:列表中的元素遍歷完成后媳溺,即退出循環(huán)
列表的生成方式:
  • 直接給出
  • 整數(shù)列表
    • a:{start..end}
    • b: $(seq 起始數(shù)值 [步長] 結(jié)束數(shù)值)
  • 返回列表的命令
  • glob
  • 變量引用
  1. while循環(huán)語句
     while CONDITION1;do
         循環(huán)體
         循環(huán)控制變量修正表達(dá)式
     done
    
條件進(jìn)入:CONDITION測試為真
條件退出:CONDITION測試為假
  1. until循環(huán)語句
     until CONDITION;do
         循環(huán)體
         循環(huán)控制變量修正表達(dá)式
     done
    
條件進(jìn)入:CONDITION測試為假
條件退出:CONDITION測試為真

在循環(huán)中控制循環(huán)的方法

1月幌、continue
  • 表示提前結(jié)束本輪循環(huán),而直接進(jìn)入下一輪循環(huán)的條件測試

      while CONDITION1;do
          COMMNAD1
          if CONDITION2;then
              continue
          fi
              COMMNAD N 
      done
    
示例 : 求100以內(nèi)的所有偶數(shù)之和
    #!/bin/bash
            declare  -i evensum=0
            declare -i i=0
            while [ $i -le 100 ];do
                let i++
                if [ $[$i%2] -eq 1];then
                    continue
                fi
                let evensum+=$i
            done    
2悬蔽、break
  • 表示提前跳出循環(huán)
示例:100以內(nèi)所有奇數(shù)之和
    #!/bin/bash
    declare  -i evensum=0
    declare -i i=1
    while true;do
        let $oddsum+=$i
        let i+=2
        if [ $i -gt 100 ];then
            break
        fi
    done
while的特殊用法之遍歷文件的行
while read VARIABLE;do
    循環(huán)休
done < /path/form/somefile
for循環(huán)的特殊用法
for ((控制變量初始化扯躺;條件判斷表達(dá)式;控制變量的修正語句))蝎困;do
    循環(huán)體
done
控制變量初始化:僅在循環(huán)代碼開始運行時录语,執(zhí)行一次
控制變量的修正語句:每輪循環(huán)結(jié)束會先進(jìn)行控制變量修正運算,而后再做判斷
case選擇執(zhí)行語法
case $variable in
    pattern1)
        分支1
        禾乘;澎埠;
    pattern2)
        分支2
        ;始藕;
    pattern3)
        分支3
        蒲稳;;
    *)
        分支N
esac
case支持glob網(wǎng)絡(luò)的通配符:
* 
伍派?
[]
a|b :a或者b

shell函數(shù)

把一段獨立功能的代碼當(dāng)作一個整體江耀,并定義一個函數(shù)名字,命名的代碼段诉植,就稱之為一個函數(shù)祥国。定義的函數(shù)代碼段不會自動執(zhí)行,需在調(diào)用的時候執(zhí)行晾腔。調(diào)用函數(shù)就是批是代碼中給出指定的函數(shù)名即可舌稀。函數(shù)可出現(xiàn)在任何位置,在代碼執(zhí)行時灼擂,都會被自動替換為函數(shù)代碼壁查。其函數(shù)命名不應(yīng)該為命令名。其可在過程式編程中實現(xiàn)代碼重用剔应。以此實現(xiàn)模塊化編程結(jié)構(gòu)化編程.

  • 語法一
    function f_name {
    ...函數(shù)體...
    }
  • 語法二
    f_name () {
    ...函數(shù)體...
    }
函數(shù)的生命周期
  • 每次被調(diào)用時創(chuàng)建潮罪,返回時終止
函數(shù)的返回值
  • 函數(shù)返回值:
    • 函數(shù)的執(zhí)行結(jié)果返回值:
      • (1) 使用echo或printf命令進(jìn)行輸出;
      • (2) 函數(shù)體中調(diào)用的命令的執(zhí)行結(jié)果领斥;
    • 函數(shù)的退出狀態(tài)碼:
      • (1) 默認(rèn)取決于函數(shù)體中執(zhí)行的最后一條命令的退出狀態(tài)碼嫉到;
      • (2) 自定義:return
示例:給定一個用戶名,取得用戶的id號和默認(rèn)shell
#!/bin/bash
#

userinfo() {
    if id "$username" &> /dev/null; then
        grep "^$username\>" /etc/passwd | cut -d: -f3,7
    else
        echo "No such user."
    fi
}

username=$1
userinfo

username=$2
userinfo 
傳遞參數(shù)給函數(shù)
  • 在函數(shù)體中當(dāng)中月洛,可以使用$1何恶,$2, ...引用傳遞給函數(shù)的參數(shù);還可以函數(shù)中使用$*或$@引用所有參數(shù)嚼黔,$#引用傳遞的參數(shù)的個數(shù)细层;
  • 在調(diào)用函數(shù)時惜辑,在函數(shù)名后面以空白符分隔給定參數(shù)列表即可,例如疫赎,testfunc arg1 arg2 arg3 ..
示例:添加10個用戶盛撑,其添加用戶的功能使用函數(shù)實現(xiàn),用戶名做為參數(shù)傳遞給函數(shù)
                #!/bin/bash
                #
                # 5: user exists

                addusers() {
                    if id $1 &> /dev/null; then
                        return 5
                    else
                        useradd $1
                        retval=$?
                        return $retval
                    fi
                }

                for i in {1..10}; do
                    addusers ${1}${i}
                    retval=$?
                    if [ $retval -eq 0 ]; then
                        echo "Add user ${1}${i} finished."
                    elif [ $retval -eq 5 ]; then
                        echo "user ${1}${i} exists."
                    else
                        echo "Unkown Error."
                    fi
                done
函數(shù)變量的作用域
  • 局部變量
    • 作用域是函數(shù)的生命周期捧搞,在函數(shù)結(jié)束時被自動銷毀抵卫,定義的方法如下:
      • lacal VARIABLE=VALUE
  • 本地變量
    • 作用域是運行腳本的shell進(jìn)程的生命周期,作用范圍為當(dāng)前shell腳本程序文件
  • 示例
      #!/bin/bash
      #
      name=tom
      f_name() {
              local name=jerry
      }
    
      f_name
      echo $name
      
      注意:以上正常情況下會顯示name=tom,如果不使用local定義為本地函數(shù)變量胎撇, 那么應(yīng)該name=jerry.
    
注意:在函數(shù)中定義變量盡量使用local來定義變量

=========

bash之?dāng)?shù)組

什么是數(shù)組介粘?

存儲多個元素的連續(xù)的內(nèi)存空間,其數(shù)組只有一個名字晚树,其數(shù)組的索引號從0開始姻采。

定義一個數(shù)組
  • declare -a NAME : 聲明一個索引數(shù)組
  • declare -A NAME : 聲明一個關(guān)聯(lián)數(shù)組
    • 索引數(shù)組為索引號(下標(biāo))從0開始,關(guān)聯(lián)數(shù)組的索引號可以自定義爵憎,其bash4及以后版本支持關(guān)聯(lián)數(shù)組
數(shù)組中元素的賦值方式
  • 1慨亲、一次只賦值一個元素
    • NAME[0]=pig
    • NAME[1]=dog
  • 2、一次賦值全部元素
    • NAME=("VAL1","VAL2","VAL3",...)
  • 3宝鼓、只賦值特定元素
    • NAME=([0]="val1" [3]="val3",....): 稀疏格式的數(shù)組定義
  • 4巡雨、read -a array_name
    • val1 val2 val3.....(直接在提示符中寫,寫后回車即可)
  • 5席函、declare -A world
    • world[us]="america"
    • world[uk]="United kingdom" :這種方式即關(guān)聯(lián)數(shù)組,直接給定下標(biāo)名稱
數(shù)組中的元素引用
  • echo ${name[0]}
    • 引用時只給數(shù)組名冈涧,表示引用為下標(biāo)為0的元素
數(shù)組的長度引用 (即數(shù)組中元素的個數(shù) )
* ${#ARRAY_NAME[*]}
* ${#ARRAY_NAME[@]}

        注意:${#ARRAY_NAME}茂附,表示引用第一個元素的字符串長度
引用數(shù)組中的所有元素
  • ${array_name[*]}
  • ${array_name[@]}
數(shù)組元素切片
  • ${array_name[@]:offset:number}
    • offset :要跳過元素的個數(shù)
    • number :要取出元素的個數(shù),省略number時督弓,表示取偏移量之后的所有元素
向非稀疏數(shù)組中追加元素
  • array_name[${array_name[*]}]=
刪除數(shù)組中的某元素
  • unset array[index]
關(guān)聯(lián)數(shù)組的定義
  • declare -A array_name
  • array_name=([index_name1]="val1" [index_name2]="val2")

bash之信號捕捉

trap 命令
  • -l : 列出所有信號
  • man 7 signal : 查看所有信號的功用
  • kill -l : 查看所有信號
向腳本傳遞信號示例
    #!/bin/bash
    #
    trap 'echo "dou ni wan er."' INT
    trap 'echo "quit";exit1' INT
    
    注意:可以把捕捉信號定義在一個函數(shù)里营曼,在其它位置調(diào)用,腳本參考<腳本合集>

bash之顏色設(shè)置

  • echo -e "\033[42;35;5mHello world\033[0m"
    • [左側(cè)]4表示后景色

    • [左側(cè)]3表示前景色

    • 顏色分類:1,2,3,4,5,6,7

    • #m : 定義加粗 愚隧、閃爍等功能

        多種控制符蒂阱,可組合使用,彼此間用分號隔開
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狂塘,一起剝皮案震驚了整個濱河市录煤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荞胡,老刑警劉巖妈踊,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泪漂,居然都是意外死亡廊营,警方通過查閱死者的電腦和手機(jī)歪泳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來露筒,“玉大人呐伞,你說我怎么就攤上這事∩魇剑” “怎么了伶氢?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞬捕。 經(jīng)常有香客問我鞍历,道長,這世上最難降的妖魔是什么肪虎? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任劣砍,我火速辦了婚禮,結(jié)果婚禮上扇救,老公的妹妹穿的比我還像新娘刑枝。我一直安慰自己,他們只是感情好迅腔,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布装畅。 她就那樣靜靜地躺著,像睡著了一般沧烈。 火紅的嫁衣襯著肌膚如雪掠兄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天锌雀,我揣著相機(jī)與錄音蚂夕,去河邊找鬼。 笑死腋逆,一個胖子當(dāng)著我的面吹牛婿牍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惩歉,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼等脂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撑蚌?” 一聲冷哼從身側(cè)響起上遥,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎争涌,沒想到半個月后露该,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡第煮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年解幼,在試婚紗的時候發(fā)現(xiàn)自己被綠了抑党。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡撵摆,死狀恐怖底靠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情特铝,我是刑警寧澤暑中,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站鲫剿,受9級特大地震影響鳄逾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灵莲,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一雕凹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧政冻,春花似錦枚抵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苦锨,卻和暖如春逼泣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舟舒。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工拉庶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魏蔗。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像痹筛,于是被迫代替她去往敵國和親莺治。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容