shell腳本初步

shell腳本編程初步

程序:由數據和指令組成, 指令:由程序文件提供 數據:可以通過IO設備、文件、管道來得到,

程序:算法+數據結構

變量:變量名+變量名指向的內存空間
變量賦值:
	name = value變量類型:存儲格式:字符 數值(精確數值 近似數值)
  表示數據范圍
  參與的的運算
編程語言:
	強類型變量編程語言:c
	弱類型變量編程語言:
	bash把所有變量統統視作字符型。不支持浮點數據,除非借助第三方工具
bash中的變量無需事先聲明
	聲明: 類型  變量名
變量替換:把變量名的出現位置替換為其所指向的內存空間中的數據
變量引用:$(var_name) $var_name
變量名:變量名只能包含數字、字母、下劃線,而且不能以數字開頭
變量名:見名知意,命名機制遵循某種法則,不能使用程序的保留字。例如:if  else  then  while ...

變量類型:

本地變量:作用域僅為當前shell進程
環境變量:作用域為當前shell進程及其子進程
局部變量:作用域僅為某代碼片段(函數上下文)

位置參數變量:當執行腳本的shell進程傳遞的參數
特殊變量:shell內置的有特殊功能的變量
    $?
        0:成功
        1-255:失敗


本地變量:
變量賦值:name = value
變量引用:$(name) $name
	“”:變量名會替換為其值
	‘’:變量名不會替換為其值
查看變量:set撤銷變量:unset name
	注意:此處非變量引用,不要加$符號
環境變量:
變量賦值:
    (1)export name =value
    (2)name = value
		 export name
    (3)declare -x name=value
    (4)name = vlaue		
		declare -x name
變量引用:$(name),$name
注意:bash內嵌了許多環境變量(通常為全大寫字符),用來定義bash的工作環境	
    PATH HISTFILE HISTFILESIZE SHELL 。。
查看環境變量:export, declare -x, printenv,env
撤銷環境變量:unset name只讀變量:
(1)declare -r name
(2)readonly name	
只讀變量無法重新賦值,并且不支持撤銷;
存活時間為當前shell進程的生命周期,隨shell進程終止而終止。

邏輯運算:

運算數:只有真(true,1)或假(false,0)

與:	
        1 && 1 = 1
	1 && 0 = 0
	0 && 1 = 0
	0 && 0 = 0

或:	
        1 || 1 = 1
	1 || 0 = 1
	0 || 1 = 1
	0 || 0 = 0
非:
	! 1  = 0
	! 0  = 1 
異或:相同為假不同為真

短路法則:
~] COMMAND1 && COMMAN D2
		COMMAND1:為假,則COMMAND2不會再執行:
		否則,COMMAND1為真,COMMAND2必須執行
~] COMMAND1 || COMMAND2
		COMMAND1 為真,COMMAND2不會在執行
		COMMAND1 為假,COMMAND2必須執行
	
實例:~] id $username  || useradd $username
        如果$username存在 則useradd $username不執行
        如果$username不存在,則執行useradd $username,創建$username 用戶

shell腳本編程:

編程語言的分類:根據運行之前是否需要編譯(運行方式)
	編譯運行:源代碼-->編譯器(編譯)-->程序文件
	解釋運行:源代碼-->運行時啟動解釋器,由解釋器邊解釋邊運行;
    (源代碼本身不可執行,而是解釋器處理運行)
根據其編程過程當中,功能的實現,是調用庫還是調用外部的程序文件可分為:
shell腳本編程:
    利用系統上的命令及編程組件進行編程
完整編程:
    利用庫或編程組件進行編程
    
根據編程模型分類:
    面向過程式編程語言
    面向對象式編程語言

程序 = 指令 + 數據

過程式:以指令為中心來組織代碼,數據是服務于代碼
        順序執行
        選擇執行
        循環執行
    代表:C語言   bash  
對象式:以數據為中心來組織代碼,圍繞數據來組織指令
    
    執行過程中先生成指定的對象
    編寫程序的過程中要編寫很多的類(class)
    類:實例化對象
    代表:java ,c++, Python
    
SHELL腳本編程:過程式編程,解釋運行,依賴于外部執行文件運行    
    如何寫shell腳本:
        腳本文件的第一行,固定格式:
            頂格寫:給出shebang,解釋器路徑,用于解釋執行當前的腳本的解釋器程序文件。
    常見的解釋器:        
        #!/bin/bash
        #!/usr/bin/python
        #!/usr/bin/pertshell腳本是什么?
    可以認為是命令的堆積:
        但是大多命令不具有冪等性,需要用程序邏輯來判斷運行條件是否滿足,以避免其運行中發生錯誤;
運行腳本:
    (1):賦予執行權限,并直接運行此腳本程序文件
            chmod + x file
    (2):直接運行解釋器,將腳本以命令行參數傳遞給解釋器程序。
    
注意:

    腳本中的空白行會被解釋器自動忽略
    腳本中,除了shebang,余下的所有以#開頭的行 ,都會被視作注釋行而被忽略;
    shell腳本的運行是通過一個子shell進程實現的
    
    
bash的配置文件:
兩類
    profile類:為交互式登錄的shell進程提供配置
    
    bashrc類:為非交互式登錄的shell進程提供配置
    
登錄類型:
    交互式登錄shell進程:
        直接通過某終端輸入賬號和密碼后登錄打開的SHELL進程。
        使用su命令:su - USERNAME,或者使用su -l USERNAME執行的登錄切換
    非交互式登錄shell進程:
        su USERNAME執行的登錄和切換
        圖形界面下打開的終端
        運行腳本
        
    profile類:
        全局生效:對所有用戶都生效
            /etc/profile            /etc/profile.d/*.sh
            
        用戶個人:僅對當前用戶有效
            ~/.bash_profile
        
        功用:            1、用于定義環境變量            
                          2、運行命令或腳本
            
    bashrc類:
        對全局生效:
            /etc/bahsrc
        用戶個人:
            ~/.bashrc
            
        功用:            1、定義本地變量            2、定義命令別名
    注意:只有管理員可修改全局配置文件;
    
    配置文件的讀取順序:
        交互式登錄shell進程:            
            /etc/profile-->/etc/profile.d/*-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
        非交互式登錄的shell進程:
            ~/.bashrc-->/etc/bashrc-->/etc/profile.d/*
        
        命令行中定義的特性,其作用域為當前shell進程的聲明周期
        配置文件定義的特性,只對隨后重新啟動的SHELL進程有效
        讓通過配置文件定義的特性立即生效:
            (1)通過命令行重復定義一次
            (2)讓shell進程重新讀取配置文件
                    ~]# source /PATH/FROM/CONF_FILE
                    ~]# ./PATH/FROM/CONF_FILE
shell腳本之算術運算
    加:+
    減:-
    乘:*
    除:/
    次方:**
    取余運算:%

算數運算格式:
(1)let VAR = 算數運算表達式
		[root@localhost ~]# let sum=5+9
		[root@localhost ~]# echo $sum
		14
(2)VAR=$[算數運算表達式]
		[root@localhost ~]# echo $[5+9]
		14
(3)VAR=$((算數運算表達式))
		[root@localhost ~]# echo $((5+9))
		14
(4)VAR=$(expr $num1 + $num2)
		[root@localhost ~]# expr 5 + 9
		14
	要是想引用計算的結果要使用變量引用;
		[root@localhost ~]# sum=$(expr 5 + 9)
		[root@localhost ~]# echo $sum
		14

	注意乘法符號*在有些場景中需要使用轉義字符;




腳本文件格式:
    第一行,頂格:#!/bin/bash 
    注釋信息:#
    代碼注釋:寫腳本一定要寫代碼注釋,方便自己,利于他人看懂。
    規范寫代碼:
        縮進
        適度添加空白行

編程思想:
    問題空間--》解空間

變量:
    局部變量:只在當前shell進程中的一段代碼片段中有效
    本地變量:只在當前shell進程中有效,對其他shell進程包括當前shell的子進程均無效
    環境變量:生效范圍為當前shell進程以及其子進程
    只讀變量
    位置參數變量:用于讓腳本在腳本代碼中調用通過命令傳遞給它的參數。
    特殊變量:$?,$0,$*,$@,$#
數據類型:

    字符型,數值型(精確數值,近似數值)  (shell腳本內置不支持浮點數運算,需要借助其他工具)

增強型賦值:
    變量做某種算術運算后結果回存至此變量中        
    let $i + #  = let i+=#
        +=  -=  *=  /=  %=
    自增:++        
        let VAR =$[$VAR+1]        
        let VAR+=1
        let VAR++
    自減:--        
        let VAR =$[$VAR-1]        
        let VAR-=1
        let VAR--   

子shell進程:在當前腳本中用用括號將一段命令括起來說明此中的代碼將在當前腳本進程的子進程中運行。
例如: 
    echo "$1"|grep -E '\<((([0-9]|[1-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|2[0-4][0-9]|25[0-5]))\>' 
    && (ping -c1 -w1\$1 &> /dev/null && echo "您所給的IP是:$1-->該IP可訪問"||echo "您所給的IP是:$1-->該IP不可訪問")|| echo "您所給的IP格式不合法";exit
    上面的代碼中:(ping -c1 -w1\$1 &> /dev/null && echo "您所給的IP是:$1-->該IP可訪問"\||echo "您所給的IP是:$1-->該IP不可訪問")
    就是在其shell進程中的子shell進程中運行。

條件測試

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

bash的測試類型

數值測試:
    -gt:  是否大于;    
    -ge:  是否大于等于;    
    -eq:  是否等于;    
    -ne:  是否不等于;    
    -lt:  是否小于;    
    -le:  是否小于等于;    
字符串測試:
    == :是否等于;    
    >: ascii 碼是否大于ascii碼 碼
    <:  是否小于
    !=:  是否不等于    
    =~:  左側字符串是否能夠被右側的PATTERN所匹配        
        注意:  此表達式一般用于[[ ]] 中;
    -z "STRING" :字符串是否為空,空為真,不空為假    
    -n "STRING" :字符串是否不空,不空為真,空為假        
        注意:用于字符串比較時的用到的操作數都應該使用引號
    
文件測試:
    存在性測試
        -a FILE :同-e        
        -e FILE:  文件存在性測試,存在為真,否則為假;    
    存在性及類別測試
        -b FILE :是否存在且為塊設備文件;        
        -c FILE :是否存在且為字符設備文件;        
        -d FILE :是否存在且為目錄文件;        
        -f FILE :是否存在且為普通文件;        
        -h FILE 或 -L FILE :存在且為符號鏈接文件;        
        -p FILE :是否存在且為命名管道文件;        
        -S FILE :是否存在且為套接字文件;        
    文件權限測試:
        
        -r FILE :是否存在且可讀        
        -w FILE:  是否存在且可寫        
        -x FILE:  是否存在且可執行        
    文件特殊權限測試:
        
        -g FILE :是否存在且擁有sgid 權限;        
        -u FILE :是否存在且擁有suid 權限;        
        -k FILE :是否存在且擁有sticky    
    文件大小測試:
        
        -s FILE :是否存在且非空   
    文件是否打開:
        
        -t fd: fd 表示文件描述符是否已經打開且與某終端相關        
        -N FILE :文件自動上一次被讀取之后是否被修改過        
        -O FILE :當前有效用戶是否為文件屬主        
        -G FILE :當前有效用戶是否為文件屬組組合測試條件:
    
    COMMAND1 && COMMAND2 并且
    COMMAND1 || COMMAND2 或者
    !COMMAND  非
    
   如: [ -e FILE ] && [ -r FILE ]
   
   EXPRESSION -a EXPRESSION 并且
   EXPRESSION -o EXPRESSION 或者
   !EXPRESSION
   必須使用測試命令進行:
        # [ -z “$HOSTNAME” -o $HOSTNAME "==\
        "localhost.localdomain" ] && hostname www.magedu.com
        # [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

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

(0)
dxkbokedxkboke
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • N22-妙手-第八周課程練習

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。     網橋:         一種網絡設備,負責網絡橋接,將網絡的多個網段在數據鏈路層連接起來。     集線器: &…

    Linux干貨 2016-11-07
  • centos系統中常用的命令

    日志文件說明:  /var/log/message      系統啟動后的信息和錯誤日志,是Red Hat Linux中最常用的日志之一   /var/log/secure      &nb…

    Linux干貨 2016-06-28
  • Linux運維實戰之6:掛載/卸載磁盤分區

    上次博文我們具體討論了Linux系統中磁盤的分區及格式化( http://www.www58058.com/60811),本次博文我們具體來說說分區的掛載哈! 【問題引入】 已經格式化好的分區如何與系統現有的文件系統建立關聯(如何使用新分區)? 新的磁盤分區創建完成并格式化之后需要掛載(或裝入)到目錄樹上才能被使用。 何謂掛載/卸載? 【答】將某個…

    Linux干貨 2016-12-04
  • ssh登陸與端口轉發

    ssh: secure shell, protocol, 22/tcp,  安全的遠程登錄     具體的軟件實現:OpenSSH  : ssh 協議的開源實現,CentOS 默認安裝dropbear :另一個開源實現SSH      協議版本   …

    Linux干貨 2017-04-13
  • Linux入門知識

    了解計算機的構造和Linux的基本知識,掌握相關的內容

    2017-09-10
  • inode、軟硬鏈接區分、ln命令

    inode、軟硬鏈接區分、ln命令 一、inode inode記錄的是文件的屬性及文件實際放在那塊數據塊中的。inode包含以下數據: 1. 該文件的可被訪問的權限(read/write/excute) 2. 該文件的屬主、屬組(owner、group) 3. 該文件的大小 4. 該文件創建或者狀態改變的時間(Ctim…

    Linux干貨 2016-08-02

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-16 15:44

    整體思路清晰,分類明確,層次感強,變量=左右不允許有空格,

欧美性久久久久