1. 程式人生 > >linux學習—shell腳本知識點總結

linux學習—shell腳本知識點總結

本地變量 刪除 blob 日期 $0 返回結果 生效 -o 不能

Shell腳本 --Shell腳本有點像早期的批處理文件,將一些命令匯總起來一次執行,但Shell有更強大的功能,可以類似於程序的編寫,不需要編譯就能執行,使用起來很方便,可以簡化我們日常的管理工作



目錄

  • 什麽是Shell

  • 腳本的運行方法

  • #!(讀shabang)的作用詳解

  • 結合案例分析變量類型

  • 特殊變量及其$@ $*的區別

  • 退出狀態

  • 算數運算

  • test和[ expression ]判斷


一、什麽是Shell

我們知道管理整個計算機硬件的其實是核心(kernel),用戶都是以Shell來與核心溝通,只要有操作系統,就離不開Shell。

如圖顯示了Shell,用戶和硬件的關系,形象的說Shell就是用戶控制硬件的一種語言工具。

技術分享圖片 技術分享圖片


二、腳本的運行方法

chmod u+x 腳本名

然後直接輸入腳本路徑執行

要求shell腳本中第一行加入#!解釋器

因為這是文件執行,需要有執行權限

/bin/bash 腳本名

如果shell腳本中第一行加入#!解釋器,則自動忽略,仍然以bash作為shell

這是運用解釋器處理文件,所以不需要給文件加執行權限

總之,上述的兩種方法中真正執行永遠的都是shell(默認為bash)

當然#!還可以跟/usr/bin/python,/usr/bin/perl

腳本調試

bash -n 腳本路徑 語法檢測

bash -x 腳本路徑 調試執行,把執行成功的結果顯示,不成功的報錯


三、#!(讀shabang)的作用詳解

先看這個Shell腳本

     #!/bin/bash
     echo "Hello World"

當沒有#!的時候,默認/bin/bash

舉個例子加深#!的作用:

  vim test.rm
  #!/bin/rm -f
  echo hello world

保存退出

ls 發現多了一個text.rm的文件

  /bin/bash test.rm
  結果顯示 hello world
 chmod u+x test.rm
 ./test.rm

沒有顯示任何信息

ls 發現test.rm文件沒有了

總結:當運行腳本是bin/bash或/usr/bin/python或/usr/bin/perl + 腳本時,則忽略第一行#!後邊的內容,使用手動輸入的shell,結果執行例子中的echo;當運行腳本是直接腳本路徑時,test.sh調用#!後邊的命令,刪除該文件,不執行echo.

# --->後邊的內容為註釋


四、結合案例分析變量類型

局部變量

生效為僅為當前shell(即使子shell也不能)

A=123 B=$USER C=$(hostname)

echo $A echo $B echo $C

echo "$A"456

echo ${A}456

set 命令查看所有局部變量

unset + 變量名 取消指定局部變量和環境變量

案例:

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

            #!/bin/bash
            echo ipv4地址:$(ifconfig eth0 |tr "\n" " " |tr -s " " $ |cut -d$ -f7 |cut -d: -f2)
            echo 系統版本:$(cat /etc/redhat-release)
            echo 內核版本:$(uname -r)
            echo 內存大小:$(cat /proc/meminfo |tr "\n" $ |cut -d$ -f1 |grep -o "[0-9]*") KB
            echo 硬盤大小:$(fdisk -l |grep "sda\>" |cut -d: -f2 |cut -d, -f1)
            echo CPU型號:$(cat /proc/cpuinfo |grep "name" |sort -u |cut -d: -f2)

2、編寫腳本/root/bin/backup.sh,可實現將/etc/目錄備份到/root/etcYYYY-mm-dd中(date +%F 以年-月-日顯示日期

            #!/bin/bash
            cp -r /etc/ /root/etc$(date +%F)

環境變量

當前shell和子shell

如:A=mage

echo $A #顯示mage

bash #開啟當前shell的子shell

echo $A #沒有顯示內容

說明A只是一個局部變量

環境變量的聲明

export + 變量名

declare -x 變量名

查看所有環境變量

export , declare -x , env ,printenv

只讀變量

readonly 變量名 聲明只讀變量

readonly -p 查看所有只讀變量

本地變量:通常指函數

位置變量:傳遞參數

$1,$2,... 對應的1等,2等參數

set -- 清空所有位置變量


五、特殊變量及其$@ $*的區別

特殊變量

$? 上個命令的退出狀態

$0 當前腳本的文件名

$* 傳遞給腳本或函數的所有參數(當做一個整體的字符)

$@ 傳遞給腳本或函數的所有參數(每個參數作為一個獨立的字符)

$# 傳遞給腳本或函數的參數個數

$$ 當前Shell進程ID

如:

        vim test.sh        
        echo $1
        echo $2
        echo $3
        echo $#
        /bin/bash ./test.sh 4 5 6 7

結果顯示:4 5 6 4(7多余;共輸入了4個參數)

$@ $*的區別

都表示傳遞給函數或腳本的所有參數,但是當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體;"$@" 會將各個參數分開

寫兩個腳本實驗$*,$@的區別:

        vim b.sh        
        #!/bin/bash
        echo '$@是' $1

保存退出

        vim a.sh            
        #!/bin/bash
        echo '$*是' $*
        /app/b.sh $@

保存退出

        chmod +x a.sh b.sh        
        ./a.sh {a..z}

結果顯示:

       $*是 a b c d e f g h i j k l m n o p q r s t u v w x y z
       $@是 a

六、退出狀態

所謂退出狀態,就是上一個命令執行後的返回結果。

0 代表成功 1-255 代表失敗(不同類型)

$? 保存最近的命令的退出狀態,命令執行成功就為0,失敗就為1-255

技術分享圖片

小tip:我們可以把變量$?用在判斷語句中

exit [n] 自定義退出狀態碼

腳本一旦運行到exit [n],當前shell就會退出,並把n賦值給$?


六、算數運算

+ - * / %(取余) **(乘方)

實現算數運算方法:

(1) let var=算術表達式

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

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

(4) declare –i var= 算數表達式

(5) echo '算術表達式' | bc

隨機數生成器:$RANDOM(0-32767)---- 相當於一個算數表達式

echo $[$RANDOM%50] :0-49之間隨機數


七、test和[ expression ]判斷

test + expression

=或者== 判斷兩個字符是否相等,並不能判斷數字是否相等

技術分享圖片技術分享圖片

!= 判斷兩個字符不相等

> 判斷兩個字符大於

< 判斷兩個字符大於(按照ASCII碼大小)

=~ 判斷兩個字符是否匹配 (常用於[[ ]]中,支持擴展正則表達式,兩個字符最好用""括起來

-eq 判斷兩個數值是否相等(equal)

-ne 判斷兩個數值不等(not equal)

-gt 判斷兩個數值大於(greater than)

-ge 判斷兩個數值大於等於(greater equal)

-lt 判斷兩個數值小於(less than)

-le 判斷兩個數值小於等於(less equal)

[ expression ]

註意:[ 後邊的空格和 ] 前面的空格,必須要有,其實 [ 是一個命令,位於/usr/bin/目錄下

-f 判斷是否是普通文件

-d 判斷是否是目錄

-x 判斷是否有執行權限

-z 判斷字符是否為空

-n 判斷字符是否為不空

test和 [ ] 通用
































linux學習—shell腳本知識點總結