Linux基礎:shell編程基礎

shell腳本編程基礎

編程基礎

程序:指令+數據
 程序: 算法+數據結構
數據:是程序的核心
數據結構:數據在計算機中的類型和組織方式
算法: 處理數據的方式
程序編程風格:
過程式 :以指令爲中心,數據服務於指令
對象式 : 以數據爲中心,指定服務於數據
shell程序: 提供了編程能力,解釋執行

程序的執行方式

計算機:運行二進制指令
編程語言:人與計算機之間交互的語言
低級編程語言:
機器:二進制的0和1的序列
低級:彙編
高級編程語言:
編譯:高級語言---編譯器---機器代碼---執行    
         c,   c++
解釋:高級語言--執行--×××--機器代碼
          shell   python   java

編程基本概念:

編程邏輯處理方式:
   順序執行
   循環執行
   選擇執行
shell編程:過程式,解釋執行
 編程語言的基本結構
  各類系統命令的組合
   數據存儲:變量,數組
表達式:a+b
shell腳本基礎

shell腳本:
包含一些命令或聲明,並符合必定格式文本文件
格式要求:首行shebang機制
#! /bin /bash
#!/usr /bin/pythonphp

shell腳本的用途有:

自動化經常使用命令
建立簡單的應用程序
處理文本或文件
執行系統管理和故障排除

建立shell腳本

第一步:使用文本編輯器來建立文本文件
第一行必須包括shell聲明序列 :#!
   #! /bin/bash
   添加註釋
    註釋以#開頭
第二步:運行腳本
給予執行權限,在命令行上指定腳本的絕對或相對路徑
直接運行解釋器,將腳本做爲解釋器程序的參數運行

腳本規範

1:第一行通常爲調用的語言
2:程序名,避免更改文件名爲沒法找到的文件
3:版本號
4:更改後的時間
5:做者相關信息
6:該程序的做用,及注意事項
7:最後是個版本的更新簡要說明

腳本調試

檢測腳本中的語法錯誤
bash -n /path/to/some_script
調試執行
bash -x /path/to/some_script

變量

變量:命令的內存空間
         數據存儲方式
         字符
         數值:整型,浮點型
變量:變量類型
    做用: 1:數據存儲格式
          2:參與的運算
           3:表示的數據範圍
類型:
        字符
           數值:整型,浮點型

變量:

強類型:變量不通過強制轉換,它永遠是這個數據類型,不容許隱式的類型轉 換。通常定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明 變量會產生錯誤    
如   java,c# 
弱類型:語言的運行時會隱式作數據類型轉換。無須指定類型,默認均爲字符 型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用 
 如:bash 不支持浮點數,php

變量命令法則:

1:不能使用程序中的保留字:例如if,for
2:   只能使用數字
3:見名知義
4:統一命令規則:駝峯命名法

bash中變量的種類

根據變量的生效範圍等標準劃分下面變量類型: 
            局部變量:生效範圍爲當前shell進程;對當前shell以外的其它shell進程,包括 當前shell的子shell進程均無效 
  環境(全局)變量:生效範圍爲當前shell進程及其子進程
本地變量:生效範圍爲當前shell進程中某代碼片斷,一般指函數
位置變量:  :$1, $2, ...來表示,用於讓腳本在腳本代碼中調用經過命令行傳遞給它 的參數  
特殊變量::$?, $0, $*, $@, $#,$$

局部變量:

局部變量即普通變量   只能當前進程使用 ,子進程不能使用
變量賦值:name=‘value’
能夠使用引用‘value’
        (1)能夠是直接字符;name=「root「
      (2)變量引用:name="$USER" 
           (3) 命令引用:name=`COMMAND`  name=$(COMMAND) 變量引用:${name}   $name 
變量引用:${name}  $name 
            " ":弱引用,其中的變量引用會被替換爲變量值
  ’ ‘:強引用,,其中的變量引用不會被替換爲變量值,而保持原字符串 
顯示已定義的全部變量:set
刪除變量:unset name

環境變量:

環境變量   當前能夠使用,子進程也能使用 父進程不能使用    加上export  例如:export    name=`hostname`
export  [只看環境變量]      set[全部變量都在裏面]              unset name [取消刪除變量]
    變量聲明 、賦值:  
export name=VALUE 
 declare -x name=VALUE 
    變量引用:$name, ${name}

顯示全部環境變量:

env 
 printenv 
     export  
declare -x 
刪除變量:  unset name 
bash內建的環境變量:
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
MAIL
    HOSTNAME
HISTSIZE

只讀和位置變量

只讀變量:只能聲明,但不能修改和刪除  【例:readonly   name=dang     這就是隻讀變量     不能刪除可是exit退出來只讀變量就沒有了】
查看已讀變量:readonly -p 
位置變量::在腳本代碼中調用經過命令行傳遞給腳本的參數 
    $1, $2, ...:對應第一、第2等參數,shift [n]換位置
    $0: 命令自己
     $*: 傳遞給腳本的全部參數,所有參數合爲一個字符串  
     $@: 傳遞給腳本的全部參數,每一個參數爲獨立字符串  
      $#: 傳遞給腳本的參數的個數  
      $@ $* 只在被雙引號包起來的時候纔會有差別  
 set -- 清空全部位置變量

退出狀態:

進程使用退出狀態來報告成功或失敗
 0 表明成功      1-255表明失敗
$?變量保存最近的命令退出狀態
例如: 
   ping -c1 -W1 hostname &>/dev/null
        echo $?

退出狀態碼

bash自定製退出狀態碼
    exit [n] :自定義退出狀態碼
    注意: 腳本中一旦遇到exit命令,腳本會馬上終止;終止退出狀取決於exit命令後面的數字
        注意::若是未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決於腳本中執行 的最後一條命令的狀態碼

邏輯運算:

true【真】,false【假】
            1,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

短路運算

短路與
      第一個爲0 ,結果一定爲0                              &&【表明短路與】
       第一個爲1 ,第二個必需要參與運算
例: ls dng  &>/dev/null   && chmod +x dang 【意思: 若是前面命令存在就給他加執行權限】   

短路或
      第一個爲1 ,結果一定爲1                                ||【表明短路或】
       第一個爲0, 第二個一定要參與運算
例:id dang &>/dev/unll  || useradd dang      【意思: 若是前面沒有這個目錄就建立】

異或於同或

異或:^
      異或的兩個值,相同爲假,不一樣爲真
同或:
相同爲1 ,不一樣爲0
條件性的執行操做符
根據退出狀態而定,命令能夠有條件地運行
 && 表明條件性的AND  THEN
 ||  表明條件性的OR  ELSE

bash的數值測試:

-v VAR
變量VAR是否設置
數值測試:
   -gt 是否大於
   -ge 是否大於等於
   -eq 是否等於
   -ne  是否不等於
   -lt  是否小於
    -le  是否小於等於

bash 的字符串測試

字符串測試:
              = 是否等於   
               > ascii碼是否大於ascii碼 
               < 是否小於   
                =~ 左側字符串是否可以被右側的PATTERN所匹配    【相似於包含】
                          注意: 此表達式通常用於[[  ]]中;擴展的正則表達式

[[ ]]
==相同,字符串不加「」 支持通配符
=~ 匹配,字符串不要加「」支持擴展正則表達式java

bash的文件測試

存在性測試
-a   而且
-o    或者
-e 文件存在性測試,存在爲真不存在爲假
-b  文件 :是否存在且爲塊設備文件
-c  文件 :是否存在且爲字符設備文件
    -d              是否               目錄文件
-f                                      普通文件
-h或-l                                連接文件
    -p                                      命令管道文件
-S                                       套接字文件
-w                                       可寫文件
    -o 當前有效用戶是否爲文件屬組
-G 當前有效用戶是否爲文件屬組

-r                                        存在且 可讀文件
-w                                        存在且可寫文件
-x                                         存在且可執行
例:查看/etc/issue是否是普通文件,若是是打印shi 若是不是打印bushi
[   -f   "/etc/issue"   ]  && echo shi   ||  echo bushi
查看/dev/sda是否是塊文件,若是是打印shi 若是不是打印bushi
[  -b     "/dev/sda"   ]  && echo shi  || echo   bushi
查看f1是否是普通文件而且有執行權限,若是是就加上r權限 若是不是打印bushi
file=f1; [ -f "$file" -a  -x "$file" ] && chmod +r "$file"|| echo bushi
查看f1若是沒有執行權限,若是是就加上w權限 若是不是打印bushi
file=f1; [ !  -x "$file" ] && chmod +w "$file"|| echo bushi
阻止普通用戶登入 : touch /etc/nologin 【建立/etc/nologin文件】
把 buyunxuputongyonghudengru >/etc/nologin 【把前面字符寫入,etc/nologin中  每當普通用戶登入時會顯示前面的字符】

使用read命令來接受輸入

使用read來把輸入值分配給一個或多個shell變量
 -p 指定要顯示的提示        read -p "please input your passwd "   passwd   【會顯示提示  ,後面的passwd是賦值   就是把前面輸入的只賦給passwd】
 -s   靜默輸入,通常用於密碼 
-n  N 指定輸入的字符長度N
 -d ‘字符’  輸入結束符
 -t  N  TIMEOUT爲N秒 
    read 從標準輸入中讀取值,給每一個單詞分配一個變量 全部剩餘單詞都被分配給最後一個變量
 read -p 「Enter a filename: 「 FILE 

    read能夠同時給幾個變量賦值
例:read   z x c   <<< "aa ss dd"   【三個<號】
相關文章
相關標籤/搜索