内部变量
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