內部變量
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