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 12:10
下一篇 2016-08-15 12:10

相關推薦

  • N22-第四周作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 [root@localhost ~]# cp -r /etc/skel /home/tuser1    (復制/etc/skel為/home/tuser1) [root@localho…

    Linux干貨 2016-09-05
  • Linux作業管理、網絡客戶端工具和bash循環

    Linux系統作業控制;                   job:         前臺作業foregroud:通過終端啟動,且啟動后會一直占據終端;         后臺作業…

    Linux干貨 2017-01-05
  • 軟件包管理工具——yum

        在linux上安裝管理軟件包會遇到包依賴問題,使用yum工具就可以很好的解決這個問題,yum的工作原理基于c/s結構:客戶端與服務器,搭建好客戶端與服務器,就可以使用yum工具了。 一、搭建yum倉庫客戶端 1.yum倉庫的路徑有三種:http://, ftp://,file://,首先創建一個配置文件,用來存放yum倉庫的路徑,…

    2017-08-06
  • 關于Raid的各種類型特點概要

    關于Raid需要了解掌握的要點

    Linux干貨 2017-11-26
  • TCP常見問題總結

    TCP協議和UDP協議的區別是什么 TCP協議是有連接的,有連接的意思是開始傳輸實際數據之前TCP的客戶端和服務器端必須通過三次握手建立連接,會話結束之后也要結束連接。而UDP是無連接的 TCP協議保證數據按序發送,按序到達,提供超時重傳來保證可靠性,但是UDP不保證按序到達,甚至不保證到達,只是努力交付,即便是按序發送的序列,也不保證按序送到。 TCP協議…

    Linux干貨 2017-09-02
  • 上海2016全球運維大會 美女辣妹吸引眼球!

    國內第一個運維行業大會 GOPS 2016全球運維大會(上海站)在2016年9月23-24日在上海雅悅新天地大酒店舉辦,面向IT及傳統行業、廣大運維技術人員,傳播先進技術思想和理念,分享業內最佳實踐。 參會兩日,雖然大會主角是運維技術交流學習,不過卻意料之外的邂逅了另一道靚麗的風景,瞬間燃了… 在會場,站立著一群高挑美女,我的…

    2016-12-05

評論列表(1條)

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

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

欧美性久久久久