變量、腳本、條件測試

一、編程基礎

  程序:指令+數據
  計算機:運行二進制指令

程序編程風格:
  過程式:以指令為中心,數據服務于指令
  對象式:以數據為中心,指令服務于數據
shell程序:提供了編程能力,解釋執行
編程語言:
  編譯:高級語言–>編譯器–>目標代碼
  解釋:高級語言–>解釋器–>機器代碼
shell編程:過程式、解釋執行

編程邏輯處理方式:順序執行,循環執行,選擇執行
編程語言的基本結構:數據存儲:變量、數組;表達式: a + b;語句:if

shell腳本是包含一些命令或聲明,并符合一定格式的文本文件
shell腳本的用途:自動化常用命令,執行系統管理和故障排除,創建簡單的應用程序,處理文本或文件

格式要求首行shebang機制:
            #!/bin/bash
            #!/usr/bin/python
            #!/usr/bin/perl

腳本使用
第一步:使用文本編輯器來創建文本文件
             首行必須聲明shell序列:#!
             除首行外添加注釋以#開頭
             腳本調試:bash -n /path/to/some_script (檢查是否有語法錯誤)
             語法檢測:bash -x /path/to/some_script(將腳本執行過程顯示出來,以便分析、排錯與調優)
第二步:運行腳本
                在子進程中執行(生成的環境變量及時刪除)
                    給予執行權限,在命令行上指定腳本的絕對/相對/PATH路徑
                   直接運行解釋器,將腳本作為解釋器程序的參數運行,可以沒有執行權限 bash/sh
               在父進程中執行(生成的本地和環境變量及時刪除)
                   使用source或.執行文件
                

shell腳本范例
#!/bin/bash
#author: wang
#Version: 1.0
#Description:This script displays some information about your # environment
echo"Greetings.The date and time are $(date)" echo"Your working directory is:$(pwd)"

二、變量:命名的內存空間

數據存儲方式(兩種變量的意義不同):字符;數值

變量類型的作用:
  數據存儲格式
  參與的運算
  表示的數據范圍

編程程序語言分類
強類型:定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤,如java,python
弱類型:無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用,如:bash 不支持浮點數

變量命名法則:
  1、不能使程序中的保留字:例如if, for;
  2、只能使用數字、字母及下劃線,且變量名不能以數字開頭
  3、見名知義
  4、統一命名規則:駝峰命名法(hostName|host_Name)
  5、等號兩端不能有空格
  6、如有特殊字符可用個\轉義或使用引號

變量的種類(根據變量的生效范圍等標準):
  1.本地變量:生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效
  2.環境變量:生效范圍為當前shell進程及其子進程
  3.局部變量:生效范圍為當前shell進程中某代碼片斷(通常指函數)
  4.位置變量:$1, $2, …${10}來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
  5.特殊變量:$?, $0, $*, $@, $#

1.本地變量
  變量賦值:name=‘value’,
  可以使用引用value:
  (1) 可以是直接字串; name=“root"
  (2) 變量引用:name="$USER"
  (3) 命令引用:name=`COMMAND`, name=$(COMMAND)
  本地變量轉變為環境變量:export name,declare -x name
  變量引用:${name}, $name
  "":弱引用,其中的變量引用會被替換為變量值
  '':強引用,其中的變量引用不會被替換為變量值,而保持原字符串
  顯示已定義的所有變量:set、declare
  刪除變量:unset name

Image 001.png

2.環境變量
  變量聲明、賦值:
  export name=VALUE
  declare -x name=VALUE
  環境變量轉變為本地變量:declare -x name
  變量引用:$name, ${name}
  顯示所有環境變量:export、env、printenv
  刪除:unset name
  bash有許多內建的環境變量:PATH, SHELL, USRE,UID, HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1

Image 002.png

3.只讀變量
  只讀變量:只能引用,但不能修改和刪除
  轉變為只讀變量:readonly name,declare -r name

Image 003.png

4.位置變量:
  在腳本代碼中調用通過命令行傳遞給腳本的參數
  $1, $2, …:對應第1、第2等參數,shift [n]換位置

5.特殊變量
  $0: 命令本身
  $*: 傳遞給腳本的所有參數,全部參數合為一個字符串
  $@: 傳遞給腳本的所有參數,每個參數為獨立字符串
  $#: 傳遞給腳本的參數的個數
  $@ $* 只在被雙引號包起來的時候才會有差異
  示例:判斷給出的文件的行數
    linecount="$(wc -l $1 | cut -d ' ' -f 1)"
    echo "$1 has $linecountlines."

Image 004.png

Image 005.png

三、算術運算

bash中的算術運算: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之間隨機數

echo $[RANDOM%50]

Image 006.png

賦值
增強型賦值:
+=, -=, *=, /=, %=
let varOPERvalue
例如:let count+=3
自加3后自賦值
自增,自減:
let var+=1
let var++
let var-=1
let var–

邏輯運算
true(1), false(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

短路運算:
1.短路與:
  第一個為0,結果必定為0;
  第一個為1,第二個必須要參與運算;
2.短路或:
  第一個為1,結果必定為1;
  第一個為0,第二個必須要參與運算;
3.異或:^
  異或的兩個值,相同為假,不同為真

聚集命令
復合式:date; who | wc -l
命令會一個接一個地運行
子shell:(date; who | wc -l ) >> /tmp/trace
所有的輸出都被發送給單個STDOUT和STDERR

四、退出狀態
進程使用退出狀態來報告成功或失敗
0 代表成功,1-255代表失敗
$? 變量保存最近的命令退出狀態
例如:
ping -c 1 -W 1 hostdown &> /dev/null
echo $?
Image 007.png退出狀態碼
bash自定義退出狀態碼
exit [n]:自定義退出狀態碼;
注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字
注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行的最后一條命令的狀態碼

五、條件測試
 判斷某需求是否滿足,需要由測試機制來實現;
專用的測試表達式需要由測試命令輔助完成測試過程;
?評估布爾聲明,以便用在條件性執行中
若真,則返回0
若假,則返回1

測試命令:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
注意:EXPRESSION前后必須有空白字符

條件性的執行操作符
根據退出狀態而定,命令可以有條件地運行
&& 代表條件性的AND THEN
|| 代表條件性的OR ELSE
例如:
grep -q no_such_user /etc/passwd || echo 'Nosuchuser'
ping -c 1 -W 2 station1 &> /dev/null && echo "station1isup" || (echo'station1isunreachable';exit1)

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的測試類型
1.數值測試:
  -gt: 是否大于;
  -ge: 是否大于等于;
  -eq: 是否等于;
  -ne: 是否不等于;
  -lt: 是否小于;
  -le: 是否小于等于;

2.字符串測試:
  ==:是否等于;
  >: ascii碼是否大于ascii碼
  <: 是否小于
  !=: 是否不等于
  =~: 左側字符串是否能夠被右側的PATTERN所匹配
  注意: 此表達式一般用于[[ ]]中;
  -z "STRING":字符串是否為空,空為真,不空為假
  -n "STRING":字符串是否不空,不空為真,空為假
  注意:用于字符串比較時的用到的操作數都應該使用引號

3.文件測試
(1)存在性測試
  -a FILE:兩個條件同時成立
  -o FILE: 任何一個條件成立
  -e FILE: 文件存在性測試,存在為真,否則為假;

(2)存在性及類別測試
  -b FILE:是否存在且為塊設備文件;
  -c FILE:是否存在且為字符設備文件;
  -d FILE:是否存在且為目錄文件;
  -f FILE:是否存在且為普通文件;
  -h FILE 或-L FILE:存在且為符號鏈接文件;
  -p FILE:是否存在且為命名管道文件;
  -S FILE:是否存在且為套接字文件;

(3)文件權限測試:
  -r FILE:是否存在且可讀
  -w FILE: 是否存在且可寫
  -x FILE: 是否存在且可執行

(4)文件特殊權限測試:
  -g FILE:是否存在且擁有sgid權限;
  -u FILE:是否存在且擁有suid權限;
  -k FILE:是否存在且擁有sticky權限;

(5)文件大小測試:
  -s FILE: 是否存在且非空;

(6)文件是否打開:
  -t fd: fd表示文件描述符是否已經打開且與某終端相關
  -N FILE:文件自動上一次被讀取之后是否被修改過
  -O FILE:當前有效用戶是否為文件屬主
  -G FILE:當前有效用戶是否為文件屬組

(7)雙目測試:
  FILE1 -efFILE2: FILE1與FILE2是否指向同一個設備上的相同inode
  FILE1 -ntFILE2: FILE1是否新于FILE2;
  FILE1 -otFILE2: FILE1是否舊于FILE2;

組合測試條件
第一種方式:
    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

使用read來把輸入值分配給一個或多個shell變量:
-p指定要顯示的提示
-t 超時時間
read從標準輸入中讀取值,給每個單詞分配一個變量
所有剩余單詞都被分配給最后一個變量
read -p “Enter a filename:“ FILE

1、編寫腳本/root/bin/systeminfo.sh,
   顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。

  #!bash
  # Description:This script displays some information about your
  # hardware,include hostname,IP addr,operating system version,kernel
  # version,CPU model,memory size,harddisk size.
  echo "hostname:`hostname`"
  echo "IP addr:`ifconfig | egrep -o "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}" | head -1`
  echo "OS version:`cat /etc/centos-release`"
  echo "kernel version:`uname -r`"
  echo "CPU model:`lscpu |grep 'Model name'|sed 's/.*://'|sed 's/^[[:space:]]\+//'`"
  echo "memory size:`free -m | grep "Mem" | tr -s [[:space:]] | cut -d " " -f 2` MB"
  echo "harddisk size:`fdisk -l | grep "/dev/sd:" | sed 's/.*:'// | sed 's/,.*'// | sed 's/^[[:space:]]\+'//"

2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中

  #!bash
  # Description:This script can copy /etc/ to /root/etcCCYY-MM-DD.
  cp -av /etc/ /root/etc`date %F` &&  echo "copy /etc/ to /root/`date %F` successful"

3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值

  #!/bin/bash
  # Description:This script displays the max using rate of harddisk.
  echo "The max using rate of harddisk:`df | tr -s " " | cut -d " " -f 5 | tail -n +2 | sort | tail -1`"

4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序

  #!/bin/bash
  # Description:This script displays the IPv4 addr and links of every host
  echo "the links number:`netstat -nt | tr -s ' ' | cut -d ' ' -f 5 | cut -d ":" -f 1 | grep [0-9] | sort | uniq -c | sort -nr`"
  (echo "the links number:`netstat -nt | tr -s ' ' | cut -d ' ' -f 5 | cut -d ":" -f 1 | tail -n +2 | sort | uniq -c | sort -nr`")

5、寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和

  #!/bin/bash
  # Description:This script shows the sum of the two users' ID
  id1=`sed -n "10p" /etc/passwd | cut -d ":" -f 3`
  id2=`sed -n "20p" /etc/passwd | cut -d ":" -f 3`
  sumid=$[id1+id2]
  echo "the sum of the two users' ID:$sumid"

6、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和

  #!/bin/bash
  # Description:This script can sum two file space line
  space1=`grep "^[[:space:]]*$" $1 | wc -l`
  space2=`grep "^[[:space:]]*$" $2 | wc -l`
  sumspace=$[space1+space2]
  echo "two files' sum of space line:$sumspace"

7、寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件

  #!/bin/bash
  # Description:This script can sum some directories' files
  file1=`ls -1d /etc/* | wc -l`
  file2=`ls -1d /var/* | wc -l`
  file3=`ls -1d /usr/* | wc -l`
  sumfile=$[file1+file2+file3]
  echo "these directories' file is $sumfile "

8、寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果
   參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數

  #!/bin/bash
  # Description:This script can find the file's space line
  echo "the file's space line is`[[ $# -lt 1 ]] && echo "must provode a file" || grep -c  '^[[:space:]]*$' $1`"

9、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如
   果不可ping通,則提示用戶“該IP地址不可訪問”

  #!/bin/bash
  ping $1 > /dev/null && echo "the IP addr $1 can access" || echo "he IP addr $1 can not access"

10、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫

  #!/bin/bash
  [ -r /tmp/file1 -a -w /tmp/file1 ] && echo "`whoami` can read and write " || echo  "`whoami` can not read and write "

11、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。

  #!/bin/bash
  [ -e /etc/nologin ] && exit || touch /etc/nologin && echo "disable user login "
  #!/bin/bash
  [ -e /etc/nologin ] && rm -f /etc/nologin && echo "enable user login "

12、判斷硬盤的每個分區空間和inode的利用率是否大于80,如果是,發郵件通知root磁盤滿

     #!/bin/bash
     sizerate=`df | tr -s " " | cut -d " " -f 5 | sort -nr | head -1 | grep -o '[[:digit:]]\+'`
     inoderate=`df -i | tr -s " " | cut -d " " -f 5 | sort -nr | head -1 | grep -o '[[:digit:]]\+'`
     [ $sizerate -gt 80 ] && mail -s "size waring" root < /root/sizewaring
     [ $inoderate -gt 80 ] && mail -s "inode waring" root < /root/inodewaring

     
13、指定文件做為參數,判斷文件是否為.sh后綴,如果是,添加x權限

    #!/bin/bash
    read -p "Please input a file:"file
    [ ! ( -e $file -a -f $file ) ] && echo "format error" && exit 
    echo "$file" | grep -q ".*\.sh$" && (chmod +x $file;echo "the $file is add x") || echo "this is not a .sh file"

14、判斷輸入的IP是否為合法IP
   

 #!/bin/bash
    read -p "Please input a IP addr:"ipaddr
    echo $ipaddr | grep -E "(\<(1?[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.){3}\<(1?[0-9][0-9]|2[0-4][0-9]|25[0-5])\>$" > /dev/null && echo "this a userful ip" || echo "this is a not useful ip"

15、計算1+2+3+…+100

     #!/bin/bash
     echo {1..100} | tr " " "+" | bc
     #echo {$1 $2} | tr " " "+" | bc

     #seq -s + 1 100 | bc

16、輸入起始值A和最后值B,計算從A+(A+1)…+(B-1)+B的總和
    #!/bin/bash
    read -p "fisrt number:"no1
    read -p "second number"no2
    [ $no1 -ge $no2 ] && echo "sum is `seq -s + $no2 $no1 | bc" || echo "sum is `seq -s + $no1 $no2 | bc"

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

(0)
anonymousanonymous
上一篇 2016-08-15 09:25
下一篇 2016-08-15 09:25

相關推薦

  • linux系統安裝流程

    CnetOS6及CnetOS7 系統具體安裝流程

    Linux干貨 2018-03-27
  • 計算機的組成及其功能。

    一、計算機的組成及其功能。 計算機,是現代一種用于高速計算的電子計算機器,可以進行數值計算,又可以進行邏輯計算,還具有存儲記憶功能。是能夠按照程序運行,自動、高速處理海量數據的現代化智能電子設備。 1、運算器(Arithmetical and Logical Unit):計算機中執行各種算術和邏輯運算操作的部件。運算器的基本操作包括加、減、乘、除四則運算,與…

    Linux干貨 2016-10-30
  • 談談對于vmware Workstation 網絡連接三種模式的認識.

    簡介: VM(VMware Workstation簡稱VM,后面都將用VM代替闡述)是一款功能強大的虛擬化軟件.VM支持在 單一的桌面上同時運行多款不同的操作系統,能夠模擬完整的網絡環境,支持pxe功能.實時快照,等等多種強 大的功能.能夠測試軟件和部署新的業務測試.同時節約了很多資源.節約了企業成本.所以對于廣大的互聯網 從業者是不可多得的好工具. 本文中…

    Linux干貨 2015-08-24
  • sed的詳細用法

    sed(Stream EDitor)是一款流編輯器,用來對文本進行過濾與替換操作。其原理是:通過文件或管道讀取文件內容,但是sed默認并不直接修改源文件,而是一次僅讀取文件的一行至模式空間(pattern space)根據sed指令進行編輯并輸出結果后清除模式空間,即所有的操作都是在模式空間中進行的。 語法格式 sed [option]…&nb…

    Linux干貨 2016-11-14
  • 網絡26期 第五周作業

    1. 顯示當前系統上root、fedora或user1用戶的默認shell egrep -o “^(root|fedora|user1)\>.*[^:]+$” /etc/passwd | cut -d: -f1,7 2. 找出/etc/rc.d/init.d/functions文件中某單詞后面跟一組小括號的行,形如:hello(…

    2017-03-13
  • 馬哥linux0803作業內容

    1. 創建sysadmins組 將用戶user1,user2,user3加入sysadmins組中 將user3設置為sysadmins的管理員 用user3登錄,將user2從組中移除 設置sysadmins的密碼centos 設置user1 在創建新文件時,文件的所屬組為sysadmins 刪除user1…3 刪除sysadmins 2、三種權限rwx對…

    Linux干貨 2016-08-04

評論列表(1條)

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

    文章思路清晰,整體架構層次感強烈,內容更豐滿,望以后的能按時提交博客哦,

欧美性久久久久