shell腳本之變量、運算、條件測試。

概述

程序:指令+數據

程序編程風格:

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

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

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

計算機:運行二進制指令;

編程語言:

低級:

            匯編

高級:

            編譯:高級語言–>編譯器–>目標代碼 java,C#

            解釋:高級語言–>解釋器–>機器代碼 shell, perl, python

編程邏輯處理方式:

        順序執行

        循環執行

        選擇執行

shell編程:

        過程式、解釋執行

編程語言的基本結構:

        數據存儲:

        變量、數組 表達式: a + b

        語句:if

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

格式要求:首行shebang機制

        #!/bin/bash

        #!/usr/bin/python

        #!/usr/bin/perl

shell腳本的用途有:

        自動化常用命令

        執行系統管理和故障排除

        創建簡單的應用程序

        處理文本或文件

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

 變量命名法則:

        1、不能使程序中的保留字:例如if, for;

        2、只能使用數字、字母及下劃線,且不能以數字開頭

        3、見名知義

        4、統一命名規則:駝峰命名法

變量的種類;

 根據變量的生效范圍等標準:

本地變量:生效范圍為當前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, PS1

位置變量

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

位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數

            $1, $2, …:對應第1、第2等參數,shift [n]換位置

            $0: 命令本身

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

            $@: 傳遞給腳本的所有參數,每個參數為獨立字符串

            $#: 傳遞給腳本的參數的個數

            $@ $* 只在被雙引號包起來的時候才會有差異

             相同點:都是引用所有參數
             不同點:只有在雙引號中體現出來
            假設你的腳本運行時你寫了三個參數 分別存儲在$1 $2 $3中
            則"$*" 等價于 “$1 $2 $3"  —》傳遞了一個參數
            而“$@" 等價于 "$1"  "$2"  "$3"   —》傳遞了三個參數

示例:判斷給出的文件的行數 linecount="$(wc -l $1| cut -d' ' -f1)" echo "$1 has $linecount lines."

bash中的算術運算:

help let +, -, *, /, %取模(取余), **(乘方) 實現算術運算:

            (1) let var=算術表達式

[root@centous1 ~]# let var1=1+2
[root@centous1 ~]# echo $var1
3

            (2) var=$[算術表達式]

[root@centous1 ~]# var2=$[2+3]
[root@centous1 ~]# echo $var2
5

            (3) var=$((算術表達式))

[root@centous1 ~]# var3=$((3+4))
[root@centous1 ~]# echo $var3
7

            (4) var=$(expr arg1 arg2 arg3 …)

[root@centous1 ~]# var4 = $(expr $var2 + $var3)
-bash: var4: command not found
[root@centous1 ~]# var4=$(expr $var2 + $var3)
[root@centous1 ~]# echo $var4
12
這里我犯了一個錯誤,注意等號的兩邊是沒有空格的。

            (5) declare –i var = 數值

            (6) echo ‘算術表達式’ | bc

乘法符號有些場景中需要轉義,如*

bash有內建的隨機數生成器:$RANDOM(1-32767) echo $[$RANDOM%50] :0-49之間隨機數

自增,自減:

        let var+=1

        let var++

        let var-=1

        let var–

邏輯運算

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

        ? && 代表條件性的AND  THEN

        ? ||  代表條件性的OR  ELSE

數值測試:

        -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權限;

第一種方式:

COMMAND1 && COMMAND2 并且 COMMAND1 || COMMAND2 或者 ! COMMAND   非

如:[ -e FILE ] && [ -r 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

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

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

相關推薦

  • 一位老it工程師的忠告,新手進來學習,老手進來體會,收獲很大。

    諸位,咱當電子工程師也是十余年了,不算有出息,環顧四面,也沒有看見幾個有出息的!回顧工程師生涯,感慨萬千,愿意講幾句掏心窩子的話,也算給咱們師弟師妹們提個醒,希望他們比咱們強! [1]好好規劃自己的路,不要跟著感覺走!根據個人的理想決策安排,絕大部分人并不指望成為什么院士或教授,而是希望活得滋潤一些,爽一些。那么,就需要慎重安排自己的軌跡。從哪個行業入手,逐…

    Linux干貨 2015-02-26
  • httpd 2.2(Apache Web服務器)

    apache (Web服務器) 簡介: Apache是世界使用排名第一的Web服務器軟件。它可以運行在幾乎所有廣泛使用的計算機平臺上,由于其跨平臺和安全性被廣泛使用,是最流行的Web服務器端軟件之一。它快速、可靠并且可通過簡單的API擴充,將Perl/Python等解釋器編譯到服務器中。    Apache HTTP服務器是一個模塊化的服…

    Linux干貨 2016-03-30
  • 搜索引擎-倒排索引基礎知識

    1.單詞——文檔矩陣        單詞-文檔矩陣是表達兩者之間所具有的一種包含關系的概念模型,圖3-1展示了其含義。圖3-1的每列代表一個文檔,每行代表一個單詞,打對勾的位置代表包含關系。          …

    Linux干貨 2015-12-10
  • LVM(邏輯卷管理)

    LVM 邏輯卷管理 概述:      LVM是將一個或多個硬盤的分區在邏輯上集合,相當于一個大硬盤來使用,當硬盤的空間不夠使用的時候,可以繼續將其它的硬盤的分區加入其中,這樣可以實現磁盤空間的動態管理,相對于普通的磁盤分區有很大的靈活性。與傳統的磁盤與分區相比,LVM為計算機提供了更高層次的磁盤存儲。它使系統管理員可以更方便的為…

    Linux干貨 2016-09-05
  • do some test

    1、簡述TCP三次握手四次揮手過程及各過程中客戶端和服務器端的狀態。     三次握手:         a(syn-send) -> send syn -> b(listen)         a(syn-send) <- receive …

    Linux干貨 2016-06-12
  • 操作系統概述

                                 操作系統概述 對于一個真正的計算機系統來說,我們可以說它是由硬件+軟件組成。沒有軟件的計算機,我們稱它為裸機。當然,它也干不成什么事。所以,要想使得計算…

    Linux干貨 2016-10-27

評論列表(1條)

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

    寫的很詳細,總結的·很棒哦,作業需要好好完成哦

欧美性久久久久