为使s h e l l编程更有效,系统提供了一些s h e l l变量。s h e l l变量可以保存诸如路径名、文件
名或者一个数字这样的变量名。s h e l l将其中任何设置都看做文本字符串。
有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为是特殊
变量,它用于向s h e l l脚本传递参数。
使用e c h o命令可以显示单个变量取值,并在变量名前加$,例如:
[iyunv@localhost huangcd]# great_picture="die hard"
[iyunv@localhost huangcd]# echo ${great_picture}}
die hard}
[iyunv@localhost huangcd]# echo ${great_picture}
die hard
[iyunv@localhost huangcd]# last_file=ok.txt
[iyunv@localhost huangcd]# echo ${last_file}
ok.txt
使用u n s e t命令清除变量。
[iyunv@localhost huangcd]# pc=enterprise
[iyunv@localhost huangcd]# echo 4{pc}
4{pc}
[iyunv@localhost huangcd]# echo ${pc}
enterprise
[iyunv@localhost huangcd]# unset pc
[iyunv@localhost huangcd]# echo 4{pc}
4{pc}
[iyunv@localhost huangcd]# echo ${pc}
使用s e t命令显示所有本地定义的s h e l l变量。
[iyunv@localhost huangcd]# set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS.xterm
有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。此命
令格式为:
$ { v a r i a b l e : - v a l u e }
意即如果设置了变量值,则使用它,如果未设置,则取新值。例如:
[iyunv@localhost huangcd]# color=blue
[iyunv@localhost huangcd]# echo "the sky is ${color:-grey}"
the sky is blue
[iyunv@localhost huangcd]# unset color
[iyunv@localhost huangcd]# echo "the sky is ${color:-grey}"
the sky is grey
可以用变量保存系统命令参数的替换信息。下面的例子使用变量保存文件拷贝的文件名
信息。变量s o u r c e保存p a s s w d文件的路径,d e s t保存c p命令中文件目标。
[iyunv@localhost huangcd]# source="/etc/passwd"
[iyunv@localhost huangcd]# dest="/tmp/passwd.bak"
[iyunv@localhost huangcd]# cp ${source} ${dest}
如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人
想要改变它,则返回错误信息。格式如下:
v a r i a b l e - n a m e = v a l u e
readonly variable-name
下面的例子中,设置变量为系统磁带设备之一的设备路径,将之设为只读,任何改变其值的操作将返回错误信息。
[iyunv@localhost huangcd]# tape_dev="/dev/rmt/0n"
[iyunv@localhost huangcd]# echo ${tape_dev}
/dev/rmt/0n
[iyunv@localhost huangcd]# readonly tape_dev
[iyunv@localhost huangcd]# tape_dev="/dev/rmt/ln"
bash: tape_dev: readonly variable
要查看所有只读变量,使用命令r e a d o n l y即可。
[iyunv@localhost huangcd]# readonly
declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")'
declare -ir EUID="0"
declare -ir PPID="4931"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"
declare -r tape_dev="/dev/rmt/0n"
环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。s h e l l中执行的用
户进程均称为子进程。不像本地变量(只用于现在的s h e l l)环境变量可用于所有子进程,这
包括编辑器、脚本和应用。
环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在. p r o f i l e文件中
定义。系统管理员可能在/ e t c / p r o f i l e文件中已经设置了一些环境变量。将之放入p r o f i l e文件意
味着每次登录时这些值都将被初始化。
传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用e x p o r t命令导出。
环境变量与本地变量设置方式相同。
V A R I A B L E - N A M E = v a l u e;export VARIABLE-NAME
在两个命令之间是一个分号,也可以这样写:
V A R I A B L E - N A M E = v a l u e
Export VARIABLE-NAME
[iyunv@localhost huangcd]# echo $SHELL
/bin/bash
还有一些预留的环境变量。其他系统或命令行应用将用到它们。以下是最常用的一些,
注意这些值均未有缺省设置,必须显示说明。
1. EDITO R
设置编辑器,最常用。
$ EDITOR=vi ;export EDITOR
2. PWD
当前目录路径名,用c d命令设置此选项。
3. PA G E R
保存屏幕翻页命令,如p g、m o r e,在查看m a n文本时用到此功能。
$ PAGER='pg -f -p%;d'export PAGER
4. MANPAT H
保存系统上m a n文本的目录。目录间用冒号分隔。
$ MANPATH=/usr/apps/man:/usr/local;/emxapnort MANPATH
5. LPDEST或P R I N T E R
保存缺省打印机名,用于打印作业时指定打印机名。
$ LPDEST=hp3si-systems
本章开始提到有4种变量,本地、环境,还有两种变量被认为是特殊变量,因为它们是只
读的。这两种变量即为位置变量和特定变量参数。先来看一看位置变量。
如果要向一个s h e l l脚本传递信息,可以使用位置参数完成此功能。参数相关数目传入脚
本,此数目可以任意多,但只有前9个可以被访问,使用s h i f t命令可以改变这个限制。本书后
面将讲到s h i f t命令。参数从第一个开始,在第9个结束;每个访问参数前要加$符号。第一个
参数为0,表示预留保存实际脚本名字。无论脚本是否有参数,此值均可用。
如果向脚本传送Did You See Th e Full Mo o n信息,下面的表格讲解了如何访问每一个参
数。
$ 0 $ 1 $ 2 $ 3 $ 4 $ 5 $ 6 $ 7 $ 8 $ 9
脚本名字 Did Yo u S e e T h e F u l l M o o n
[iyunv@localhost huangcd]# cat param
#!/bin/bash
#param
echo "This is the script name :$0"
echo "This is the script name :$1"
echo "This is the script name :$2"
echo "This is the script name :$3"
echo "This is the script name :$4"
[iyunv@localhost huangcd]# ./param did you see the full moon
This is the script name :./param
This is the script name :did
This is the script name :you
This is the script name :see
This is the script name :the
[iyunv@localhost huangcd]# cat param2
#!/bin/bash
echo "Hello world this is `basename $0` calling"
[iyunv@localhost huangcd]# ./param2
Hello world this is param2 calling
可以在脚本中向系统命令传递参数。下面的例子中,在f i n d命令里,使用$ 1参数指定查
找文件名。
[iyunv@localhost huangcd]# cat findfile
#!/bin/bash
#find
find / -name $1 -print
[iyunv@localhost huangcd]# sh findfile passwd
/usr/lib/news/bin/auth/passwd
/usr/share/doc/nss_ldap-253/pam.d/passwd
/usr/bin/passwd
/etc/passwd
/etc/pam.d/passwd
既然已经知道了如何访问和使用s h e l l脚本中的参数,多知道一点相关信息也是很有用的,
有必要知道脚本运行时的一些相关控制信息,这就是特定变量的由来。共有7个特定变量,见
表1 4 - 2。
[iyunv@localhost huangcd]# cat param
#!/bin/bash
#param
echo "This is the script name :$0"
echo "This is the script name :$1"
echo "This is the script name :$2"
echo "This is the script name :$3"
echo "This is the script name :$4"
echo "the number of param is :$#"
echo "show all arguments :$*"
[iyunv@localhost huangcd]# sh param today is very blue
This is the script name :param
This is the script name :today
This is the script name :is
This is the script name :very
This is the script name :blue
the number of param is :4
show all arguments :today is very blue