天天看點

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

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

環境變量路徑:

[root@localhost ~]# set  

//檢視到的是局部變量和全局變量2種

[root@localhost

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

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

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

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

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

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

~]# source .bash_profile  

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

腳本的執行:

sh script   

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

./

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

.

script          

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

區分局部變量和全局變量

~]# str=1000   //局部變量

~]# echo $str

1000

去編輯一個腳本:

#

vim bianliang.sh

#!/bin/bash

echo

$str

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

~]# export str   //添加到全局變量中

~]# bianliang.sh   //再次使用完全ok

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

unset str  清除全局變量

#env  

可以檢視到所有全局變量

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

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

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

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

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

Yes        

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

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

/shellscripts/hello.sh

shellscripts]# ls

hello.sh 

ipadd.sh  logmess_clean.sh 

shellscripts]# hello.sh

hello

world!   

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

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

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

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

~]# echo "$PWD is lujing"

/root

is lujing

~]# echo ‘$PWD is lujing‘

$PWD

~]# echo $a

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

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

1000aaaaaa

#echo

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

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

test指令

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

 格式:test 

條件表達式  [條件表達式]

 ≡

常見的測試類型

    測試檔案的狀态

字元的串比較

整數值比較

邏輯測試

測試檔案的狀态

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

常見的測試操作符

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

/]# [ -d /var/spool/ ]

/]# echo $?

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

/]# [ -e /etc/passwd ]

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

Packages]# [ -f /etc/passwd ]

Packages]# echo $?

Packages]#

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

/]# [ -r /etc/shadow ]

/]#

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

/]# [ -w /etc/shadow ]

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

/]# [ -x /etc/shadow ]

1

/]# ll /etc/shadow

----------.

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

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

/]# [ -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

桌面]# who|wc -l

2

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

YES

變量的加減法運算:

變量的加法運算:

~]# a=1000

~]# 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 *

//* 在作業系統中視為特殊字元,\屏蔽字元的特殊意義

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

3

[root@localhost shellscripts]# a.sh 2

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                 

//腳本的版本

"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: " 

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

if

[ $NUM -gt 80 ]

 echo "Warning,DISK is

awk的額外擴充

[root@localhost ~]# cat /etc/passwd | grep

bash | awk -F: ‘{print ($1)}‘

lenovo

[root@localhost ~]# ^C

for循環語句                           

for  收件人 

in 郵件位址清單

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

==》               

do

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

done

指令序列

for TM in a b c d e

echo $TM

sleep 1

~                                                                                                                                

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

while 指令或表達式         

while 可用記憶體<100mb

do            

==》do

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

done                   

多重分支語句

root@localhost ~]# cat a.sh

case $1 in

start)

      echo

"start...."

;;

stop)

"stop......"

restart)

"restart........"

laod)

     echo

"laod......."

status)

"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])

shuzi"

*)

"........."

[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 ]

Result=`expr $Result + $1`

shift

      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

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