天天看點

《Linux shell變量總結回顧》RHEL6

     在實際的生産中,運維一般使用的shell文法還是比較多的,時不時的就要寫一個簡短shell腳本,大型的shell腳本用到的function 比較多,便于下一個腳本的引入,下面主要總結一些簡單的shell指令,文法,便于今後shell腳本的書寫。

環境變量路徑:

[root@localhost ~]# set   //檢視到的是局部變量和全局變量2種

[root@localhost ~]# env  //檢視系統的全局環境變量

[root@localhost ~]# echo $PATH  //檢視系統環境變量路徑

[root@localhost ~]# export $PATH  //也可以使用export檢視環境變量路徑

[root@localhost ~]# export PATH=$PATH:/date/  //臨時添加/date目錄到環境變量路徑下

要想重新開機主機後還生效就要編輯環境配置檔案root/.bashec或/root/.bash_profile與/etc/profile檔案,想要立刻生效可以使用指令:

注:.bash_profile檔案支隊系統目前使用者生效

[root@localhost ~]# source .bash_profile  

[root@localhost ~]# ls –a    可以檢視到這2個檔案

腳本的執行:

sh script    //這種方法script不需要可執行權限

./ script          //必須具有可執行權限

. script           //這種方法script也不需要可執行權限

區分局部變量和全局變量

[root@localhost ~]# str=1000   //局部變量

[root@localhost ~]# echo $str

1000

去編輯一個腳本:

# vim bianliang.sh

#!/bin/bash

echo $str

[root@localhost ~]# bianliang.sh  //我們定義的變量,但是通過腳本卻不能輸出

[root@localhost ~]# export str   //添加到全局變量中

[root@localhost ~]# bianliang.sh   //再次使用完全ok

要想完全的清除某個全局變量:

# unset str  清除全局變量

#env   可以檢視到所有全局變量

&& || 的用法:(參數的比對)

&& 條件符合要求才會執行後面的動作

||    條件不符合要求時才會執行後面的動作

//檢視/ect目錄下是否有/grub.conf檔案,有則輸出yes,無則輸出no。

[root@localhost ~]# [ -f /etc/grub.conf ] && echo yes  || echo no 

Yes        

檢視/shellscripts/hello.sh是否可執行,可執行則輸入yes,否則就賦予它可執行權限

[root@localhost shellscripts]# [ -x /shellscripts/hello.sh ] && echo yes || chmod +x /shellscripts/hello.sh

[root@localhost shellscripts]# ls

hello.sh  ipadd.sh  logmess_clean.sh 

[root@localhost shellscripts]# hello.sh

hello world!   

“”和‘’與 ` ` 在shell變量中的差別       

“ ” 允許通過$符引用其他變量

‘’禁止引用其他變量符,視為普通字元

`` 将指令執行的結果輸出給變量

[root@localhost ~]# echo "$PWD is lujing"

/root is lujing

[root@localhost ~]# echo '$PWD is lujing'

$PWD is lujing

[root@localhost ~]# echo $a

[root@localhost ~]# echo $aaaaaaaa  //系統把$aaaaa視為一個變量

[root@localhost ~]# echo ${a}aaaaaa   //把變量用{}括起來,系統才會去輸出變量

1000aaaaaa

#echo `ls`  反引号中的指令時可以單獨執行的,然後再由echo輸出

擴充:”\ “反斜杠,作用屏蔽字元的特殊意義

test指令

 用途:測試表達式是否成立,成立傳回值為0,否傳回值為其他值。

 格式:test  條件表達式  [條件表達式]

 ≡ 常見的測試類型

      測試檔案的狀态

      字元的串比較

      整數值比較

      邏輯測試

測試檔案的狀态

   格式:[操作符   檔案或目錄]

  常見的測試操作符

-d :測試是否為目錄【directory】

[root@localhost /]# [ -d /var/spool/ ]

[root@localhost /]# echo $?

-e:測測試目錄或檔案是否存在【exist】

[root@localhost /]# [ -e /etc/passwd ]

-f:測試是否為檔案【file】

[root@localhost Packages]# [ -f /etc/passwd ]

[root@localhost Packages]# echo $?

[root@localhost Packages]#

-r:測試目前的使用者是否有讀取的權限【read】

[root@localhost /]# [ -r /etc/shadow ]

[root@localhost /]#

-w:測試目前的使用者是否有寫的權限【write】

[root@localhost /]# [ -w /etc/shadow ]

-x:測試目前的使用者是否可執行和該檔案【excute】

[root@localhost /]# [ -x /etc/shadow ]

1

[root@localhost /]# ll /etc/shadow

----------. 1 root root 1086 2月  26 22:38 /etc/shadow

-L:測試是否為符号連結檔案【link】

[root@localhost /]# [ -L /etc/shadow ]

整數值比較

 格式:[ 整數1 操作符整數2 ]

常用的操作測試符

  -eq:等于(Equal)

  -ne:不等于(Not Equal)

  -gt:大于(Greater Than)

  -lt:小于(Lesser Than)

  -le:小于或等于(Lessser or Equal)

  -ge:大于或等于(Greater or Equal)

案例:

  如果登入使用者數小于或等于10則輸出YES

[root@localhost 桌面]# who|wc -l

2

[root@localhost 桌面]# [ `who|wc -l` -le 10 ] && echo "YES"

YES

變量的加減法運算:

變量的加法運算:

[root@localhost ~]# a=1000

[root@localhost ~]# expr $a + $a

2000

[root@localhost ~]# echo $a + $a              //這是2中錯誤的操作,運算必須使用expr

1000 + 1000

[root@localhost ~]# expr $a+$a                //$a + $a 要有空格否則也是錯誤的

1000+1000

變量的乘法運算:

[root@localhost ~]# expr $a * $a              //* 在作業系統中視為特殊字元,\屏蔽字元的特殊意義

expr: syntax error

[root@localhost ~]# expr $a \* $a

1000000

[root@localhost ~]# expr 2 / 1      //除法

[root@localhost ~]# expr 2 – 1        //減法

[root@localhost ~]# expr 2 % 1                //取餘

位置變量:

0-9           常用的為1-9

通過腳本來看些位置變量:

[root@localhost shellscripts]# cat a.sh

echo $1

echo $2

echo $3

echo $0

[root@localhost shellscripts]# a.sh a b c d e

a

b

c

/shellscripts/a.sh           //$0列印的是腳本笨的名字

[root@localhost shellscripts]# a.sh 1 2

3

[root@localhost shellscripts]# a.sh 2 3

5

echo `expr $1 + $2`             //$1和$2代表了2個位置變量

[root@localhost shellscripts]#

預定義變量

$#  : 指令行中位置參數的個數

$*  : 所有位置參數的内容

$?  : 上一條指令執行後傳回的狀态,當狀态為0時表示正常,非0表示執行異常或出錯。

$$  : 目前所在程序的程序号

$!  :  背景運作的最後一個程序号

$0  :  目前執行的程序/程序名

腳本的規範書寫:

#Date : 2014-5-28

#Author : Create by meng       //腳本的創始人

#Mail :~~                                   //郵件位址

#Func (do):this is useradd user script.            //腳本的作用

#V1.1                  //腳本的版本

echo "hello,world!"            //後面的才是腳本的内容

 字元串比較

 格式 [ 字元串1 = 字元串2 ]

      [ 字元串1 != 字元串2 ]

      [ -z 字元串 ]

常用的測試操作符

  =:字元串内容相同

 !=:字元串内容不相同,!号表示相反的意思

  -z:字元内容為空

#read -p "input your name: "  name

root

#echo $name

#[ $name != "root"] && echo "name is erro"

##read -p "input your name: "  name

zhangsan

邏輯測試

   格式:[表達式1]   操作符  [表達式2]

  常用的測試操作符

   -a 或&&:邏輯與,“而且”的意思

  #前後兩個表達式都成立是整個測試結果才為真,否則為假

   (前面真則執行後面)

   -o或||:邏輯或,或者的意思

   #操作符兩邊至少一個為真時,結果為真,否則結果為假

    (前面假則執行後面)

   !:邏輯否

  #當指定條件不成立時,傳回結果為真

     if條件語句   --單分支

當“條件成立“時執行相應的操作

         if  條件測試指令               if 磁盤已用空間>80%

                 then 指令序列   ==》      then 報警

           fi             

應用案例:

  如果/boot分區的空間使用超過80%,輸出報警資訊

  #!/bin/bash

 RATE=`df |awk'NR==4{print int($5)}'`

 if [$RATE -gt 80]

  then

  echo "warning,DISK is full!"

  if

                 if條件語句--雙分支

當“條件成立”、“條件不成立”時執行不同的操作

if 條件測試指令                if 3306端口是否在監聽狀态

 then 指令序列1         ==》      then mysqld 服務已運作

 else 指令序列2                    else 啟動mysqld服務

fi                   

引用案例:

判斷vsftp是否在運作。若已運作則輸出提示資訊,否則重新啟動vsftp服務

service vsftp status &>/dev/null

 if [ $? -eq 0 ]

then

 echo "vsftp service is running"

 else

  /etc/init.d/vsftp restart

 fi

如果/boot分區的空間使用超過80%,輸出警報資訊。我們來寫個腳本

#vi a.sh

#a.sh

NUM=`df | awk 'NR==5{print int($5)}'`

if

[ $NUM -gt 80 ]

 echo "Warning,DISK is full!"

awk的額外擴充

[root@localhost ~]# cat /etc/passwd | grep bash | awk -F: '{print ($1)}'

lenovo

[root@localhost ~]# ^C

文章版權:http://www.cnblogs.com/linux-super-meng/

for循環語句                            for  收件人  in 郵件位址清單

根據變量的不通值,重複執行一組指令操作   ==》                do

for 變量名  in 取值清單                       發郵件    

do                                        done

指令序列

done

for TM in a b c d e

do

echo $TM

sleep 1

~                                                                                                                                                                 

重複測試指定的條件,隻要條件成立則反複執行對應的指令操作

while 指令或表達式          while 可用記憶體<100mb

do             ==》do

     指令清單      擷取可用記憶體數

done                    done

多重分支語句

root@localhost ~]# cat a.sh

case $1 in

start)

      echo "start...."

           ;;

stop)

      echo "stop......"

      ;;

restart)

      echo "restart........"

laod)

     echo "laod......."

status)

      echo "start....."

esac

[root@localhost ~]# ./a.sh start

start....

[root@localhost ~]# ./a.sh stop

stop......

[root@localhost ~]#

[root@localhost ~]# cat a.sh

read -p "input:" NUM

case "$NUM" in

[a-z]|[A-Z])

      echo "it is english"

[0-9])

      echo "it is shuzi"

*)

      echo "........."

[root@localhost ~]# ./a.sh

input:2

it is shuzi

input:a

it is english

[root@localhost ~]# ./a.sh @

input:@

.........

input:#

      shift遷移語句

用于遷移位置變量,将$1~$9依次向左傳遞

[root@localhost ~]# ./a.sh 10 20

The sum is: 30

Result=0

while [ $# -gt 0 ]

      do

Result=`expr $Result + $1`

      shift

      done

      echo "The sum is: $Result"

break語句

用于跳出目前的循環體,執行循環體後的語句。

函數的應用

[root@localhost ~]# ./c.sh

46

55

[root@localhost ~]# cat c.sh

#c.sh

adder(){

echo `expr $1 + $2`

}

adder 12 34

adder 22 33

聲明:以上知識來自自己使用總結

本文轉自青衫解衣 51CTO部落格,原文連結:http://blog.51cto.com/215687833/1759818

繼續閱讀