《Linux shell變數總結回顧》RHEL6(轉)

滄海一滴發表於2014-05-28

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

環境變數路徑:

[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

1000

要想完全的清除某個全域性變數:

# 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

1000

[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 $?

0

 

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

 

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

[root@localhost /]# echo $?

0

 

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

 

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

[root@localhost Packages]# echo $?

0

[root@localhost Packages]#

 

-r:測試當前的使用者是否有讀取的許可權read

 

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

[root@localhost /]# echo $?

0

[root@localhost /]#

 

-w:測試當前的使用者是否有寫的許可權【write

 

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

[root@localhost /]# echo $?

0

[root@localhost /]#

 

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

 

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

[root@localhost /]# echo $?

1

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

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

 

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

 

 

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

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

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

[root@localhost /]# echo $?

1

整數值比較

 格式:[ 整數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 ~]# echo $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      //除法

2

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

1

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

0

位置變數:

0-9           常用的為1-9

通過指令碼來看些位置變數:

[root@localhost shellscripts]# cat a.sh

#!/bin/bash

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

[root@localhost shellscripts]# cat a.sh

#!/bin/bash

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

[root@localhost shellscripts]#

 

預定義變數

$#  : 命令列中位置引數的個數

$*  : 所有位置引數的內容

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

$$  : 當前所在程式的程式號

$!  :  後臺執行的最後一個程式號

$0  :  當前執行的程式/程式名

指令碼的規範書寫:

#!/bin/bash

#Date : 2014-5-28

#Author : Create by meng       //指令碼的創始人

#Mail :~~                                   //郵件地址

#Func (do):this is useradd user script.            //指令碼的作用

#V1.1                  //指令碼的版本

echo "hello,world!"            //後面的才是指令碼的內容

 

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

 

字串比較

 格式 [ 字串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

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

#echo $name

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

 

邏輯測試

   格式:[表示式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服務

#!/bin/bash

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

#!/bin/bash

#a.sh

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

if

[ $NUM -gt 80 ]

then

 echo "Warning,DISK is full!"

if

 

awk的額外擴充套件

 

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

root

lenovo

[root@localhost ~]# ^C

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

 

for迴圈語句                            for  收件人  in 郵件地址列表

根據變數的不通值,重複執行一組命令操作   ==                do

for 變數名  in 取值列表                       發郵件    

do                                        done

命令序列

done

 

#!/bin/bash

for TM in a b c d e

do

echo $TM

sleep 1

done

~                                                                                                                                                                 

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

 

while 命令或表示式          while 可用記憶體<100mb

do             ==do

     命令列表      獲取可用記憶體數

done                    done

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

 

多重分支語句

root@localhost ~]# cat a.sh

#!/bin/bash

#a.sh

case $1 in

start)

      echo "start...."

           ;;

stop)

      echo "stop......"

      ;;

restart)

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

      ;;

laod)

     echo "laod......."

      ;;

status)

      echo "start....."

      echo "stop......"

      ;;

esac

 

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

start....

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

stop......

[root@localhost ~]#

[root@localhost ~]# cat a.sh

#!/bin/bash

#a.sh

read -p "input:" NUM

case "$NUM" in

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

      echo "it is english"

      ;;

[0-9])

      echo "it is shuzi"

      ;;

*)

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

      ;;

esac

[root@localhost ~]#

 

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

input:2

it is shuzi

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

input:a

it is english

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

input:@

.........

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

input:#

.........

[root@localhost ~]#

 

      shift遷移語句

用於遷移位置變數,將$1~$9依次向左傳遞

 

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

The sum is: 30

[root@localhost ~]# cat a.sh

#!/bin/bash

#a.sh

Result=0

while [ $# -gt 0 ]

      do

Result=`expr $Result + $1`

      shift

      done

      echo "The sum is: $Result"

[root@localhost ~]#

 

 

break語句

 

用於跳出當前的迴圈體,執行迴圈體後的語句。

 

函式的應用

 

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

46

55

[root@localhost ~]# cat c.sh

#!/bin/bash

#c.sh

adder(){

echo `expr $1 + $2`

}

 

adder 12 34

adder 22 33

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

46

55

[root@localhost ~]#

 

 

宣告:以上知識全來自與自學shell程式設計總結回顧

相關文章