第九章 变量的高级用法

内部变量

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


你可能感兴趣的:(shell,变量,高级用法)