bash腳本基礎認知

編程基礎:程序:指令+數據
                過程式:以指令為中心,數據服務于指令
                對象式:以數據為中心,指令服務于數據
shell程序:提供了編程能力,解釋執行
編程語言:低級:匯編
               高級:
                        編譯:高級語言–>編譯器–>目標代碼    java,c#
                        解釋:高級語言–>解釋器–>機器代碼    shell,perl,python
編程邏輯處理方式:
                順序執行
                循環執行
               選擇執行
                           shell編程:過程式、解釋執行
編程語言的基本結構:
                          各種系統命令的組合
數據存儲:變量、數組
表達式:a + b  
語句:if
shell腳本:包含一些命令或聲明,并符合一定格式的文件
格式要求:#!/bin/bash
               #!/usr/bin/python
               #!/usr/bin/perl
shell腳本的用途:
                    自動化常用命令
                    執行系統管理和故障排除
                    創建簡單的應用程序
                   處理文本或文件
shell腳本的創建:
                   使用文本編輯來創建文本文件
                   第一行必須包括shell聲明序列:#!/bin/bash    
                  #注釋行 (可以寫上時間,作者,做什么用)
寫完后運行腳本:
                      bash -n file  檢測腳本中的語法錯誤,但不能檢查命令錯誤
                      bash -x file  調試執行,可以檢查命令錯誤
                      chmod +x file 后 建議使用bash file 運行    
變量:
字符型:
數值型:整型,浮點型
變量命名法則:
        1 、不能使程序中的保留字:例如if, for
        2 、只能使用數字、字母及下劃線,且不能以數字開頭
        3 、見名知 義
        4 、統一命名 規則:駝峰命名法
強類型:定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤    如: java,c

弱類型:無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用
       如:bash  不支持浮點數,python

bash中的變量種類:
            本地變量:生效范圍為當前shell 進程;對當前shell 之外的其它shell 進程,包括當前shell 的子shell 進程均無效
            環境變量:生效范圍為當前shell進程及其子進程
            局部變量:生效范圍為當前shell 進程中某代碼片斷( 通常指函數)

            位置變量:$1, $2, … 來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數

變量賦值:name=‘value’
      可以使用引用value:
             (1)  可以是直接字串; name=“root”
             (2)  變量引用:name=”$USER”
             (3)  命令引用:name=COMMAND name =$(COMMAND)
       變量引用:$name
                       “” :弱引用,其中的變量引用會被替換為變量值
                        ” :強引用,其中的變量引用不會被替換為變量值,而保
持原字符串
?  顯示已定義的所有變量:set
?  刪除變量:unset name

變量聲明、賦值:  定義環境變量
                    exprot name=value
                    declare -x name=value
顯示所有環境變量:
                        export
                        env
                        printenv
                       刪除定義的變量:unset name    (養成習慣,每次在結束后刪除定義的變量)
bash 有許多內建的環境變量: :PATH, SHELL, USRE,UID,HISTSIZE, HOME, PWD, OLDPWD, HISTFILE

只讀變量:只能聲明,但不能修改和刪除
聲明只讀變量:
                readonly name
                declare -r name
查看只讀變量:
                readonly -p

位置變量:在腳本代碼中調用通過命令行傳遞給腳本參數
$1, $2, … :對應第1 、第2 等參數,shift [n]
        $*:  傳遞給腳本的所有參數,全部參數合為一個字符串
        $@:  傳遞給腳本的所有參數,每個參數為獨立字符串
        $#:  傳遞給腳本的參數的個數
        $@ $*  只在被雙引號包起來的時候才會有差異
        set —  清空所有位置變量

當位置參數達到10以上需要加上大括號 比如 ${10} ${11} 

      $0     腳本名 使用basename可以取基名
      shift #  清理單獨的位置參數#清理多少個 
bash 中的算術運算:help let
                          +, -, *, /, % 取模(取余), ** (乘方)
實現算術運算:
(1) let var= 算術表達式
(2) var=$[ 算術表達式]       (建議使用中括號,方便查看腳本)
(3) var=$(( 算術表達式))
(4) var=$(expr arg1 arg2 arg3 …)
(5) declare –i var =  數值
(6) echo ‘ 算術表達式’ | bc
       乘法符號有些場景中需要轉義 ,如*
bash 有內建的隨機數生成器:$RANDOM (1-32767)
                                        echo $[$RANDOM%50]  :0-49 之間隨機數

增強型賦值:
               +=, -=, *=, /=, %=
               let varOPERvalue

               自增,自減:

                            j=i++   先賦值給j,然后再加1
                            j=++1   先加1賦值給j,

                       
邏輯運算: ||     &&    !
                異或:^     異或的兩個值,相同為假,不同為真
進程使用退出狀態來報告成功或失敗
               ? 0 代表成功,1 -255 代表失敗
               ? $?  變量保存最近的命令退出狀態

條件測試:
               判斷某需求是否滿足,需要由測試機制來實現
               專用的測試表達式需要由測試命令輔助完成測試過程
評估布爾聲明,以便用在條件執行中
              若真,則返回0
              若假,則返回1
測試命令:
? test EXPRESSION
            ? [ EXPRESSION ]
            ? [[ EXPRESSION ]]
        注意:EXPRESSION 前后必須有空白字符
            $ [ “$A” == “$B” ] && echo “Strings are equal”
            $ [ “$A” -eq “$B” ] && echo “Integers are equal”

根據退出狀態而定,命令可以有條件地運行   &&     ||

        數值測試:
               -gt:  是否大于             -ge:  是否 大于等于
               -eq:  是否等于             -ne:  是否 不等于
               -lt:  是否小于               -le:  是否 小于等于

        字符串測試:
                        == :是否等于;
                           >: ascii 碼是否大于ascii碼
                           <:  是否小于
                          !=:  是否不等于
                         =~:  左側字符串是否能夠被右側的PATTERN所 所 匹配
注意:  此表達式一般用于[[ ]] 中;擴展的正則表達式
                         -z “STRING” :字符串是否為空,空為真,不空為假
                         -n “STRING” :字符串是否不空,不空為真,空為假
               注意:用于字符串比較時的用到的操作數都應該使用引號

文件測試:
-e FILE:  文件存在性測試,存在為真,否則
-d FILE:   是否存在且為目錄文件
-b FILE:   是否存在且為塊設備文件
…….
文件權限測試:-r    -w     -x    是否存在且有權限
特殊權限測試:-u    -g     -k    是否存在且有特殊權限
文件大小測試:-s         是否存在且非空
文件是否打開:-t fd   fd 表示文件描述符是否已經打開且與某終端相關      -N FILE :文件自動上一次被讀取之后是否被修改過
 -O FILE : 當前有效用戶是否為文件屬主
 -G FILE :當前有效用戶是否為文件屬組
雙目測試:
FILE1 -ef FILE2: FILE1 與FILE2 是否指向同一個設
備上的相同inode
FILE1 -nt FILE2: FILE1 是否新于 于FILE2
FILE1 -ot FILE2: FILE1 是否舊于 于FILE2

組合條件測試:
第一種方式:
COMMAND1 && COMMAND2  并且
COMMAND1 || COMMAND2  或者
! COMMAND 非 
如:[[ -r FILE ]] && [[ -w FILE ]]
第二種方式:
EXPRESSION1 -a EXPRESSION2  并且
EXPRESSION1 -o EXPRESSION2  或者
! EXPRESSION
必須使用測試命令進行

使用read命令來接受輸入:
                               -p 指定要顯示的提示
                               -s 靜默輸入
                               -n N  指定輸入的字符長度N
                               -d ‘ 字符’ 輸入結束符
                               -t N TIMEOUT 為N秒
                       read 從標準輸入中讀取值,給每個單詞分配一個變量,所有剩余單詞都被分配給最后一個變量
                       read -p “Enter a filename: “ FILE

bash如何展開命令行
   把命令行分成單個命令詞
   展開別名
   展開大括號種的聲明({})
   展開波浪符聲明(~) 
   命令替換$() 和 “) 
   再次把命令行分成命令詞
   展開文件通配(* 、? 、[abc] 等等)
   準備I/0 重導向(< 、>) 
   運行命令

防止擴展:反斜線(\ )會使隨后的字符按原意解釋
              加引號來防止擴展
             ?  單引號(’ )防止所有擴展
             ?  雙引號(” )也防止所有擴展,但是以下情況例外:
                 $ (美元符號) - 變量擴展
                  ` (反引號) - 命令替換
                  \ (反斜線) - 禁止單個字符擴展
                  ! (嘆號) - 歷史命令替換

bash的配置文件:
按生效范圍劃分,存在兩類:
           全局配置:
                        /etc/profile
                       /etc/profile.d/*.sh
                       /etc/bashrc
           個人配置:
                       ~/.bash_profile
                       ~/.bashrc
修改profile 和bashrc 文件后需生效
         兩種方法:
                       1 重新啟動shell 進程

                       2 .  或source    (使用source)

bash退出任務:
                保存在~/.bash_logout 文件中(用戶)
                在退出登錄shell 時運行
         用于
               ? 創建自動備份
               ? 清除臨時文件

原創文章,作者:shewei,如若轉載,請注明出處:http://www.www58058.com/70357

(0)
sheweishewei
上一篇 2017-03-01 23:18
下一篇 2017-03-02 14:58

相關推薦

  • Linux啟動和內核管理

                                        Linux啟動和內核管理 本章內容: centos5和centos6的啟動流程 服務管理 grub…

    系統運維 2016-09-21
  • 馬哥教育網絡班21期第6周作業

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; %s/^[[:space:]]\+/#& 2、復制/boot/grub/grub.conf至/tmp目錄中,刪除/tmp/grub.conf文件中的行首的空白字符; %s/^[[:space:]]\+/ …

    Linux干貨 2016-12-05
  • linux-系統自動化安裝

    一、安裝程序及配置 CentOS 系統安裝 系統啟動流程: bootloader–>kernel(initramfs)–>rootfs–>/sbin/init anaconda: 系統安裝程序 tui:  基于圖形庫curses 的文本 窗口 gui :圖形窗口 安裝程序啟動過程 MB…

    Linux干貨 2016-09-26
  • nginx負載均衡實驗

    實驗一、 實驗環境:     1、一臺director主機。并部署nginx服務。        內網iP:192.168.1.1  外網iP:10.1.64.1     2、一臺后端服務器。并部署h…

    Linux干貨 2016-10-30
  • locate、find命令使用總結

    一、簡介    在linux系統中存在"一切皆文件"的說法,這就足以說明文件的重要性,因此查找文件也是我們必須要掌握的技能。這時候熟練使用locate、find命令也就顯得至關重要。尤其是find命令常用于日常工作中如安裝完某個軟件之后要查看這些軟件的安裝配置路徑,或是需要按指定條件直接查找我們需要操作的文件。因此更需…

    Linux干貨 2015-08-31
  • 馬哥教育網絡班21期-第九周課程練習

    "1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash # declare -i login_user=0 declare -i nologin_user=0 whil…

    Linux干貨 2016-09-15
欧美性久久久久