shell腳本編程

shell腳本基礎篇——簡單介紹腳本的書寫規范

編程基礎

程序:指令+數據

程序編程風格:過程式:以指令為中心,數據服務于指令

對象式:以數據為中心,指令服務與數據

shell程序:提供了編程能力,解釋執行

程序的執行方式:

計算機:運行二進制指令

高級語言 :?? 編譯:?? 高級語言??????????? 編譯器?????????? 目標代碼(Java,c#)

解釋:?? 高級語言?????????? 解釋器????????? 機器代碼(shell,Perl,Python)

編程基本概念

編程邏輯處理方式:順序執行、循環執行、選擇執行

Shell編程:過程式、解釋執行

編程語言的基本結構:

各種系統命令的組合

數據存儲:變量、數組

表達式:a?? +?? b

語句:if

Shell腳本基礎

Shell腳本:包含一些命令或聲明,并符合一定格式的文本文件

格式要求:首行shebang機制

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl

Shell腳本的用途:自動化常用命令;執行系統管理和故障排除;創建簡單的應用程序;處理文本或文件

創建shell腳本:1.用文本編輯器來創建文本文件(第一行必須包括shell聲明序列;添加注釋)??? 2.運行腳本(給予權限;直接運行解釋器)

腳本規范

腳本代碼開頭約定

1、第一行一般為調用使用的語言

2、程序名,避免更改文件名為無法找到正確的文件

3、版本號

4、更改后的時間

5、作者相關信息

6、該程序的作用,及注意事項

7、最后是各版本的更新簡要說明

腳本調試

bash?? -n?? 腳本名?????? //檢測腳本中的語法錯誤:語法錯誤,后續命令不執行;不是語法錯誤,后續命令繼續執行

-x??? 腳本名????? //調試執行?? 可查看腳本的執行過程

++??? 代表嵌套深度

變量:(強類型、弱類型)

如果命令可以識別變量,就可以不加$符號

$變量? //引用變量?? 若變量超過十個,需要用{}引起來

echo? “$變量”?? //變量若賦值一個文件的內容,輸出時加引號可保留原格式

變量作用:

  1. 數據存儲格式
  2. 參與的運算
  3. 表示的數據范圍

變量的命名法則:

  1. 不能使用程序中的保留字
  2. 只能使用數字、字母、下劃線,且不能以數字開頭
  3. 見名知義(最好用英文單詞)
  4. 統一命名規則:駝峰命名法

=?? //給變量賦值

變量種類:局部變量:【只對當前的進程有效,不能傳給子進程;只在當前會話有效】、環境(全局)變量:在【父進程定義的變量,子進程可繼承】、本地變量、位置變量、特殊變量

pstree?? -p?? //顯示所有進程關系

echo? $$?? //顯示當前進程編號

echo?? $PPID?? //查看父進程編號

export?? 變量??? //定義環境變量(declare? -x?? 變量)

set??? //可以查看到全部的變量,還有函數信息

unset? 變量??? //取消給變量的賦值(變量前未加$)

$SHLVL???? //查看shell的嵌套次數

 

echo?? 后跟的認為是字符串,直接寫$CMD認為是命令

?1

?$_?? ?????//上一個命令的最后一個參數

顯示所有的環境變量:env?????? ;???? printenv????? ;export???? ;??? declare? -x

聲明只讀變量:readonly?? name??? 或者? declare?? -r?? name

查看只讀變量:? readonly?? -r? name???????? declare –r?? //查看所有常量(readonly -p)

 

( name=haha; touch? /data/$name.log )?? //小括號用于臨時引用變量,開啟子shell,不影響當前shell環境(該子shell,不同于之前子進程)

{? name=haha; echo $name;? }?? //大括號影響當前shell環境,不開啟子shell

 

位置變量

$數字?? //代表第幾個位置變量

$0????? //代表命令本身的整個路徑(若是軟鏈接可用$0實現不同的功能)

$*????? //代表傳遞給腳本的所有參數,全部參數合為一個字符串

$@???? //代表傳遞給腳本的所有參數,全部參數為獨立的字符串

$#??? //傳遞給腳本的參數個數

set?? —??? //清空所有位置變量

shift?? ??數字 //每執行一次將所有的位置參數向左移幾位(默認1位)

 

退出狀態

$??? //可用來查看上條命令的執行結果,0代表成功,其他代表失敗

$?對于腳本來講:腳本的返回結果正確與否,是由最后一條命令決定的

bash 的自定義退出碼:? exit?? [數字]

 

算數運算:+?? –?? *??? /???? %(取余)?????? **(乘方)

RANDOM?????? //隨機數生成器

*//特定情況下需要轉義

實現算數運算:let? sum=i+j;? $[i+j];?? $((i+j));?? expr?? i? +? j? ;

declare ??-i? n=10?? //將變量n聲成整數???? ;?? echo?? 1+3? |bc

a=$((a^b));b=$((a^b));a=$((a^b));echo $a $b?? //實現a,b的值互換

邏輯運算(&與????????? |或???????? !非)

0?? false???????????????????? 1?? true

cmd1? ?短路與(&&)?? cmd2

如果cmd1為假,將不執行cmd2

如果cmd1為真,將執行cmd2

 

cmd1?? 短路或 (||)? cmd2

如果cmd1為假,將執行cmd2

如果cmd1為真,將不執行cmd2

 

異或XOR(^):相同為假,不同為真? (通過異或的中間值可實現兩個數值的轉換)

德摩根定律

(非A)與(非B)=非(A或B)

(非A )或 (非B ) =非(A與B)

[[ $filename =~ .+\.sh$ ]] && echo sh || echo no sh??? //判斷文件的后綴是否為.sh

條件測試:判斷某需求是否滿足

測試命令:test? EXPRESSION

[? EXPRESSION? ]???? 變量在中括號使用時,用雙引號引起來

[[ EXPRESSION? ]]???? //支持擴展的正則表達式? (=~? 代表左側字符串是否匹配右側的正則;==右側支持通配符)

表達式1?? -a?? 表達式2????? //與關系,都真結果才為真

表達式1?? -o?? 表達式2????? //或關系,都假結果才為假

-z???? //判斷字符串是否為空,為真代表空

-n??? //判斷字符串是否為空,為真代表非空(-n可以省略不寫)

[??? x”$var”?? =? “ x”? ]????????? //也可用來判斷字符串是否為空

-v????? //判斷變量是否被設置

-a 或-e?? //判斷文件是否存在

數值測試

gt??? 大于???????????????? ge??? 大于等于????????????????????????? eq?? 等于(比較數字)

lt??? 小于?????????????????? le???? 小于等于???????????????????????? ne?? 不等于

字符串測試

=~??????? (代表左側字符串是否匹配右側的正則)

read??? ?//實現對變量的賦值,可賦值多個變量(建議一次賦一個值)

-p??? //指定提示內容

-s??? //靜默輸入

-n?? //指定輸入的字符長度

-d?? //可指定結束符

-t?? //設置超時時間

read?? x y z?? <<<”I?? j?? k? ”?? //實現批量賦值將ijk? 分別賦給變量xyz

 

Bash如何展開命令行

  1. 把命令行分成單個命令詞
  2. 展開別名
  3. 展開大括號的聲明( {} )
  4. 展開波浪符聲明( ~?? )
  5. 命令替換$() 和?? ` `??? )
  6. 再次把命令行分成命令詞
  7. 展開文件通配( *??? ??? [abc] 等等)
  8. 準備I/O重導向( <???? >)
  9. 運行命令

Profile 類:

按功能劃分:profile類和bashrc類

Profile 類:為交互式登錄的shell提供配置

功用:用于定義環境變量、運行命令或腳本

Bashrc類:為非交互式和交互式登錄的shell提供配置

功用:定義命令別名和參數、定義本地變量

$- 變量 (默認功能組合himBH

h? //代表hash?????????? set?? +h???? //禁用hash????????????? set?? -h???????? //啟用hash

i??? //代表當前環境是不是交互式環境

m?? //代表打開監控模式

B?? //代表大括號擴展

H? //代表可以展開歷史列表中的命令?????? !!代表返回最近的一個歷史命令

 

.???? source???? bash????? 直接運行腳本 之間的區別

bash? 或者 直接運行腳本?? //兩者等價,都開啟子進程

source?????? //表示在當前shell中運行腳本,影響當前的工作環境

source?? 或?? .??? //一般用來運行配置文件

 

腳本中不識別別名,可以使用內部命令、外部命令

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95744

(0)
qljqlj
上一篇 2018-04-12 06:59
下一篇 2018-04-12

相關推薦

  • Centos7默認網卡名如何修改成eth*

    Centos7 新添加網卡默認的識別名ens*,用起來很不習慣,為了方便系統的統一化管理,如何將默認命名規則改成eth*?

    2018-04-29
  • 權限管理

    權限管理 普通權限 通過劃分為三種人來管理,所有者u,所屬組g,其他人o,所有人a 文件 刪除文件用文件所在文件夾的寫權限來決定 讀寫權限root不受控制,執行受控制 對于目錄沒有執行權限,無法進入目錄,無法查看目錄內文件屬性,無法查看文件內容 執行權限是基礎權限沒有執行讀寫權限無用 程序要運行,所在目錄要有執行權限 普通用戶無法更改文件的所有者,要更改文件…

    Linux筆記 2018-03-31
  • 計算機原理與Linux基礎

    計算機的組成及功能 1、其實計算機的組織分為內部設備和外部設備, 內部設備: ? ? ? ? CPU:運算器、寄存器、緩存 ? ? ? ? 存儲器:內存,RAM(Random Access Memory) ? ? ? ? 控制器:控制器是整個計算機系統的控制中心,它指揮計算機各部分協調地工作,保證計算機按照預先規定的目標和步驟有條不紊地進行操作及處理。 外部…

    Linux筆記 2018-05-13
  • Linux中的練習題

    Linux文本查看和處理練習題
    Linux用戶和組管理類命令的使用方法及練習題

    Linux筆記 2018-07-08
欧美性久久久久