shell腳本編程基礎

★ 編程基礎
★ 腳本基本格式
★ 變量
★ 運算
★ 條件測試
★ 配置用戶環境
一.編程基礎
  程序:指令+數據
  程序編程風格:
      過程式:以指令為中心,數據服務于指令
      對象式:以數據為中心,指令服務于數據
  shell程序:提供了編程能力,解釋執行
 1.程序的執行方式
   計算機:運行二進制指令
   編程語言:
       低級:匯編
       高級:
             編譯:高級語言–編譯器–目標代碼
                         java,C#
             解釋:高級語言–解釋器–機器代碼
                         shell,perl,python
 2. 編程的基本概念
    ? 編程邏輯處理方式:
           順序執行
           循環執行
           選擇執行
    ?  shell編程:過程式、解釋執行
        編程語言的基本結構:
              各種系統命令的組合
              數據存儲:變量、數組
              表達式:a + b
        語句:if
二.腳本基本格式
? shell腳本基礎
    shell 腳本:包含一些命令或聲明,并符合一定格式的文本文件
    格式要求:首行shebang 機制
    #!/bin/bash
    #!/usr/bin/python
    #!/usr/bin/perl
     shell 腳本的用途有:
     1.自動化常用命令

     2.執行系統管理和故障排除

     3.創建簡單的應用程序

     4.處理文本或文件
? 創建shell腳本
第一步:使用文本編輯器來創建文本文件
? 第一行必須包括shell 聲明序列:#!
 #!/bin/bas
? 添加注釋
注釋以# 開頭
第二步:運行腳本
? 給予執行權限,在命令行上指定腳本的絕對或相對路徑
? 直接運行解釋器,將腳本作為解釋器程序的參數運行
? shell腳本示例
#!/bin/bash
#Author: wang
#Version: 1.0
#Date: 2016-05-01
#Description:The script displays system information
echo “Greetings. The date and time are $(date)”
echo “Your working directory is: $(pwd)”
? 腳本調試
? 檢測腳本中的語法錯誤
  bash -n /path/to/some_script
? 調試執行
  bash -x /path/to/some_script
三 變量
? 變量:命名的內存空間
     數據存儲方式:
       字符:
       數值:整型,浮點型
? 變量:變量類型
   作用:
   1、數據存儲格式
   2、參與的運算
   3、表示的數據范圍
   類型:
       字符
       數值:整型、浮點型
? 強類型:定義變量時必須指定類型、參與運算必須符合類型
? 要求:調用未聲明變量會產生錯誤
    如 java,c
? 弱類型:無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用
如:bash  不支持浮點數,python
    變量命名法則:
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
“” :弱引用,其中的變量引用會被替換為變量值
” :強引用,其中的變量引用不會被替換為變量值,而保持原字符串
顯示已定義的所有變量:set
刪除變量:unset name
? 環境變量
     變量聲明、賦值:
     export name=VALUE

     declare -x name=VALUE

      變量引用:$name, ${name}

      顯示所有環境變量:
       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第2 等參數,shift [n] 換位置
$0: 命令本身
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
    $@ $* 只在被雙引號包起來的時候才會有差異
set — 清空所有位置變量
四 算術運算
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
例如:let count+=3
    自加3 后自賦值
    自增,自減:
    let var+=1
    let var++
    let var-=1
    let var–
 ? 邏輯運算
 非:!
   !1=0
   !0=1
  短路運算:
    短路與:
    第一個為0,結果必定為0
    第一個為1,第二個必須要參與運算
  短路或:
    第一個為1,結果必定為1
    第一個位0,第二個必須要參與運算
  異或:^
    異或的兩個值,相同為假,不停同為真
? 退出狀態碼
bash 自定義退出狀態碼
exit [n] :自定義退出 狀態碼
注意:腳本中一旦遇到exit 命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字
注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行的最后一條命令的狀態碼
五 條件測試
判斷某需求是否滿足,需要由測試機制 來實現
專用的測試表達式需要由測試命令輔助完成 測試過程
評估布爾聲明,以便用在條件性執行中
? 若真,則返回0
? 若假,則返回1
   測試命令:
? test EXPRESSION
? [ EXPRESSION ]
? [[ EXPRESSION ]]
注意:EXPRESSION 前后必須有空白字符
? 條件性的執行操作符
根據退出狀態而定,命令可以有條件地運行
? && 代表條件性的AND THEN
? || 代表條件性的OR ELSE
  例如:
$ grep -q no_such_user /etc/passwd || echo ‘No such user’
No such user
$ ping -c1 -W2 station1 &> /dev/null  && echo “station1 is up”  || (echo ‘station1 is unreachable’; exit 1)
station1 is up
? test 命令
長格式的例子:
$ test “$A” == “$B” && echo “Strings are equal”
$ test “$A” -eq “$B” && echo “Integers are equal”
  簡寫格式的例子:
$ [ “$A” == “$B” ] && echo “Strings are equal”
$ [ “$A” -eq “$B” ] && echo “Integers are equal”
? 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:  是否存在且可執行
  文件特殊權限測試:
    -u FILE :是否存在且擁有suid 權限
    -g FILE :是否存在且擁有sgid 權限
    -k FILE :是否存在且擁有sticky
  文件大小測試:
    -s FILE:  是否存 在 且 非空
  文件是否打開:
    -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
必須使用測試命令 進行;
   示例:
     # [ -z “$HOSTNAME” -o $HOSTNAME “==”localhost.localdomain” ] && hostname www.magedu.com
     # [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
六 配置用戶環境
? 使用read命令來接受輸入
     使用read 來把輸入值分配給一個或多個shell 變量:
     -p 指定要顯示的提示
     -s 靜默輸入
     -n N 指定輸入的字符長度N
     -d ‘字符’ 輸入結束符
     -t N TIMEOUT 為N秒 秒
read 從標準輸入中讀取值,給每個單詞分配一個變量,所有剩余單詞都被分配給最后一個變量
read -p “Enter a filename: “ FILE
? bash如何展開命令行
    ?把命令行分成單個命令詞
    ?展開別名
    ?展開大括號種的聲明({}) )
    ?展開波浪符聲明(~) )
    ?命令替換$() 和 “)
    ?再次把命令行分成命令詞
    ?展開文件通配(
、? 、[abc] 等等)
    ?準備I/0 重導向(< 、>) )
    ?運行命令
? 防止擴展
   反斜線(\ )會使隨后的字符按原意解釋
   $ echo Your cost: \$5.00

   Your cost: $5.00

   加引號來防止擴展

    ? 單引號(’ )防止所有擴展
    ? 雙引號(” )也防止所有擴展,但是以下情況例外:
     $(美元符號) - 變量擴展
   `(反引號) - 命令替換

   \(反斜線) - 禁止單個字符擴展

   !(嘆號) - 歷史命令替換

? bash的配置文件
  按生效范圍劃分,存在兩類:
   全局配置:
   /etc/profile
   /etc/profile.d/.sh
   /etc/bashrc
    個人配置:
   ~/.bash_profile
   ~/.bashrc
? shell登錄兩種方式
交互式登錄:
 (1) 直接通過終端輸入賬號密碼登錄;
 (2) 使用“su – UserName”  切換的用戶
執行順序:
/etc/profile –> /etc/profile.d/
.sh –>/.bash_profile –> ~/.bashrc –> /etc/bashrc
非交互式登錄:
(1)su UserName
(2) 圖形界面下打開的終端
(3) 執行腳本
執行順序:
~/.bashrc –> /etc/bashrc –> /etc/profile.d/.sh
? Profile類
按功能劃分,存在兩類:
   profile 類和bashrc類 
? profile 類:為交互式登錄的shell 提供配置
   全局:/etc/profile, /etc/profile.d/
.sh
   個人:~/.bash_profile
   功用:
   (1)用于定義環境變量
   (2)運行命令或腳本 
? Bashrc類
 bashrc 類:為非交互式和交互式登錄的shell 提供配置
  全局:/etc/bashrc
  個人:~/.bashrc
  功用:
  (1)定義命令別名和函數
  (2)定義本地變量
? 編輯配置文件生效
修改profile 和bashrc 文件后需生效
兩種 方法:
1 重新啟動shell 進程
2 .或source
  例:
   . ~/.bashrc
? Bash 退出任務
保存在~/.bash_logout 文件中(用戶)
在退出登錄shell 時運行
用于
? 創建自動備份
? 清除臨時文件

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

(0)
xialingfengxialingfeng
上一篇 2017-03-28
下一篇 2017-03-28

相關推薦

  • 三步走進行IP大揭秘

    跟隨博主三步走進行IP大揭秘! 一、IP簡介 1.ip地址:可以分為合法ip地址(公網ip地址)和私有ip地址, 合法ip地址主要應用于internet上的主機訪問,而私有ip地址應用于局域網中計算機的相互通信。 2.ip地址的表示形式:分為二進制表示和點分十進制表示。 一般使用點分十進制表示,現在通常使用的ip地址長度均為32位,由四個八位域組成,可稱為八…

    2017-09-02
  • linux基礎1

    linux基礎

    Linux干貨 2018-03-08
  • 為什么新建文件時,所在文件系統還有大量剩余空間,卻提示此文件系統空間已滿??

    一:答疑解惑:    這是因為該文件所在分區的inode號被用盡,雖然分區的剩余容量還有很多。 二:基本原理:   inode為何物block又為何物?以及,inode都有哪些特征?   ①我們知道,在linux文件系統中,文件名只是計算機用來給人看,而計算機本身只識別文件所對應的數字或編號,而這個編號或數字…

    2017-07-22
  • Javascript 裝載和執行

    一兩個月前在淘寶內網里看到一個優化Javascript代碼的競賽,發現有不少的人對Javascript的執行和裝載的基礎并不懂,所以,從那天起我就想寫一篇文章,但一直耽擱了。自上篇《瀏覽器渲染原理簡介》,正好也可以承前啟后。 首先,我想說一下Javascript的裝載和執行。通常來說,瀏覽器對于Javascript的運行有兩大特性:1)載入后馬上執行,2)執…

    Linux干貨 2016-08-15
  • Linux Sysadmin–part1

    一、創建一個10G分區,并格式為ext4文件系統; 1、要求其block大小為2048,預留空間百分比為2,卷標為MYDATA,默認掛載屬性包含acl; 2、掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳; ###創建10G分區 ~]# fdisk /dev/sdb Command (m for help): n P…

    2017-09-04
  • RAID詳解

    測試機centos6.7 x86_64 一、RAID是什么     簡單描述:RAID(Redundant Array of indenpensive Disk)獨立磁盤冗余陣列:磁盤陣列是把多個磁盤組成一個陣列,當作單一磁盤使用,它將數據以分段或條帶(striping)的方式儲存在不同的磁盤中,存取數據時,陣列中的相關磁盤一起…

    2016-02-14
欧美性久久久久