標籤:shell 變數的進階用法
內部變數
1.BASH
記錄了bash Shell的路徑(通常為/bin/bash)
[[email protected] tmp]# echo "$BASH"
/bin/bash
2.BASH_VERSINFO
為一個數組,分別儲存bash shell的主要版本號,此版本號碼,補丁層級,編譯版本,發行狀態,硬體架構
[[email protected] tmp]# cat c.sh
#! /bin/bash
for n in 0 1 2 3 4 5
do
echo "BASH_VERSINFO[$n]=${BASH_VERSINFO[$n]}"
done
[[email protected] 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一樣,只不過用字串表示
[[email protected] tmp]# echo "$BASH_VERSION"
3.2.25(1)-release
4.目錄棧
用於存放工作目錄,便於程式員手動控制目錄的切換
[[email protected] tmp]# dirs #顯示棧的所有內容,可以看見系統自動壓入目前的目錄(實質上先彈出棧頂目錄再壓入目前的目錄)
/tmp
[[email protected] tmp]# pushd /home #壓入/home,後進先出,注意目錄變化
/home /tmp
[[email protected] home]# pushd /home/clc #壓入/home/clc
/home/clc /home /tmp
[[email protected] clc]# popd #彈出,注意目錄變化
/home /tmp
[[email protected] home]# pushd clc #相對於目錄壓入,和壓入/home/clc效果一樣,注意目錄變化
/home/clc /home /tmp
[[email protected] clc]# echo $DIRSTACK #顯示棧頂目錄
/home/clc
5.GLOBIGNORE(globbing,通配)
表示通配時候忽略(ignore)檔案名稱的集合,預設為空白
[[email protected] 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
[[email protected] tmp]# GLOBIGNORE="a*.sh"
[[email protected] tmp]# ls a*
a a1 a1~ a1.awk a2.awk a3.awk a4.awk aabc aac a.awk all.tar.gz
6.GROUPS
以數組的形式儲存目前使用者所在的組
[[email protected] ~]# 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
[[email protected] ~]# echo $GROUPS
0
[[email protected] ~]# echo ${GROUPS[0]}
0
[[email protected] ~]# echo ${GROUPS[1]}
1
[[email protected] ~]# echo ${GROUPS[2]}
2
[[email protected] ~]# echo ${GROUPS[3]}
3
[[email protected] ~]# echo ${GROUPS[4]}
4
[[email protected] ~]# echo ${GROUPS[5]}
6
[[email protected] ~]# echo ${GROUPS[6]}
10
[[email protected] ~]# echo $GROUPS[6] #注意要加{}才能當做整體
0[6]
7.HOSTNAME
記錄主機名稱,在/etc/sysconfig/network中設定主機名稱,在/etc/host中設定主機名稱和IP的對應關係
[[email protected] ~]# echo $HOSTNAME
localhost.localdomain
[[email protected] ~]# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=localhost.localdomain
[[email protected] ~]# 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]等價
[[email protected] ~]# echo ${BASH_VERSINFO[5]}
x86_64-redhat-linux-gnu
[[email protected] ~]# echo $HOSTTYPE
x86_64
[[email protected] ~]# echo $MACHTYPE
x86_64-redhat-linux-gnu
9.REPLY
如果read後面不跟參數則預設儲存在REPLY中
在
select variable [in list]
do
...
break
done
中,REPLY用於儲存使用者選擇的數字
例:
1.
[[email protected] ~]# read
clc
[[email protected] ~]# echo $REPLY
clc
[[email protected] ~]# read name #有跟變數則儲存在變數中不儲存在REPLY中
clc1
[[email protected] ~]# echo $REPLY
clc
2.
[[email protected] ~]# cat d.sh
#! /bin/bash
select name in "clc" "clc1" "clc2"
do
echo "\$REPLY is $REPLY"
echo "you select $name"
break
done
[[email protected] ~]# ./d.sh
1) clc
2) clc1
3) clc2
#? 2
$REPLY is 2
you select clc1
10.SECONDS
記錄指令碼的執行時間(單位為秒)
有類型變數
declare [選項] 變數名
選項:
-r 設定為唯讀
-i 定義為整數
-a 定義為數組
-f 顯示此指令碼前定義過的所有函數名及其內容
-F 僅顯示此指令碼前定義過的所有函數名
-x 將變數聲明為環境變數
例:
[[email protected] ~]# num=2012
[[email protected] ~]# num1=$num+1 #以字元方式處理
[[email protected] ~]# echo $num1
2012+1
[[email protected] ~]# let "num1=$num+1" #以數字方式處理
[[email protected] ~]# echo $num1
2013
[[email protected] ~]# declare -i num1 #把num1當做整數類型
[[email protected] ~]# num1=$num+1
[[email protected] ~]# echo $num1
2013
間接引用
第一個變數的值是第二個變數的名字,從第一個變數引用第二個變數的值成為間接變數引用
例:
1.
[[email protected] ~]# variable1=variable2
[[email protected] ~]# variable2=value
[[email protected] ~]# echo ${!variable1} #間接變數引用
value
2.資料庫
[[email protected] ~]# 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
結果:
[[email protected] ~]# ./b1.sh
1) s01
2) s02
3) s02
#? 2
name:clc2
id:002
註:間接引用變數中,第一個變數存放的是最終值的地址,實現了類似指標的功能
浮點數運算
工具:bc
[[email protected] ~]# 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
指令碼運算:
[[email protected] ~]# 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"
[[email protected] ~]# ./b2.sh
vlaue1=;value2=1.1*1.1=1.21;value3=1.21*1.21=1.4641
本文出自 “flyclc” 部落格,請務必保留此出處http://flyclc.blog.51cto.com/1385758/1540286