第九章 變量的高級用法

內部變量

1.BASH

記錄了bash Shell的路徑(通常爲/bin/bash)

[root@localhost tmp]# echo "$BASH"

/bin/bash

2.BASH_VERSINFO

爲一個數組,分別存儲bash shell的主版本號,此版本號,補丁級別,編譯版本,發行狀態,硬件架構

[root@localhost tmp]# cat c.sh 

#! /bin/bash

for n in 0 1 2 3 4 5

do

 echo "BASH_VERSINFO[$n]=${BASH_VERSINFO[$n]}"

done

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

BASH_VERSINFO[0]=3

BASH_VERSINFO[1]=2

BASH_VERSINFO[2]=25

BASH_VERSINFO[3]=1

BASH_VERSINFO[4]=release

BASH_VERSINFO[5]=x86_64-redhat-linux-gnu

3.BASH_VERSION

和BASH_VERSINFO一樣,只不過用字符串表示

[root@localhost tmp]# echo "$BASH_VERSION"

3.2.25(1)-release

4.目錄棧

用於存放工作目錄,便於程序員手動控制目錄的切換

[root@localhost tmp]# dirs    #顯示棧的所有內容,可以看見系統自動壓入當前目錄(實質上先彈出棧頂目錄再壓入當前目錄)

/tmp

[root@localhost tmp]# pushd /home  #壓入/home,後進先出,注意目錄變化

/home /tmp

[root@localhost home]# pushd /home/clc  #壓入/home/clc

/home/clc /home /tmp

[root@localhost clc]# popd    #彈出,注意目錄變化

/home /tmp

[root@localhost home]# pushd clc  #相對於目錄壓入,和壓入/home/clc效果一樣,注意目錄變化

/home/clc /home /tmp

[root@localhost clc]# echo $DIRSTACK   #顯示棧頂目錄

/home/clc

5.GLOBIGNORE(globbing,通配)

表示通配時候忽略(ignore)文件名的集合,默認爲空

[root@localhost tmp]# ls a*

a   a1~     a2.awk  a3.sh   a4.sh  a6.sh  aac    all.tar.gz

a1  a1.awk  a3.awk  a4.awk  a5.sh  aabc   a.awk  a.sh

[root@localhost tmp]# GLOBIGNORE="a*.sh"

[root@localhost tmp]# ls a*

a  a1  a1~  a1.awk  a2.awk  a3.awk  a4.awk  aabc  aac  a.awk  all.tar.gz

6.GROUPS

以數組的形式存儲當前用戶所在的組

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

root:x:0:root

bin:x:1:root,bin,daemon

daemon:x:2:root,bin,daemon

sys:x:3:root,bin,adm

adm:x:4:root,adm,daemon

disk:x:6:root

wheel:x:10:root

[root@localhost ~]# echo $GROUPS

0

[root@localhost ~]# echo ${GROUPS[0]}

0

[root@localhost ~]# echo ${GROUPS[1]}

1

[root@localhost ~]# echo ${GROUPS[2]}

2

[root@localhost ~]# echo ${GROUPS[3]}

3

[root@localhost ~]# echo ${GROUPS[4]}

4

[root@localhost ~]# echo ${GROUPS[5]}

6

[root@localhost ~]# echo ${GROUPS[6]}

10

[root@localhost ~]# echo $GROUPS[6]  #注意要加{}才能當做整體

0[6]

7.HOSTNAME

記錄主機名,在/etc/sysconfig/network中設置主機名,在/etc/host中設置主機名和IP的對應關係

[root@localhost ~]# echo $HOSTNAME

localhost.localdomain

[root@localhost ~]# cat /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=no

HOSTNAME=localhost.localdomain

[root@localhost ~]# cat /etc/hosts

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1               localhost.localdomain localhost

192.168.127.135         localhost.localdomain

::1             localhost6.localdomain6 localhost6

8.HOSTTYPE和MACHTYPE

記錄系統的硬件架構,和BASH_VERSINFO[5]等價

[root@localhost ~]# echo ${BASH_VERSINFO[5]}

x86_64-redhat-linux-gnu

[root@localhost ~]# echo $HOSTTYPE

x86_64

[root@localhost ~]# echo $MACHTYPE

x86_64-redhat-linux-gnu


9.REPLY

如果read後面不跟參數則默認存儲在REPLY中

select variable [in list]

do

...

break

done

中,REPLY用於存儲用戶選擇的數字

例:

1.

[root@localhost ~]# read

clc

[root@localhost ~]# echo $REPLY

clc

[root@localhost ~]# read name    #有跟變量則存儲在變量中不存儲在REPLY中

clc1

[root@localhost ~]# echo $REPLY

clc

2.

[root@localhost ~]# cat d.sh 

#! /bin/bash

select name in "clc" "clc1" "clc2"

do

echo "\$REPLY is $REPLY"

echo "you select $name"

break

done

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

1) clc

2) clc1

3) clc2

#? 2

$REPLY is 2

you select clc1

10.SECONDS

記錄腳本的執行時間(單位爲秒)

有類型變量

declare [選項] 變量名

選項:

-r 設置爲只讀

-i 定義爲整數

-a 定義爲數組

-f 顯示此腳本前定義過的所有函數名及其內容

-F 僅顯示此腳本前定義過的所有函數名

-x 將變量聲明爲環境變量

例:

[root@localhost ~]# num=2012

[root@localhost ~]# num1=$num+1  #以字符方式處理

[root@localhost ~]# echo $num1

2012+1

[root@localhost ~]# let "num1=$num+1" #以數字方式處理

[root@localhost ~]# echo $num1

2013

[root@localhost ~]# declare -i num1  #把num1當做整數類型

[root@localhost ~]# num1=$num+1

[root@localhost ~]# echo $num1

2013

間接引用

第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值成爲間接變量引用

例:

1.

[root@localhost ~]# variable1=variable2

[root@localhost ~]# variable2=value

[root@localhost ~]# echo ${!variable1}  #間接變量引用

value

2.數據庫

[root@localhost ~]# cat b1.sh

#! /bin/bash

#database

s01_name=clc1

s01_id=001

s02_name=clc2

s02_id=002

s03_name=clc3

s03_id=003

select choice in "s01" "s02" "s02"

do

name=${choice}_name

id=${choice}_id

echo "name:${!name}"

echo "id:${!id}"

break

done

結果:

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

1) s01

2) s02

3) s02

#? 2

name:clc2

id:002

注:間接引用變量中,第一個變量存放的是最終值的地址,實現了類似指針的功能

浮點數運算

工具:bc

[root@localhost ~]# bc

bc 1.06

Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.

This is free software with ABSOLUTELY NO WARRANTY.

For details type `warranty'. 

3.2*2*2

12.8

r=3

7/(r+r)

1

scale=4

7/(r+r)

1.1666

quit

腳本運算:

[root@localhost ~]# cat b2.sh

#! /bin/bash

value1=1.1

value2=`echo "scale=10;$value1*$value1" | bc`    #``中的內容解析成系統命令

value3=`echo "scale=10;$value2*$value2" | bc`

echo "vlaue1=$value;value2=$value1*$value1=$value2;value3=$value2*$value2=$value3"

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

vlaue1=;value2=1.1*1.1=1.21;value3=1.21*1.21=1.4641


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章