- 论坛徽章:
- 1
|
为使s h e l l编程更有效,系统提供了一些s h e l l变量。s h e l l变量可以保存诸如路径名、文件
名或者一个数字这样的变量名。s h e l l将其中任何设置都看做文本字符串。
有两种变量,本地和环境。
补充:这里似乎不全面,我们似乎更倾向于这种分法,应该是用户自定义变量,通常我们使用小写字符表示,和环境变量,通常用全部大写字符表示,比如PATH,这是我们执行命令的搜索路径。LIBRARY_PATH链接库的路径。还有局部变量,也就是上面说的本地变量。只是在一定的区域范围内有效。
这样子的话,才好区分。
严格地说可以有4种,但其余两种是只读的,可以认为是特殊
变量,它用于向s h e l l脚本传递参数。
本章内容有:
• shell变量。
• 环境变量。
• 变量替换。
• 导出变量。
• 特定变量。
• 向脚本传递信息。
• 在系统命令行下使用位置参数。
什么是shell变量?
变量可以定制用户本身的工作环境。使用变量可以保存有用信息,使系统获知用户相关
设置。变量也用于保存暂时信息。例如:一变量为E D I TO R,系统中有许多编辑工具,但哪一
个适用于系统呢?将此编辑器名称赋给E D I TO R,这样,在使用c r o n或其他需要编辑器的应用
时,这就是你将一直使用的E D I TO R取值,并将之用作缺省编辑器。
变量的命名需要遵守什么规则?
简单概括来,有以下一些规则:
1、变量和变量的内容用"="来连接
2、等号两边不能直接解空格字符,如果接上了空格,这时候shell会把变量当作命令尝试执行,而找不到就会提示错误
3、变量名称只能是英文字符和数字和下划线,同时数字不能是开头字符。
4、若有空格字符,可以使用双引号或者单引号将内容结合起来。但是要注意,双引号内的变量可以保持变量的特性,单引号内的仅仅是一般字符。
5、必要时候以转义字符"\"将其他一些特殊字符变成一般符号。
6、export可以使一个变量编程环境变量
7、可以使用unset取消变量的定义
本地变量
本地变量在用户现在的s h e l l生命期的脚本中使用。例如,本地变量f i l e - n a m e取值为
l o o p . d o c,这个值只在用户当前s h e l l生命期有意义。如果在s h e l l中启动另一个进程或退出,此
值将无效。这个方法的优点就是用户不能对其他的s h e l l或进程设置此变量有效。
表1 4 - 1列出各种实际变量模式
使用变量时,如果用花括号将之括起来,可以防止s h e l l误解变量值,尽管不必一定要这样做,但这确实可用。
要设置一本地变量,格式为:
$ variable-name=valu或e $ { v a r i a b l e - n a m e = v a l u e }
注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。s h e l l变量可以
用大小写字母。
表14-1 变量设置时的不同模式
Va r i a b l e - n a m e = v a l u e 设置实际值到v a r i a b l e - n a m e
Va r i a b l e - n a m e + v a l u e 如果设置了v a r i a b l e - n a m e,则重设其值
Va r i a b l e - n a m e : ? v a l u e 如果未设置v a r i a b l e - n a m e,显示未定义用户错误信息
Va r i a b l e - n a m e ? v a l u e 如果未设置v a r i a b l e - n a m e,显示系统错误信息
Va r i a b l e - n a m e : = v a l u e 如果未设置v a r i a b l e - n a m e,设置其值
Va r i a b l e - n a m e : - v a l u e 同上,但是取值并不设置到v a r i a b l e - n a m e,可以被替换
显示变量
使用e c h o命令可以显示单个变量取值,并在变量名前加$,例如:- $ GREAT_PICTURE="die hard"
- $ echo ${GREAT_PICTURE}
- die hard
- $ DOLLAR=99
- $ echo ${DOLLAR}
- 99
- $ LAST_FILE=ZLPSO.txt
- $ echo ${LAST_FILE}
- ZLPSO.txt
复制代码 可以结合使用变量,下面将错误信息和环境变量L O G N A M E设置到变量e r r o r- m s g。- $ ERROR_MSG=" Sorry this file does not exist user $LOGNAME"
- $ echo ${ERROR_MSG}
- Sorry this file does not exist user root
复制代码 上面例子中,s h e l l首先显示文本,然后查找变量$ L O G N A M E,最后扩展变量以显示整个
变量值。
清除变量
使用u n s e t命令清除变量。
unset variable-name- $ PC=enterprise
- $ echo ${PC}
- enterprise
- $ unset PC
- $ echo ${PC}
复制代码 显示所有本地shell变量- $ set
- ......
- BASH_VERSION='4.0.23(1)-release'
- COLORS=/etc/DIR_COLORS
- COLORTERM=gnome-terminal
- COLUMNS=80
- CVS_RSH=ssh
- DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MmGXVtOFZ0,guid=604b8af6bd4ce1a0b825456b4ce79674
- DESKTOP_SESSION=gnome
- DIRSTACK=()
- DISPLAY=:0.0
- DOLLAR=99
- ......
复制代码 s e t输出可能很长。查看输出时可以看出s h e l l已经设置了一些用户变量以使工作环境更加
容易使用。
结合变量值
将变量并排可以使变量结合在一起:- $ FIRST="Bruce "
- $ SURNAME=Willis
- $ echo ${FIRST}${SURNAME}
- Bruce Willis
复制代码 测试变量是否已经设置
有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。此命
令格式为:
$ { v a r i a b l e : - v a l u e }
意即如果设置了变量值,则使用它,如果未设置,则取新值。例如:- $ COLOUR=blue
- $ echo "The sky is ${COLOR:-grey} today"
- The sky is grey today
复制代码 变量c o l o u r取值b l u e,e c h o打印变量c o l o u r时,首先查看其是否已赋值,如果查到,则使
用该值。变量$COLOR没有设置,所以会打印后面的grey
上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:
$ { v a r i a b l e : = v a l u e }
下面是一个更实用的例子。查询工资清单应用的运行时间及清单类型。在运行时间及类
型输入时,敲回车键表明用户并没有设置两个变量值,将使用缺省值( 0 3 : 0 0和We e k l y),并
传入a t命令中以按时启动作业。- #!/bin/bash
- # vartest
- echo "what time do you wish start the payroll [03:00]:"
- read TIME
- echo " process to start at ${TIME:=03:00} OK"
- echo "Is it a monthly or weekly run [Weekly]:"
- read RUN_TYPE
- echo "Run type is ${RUN_TYPE:=Weekly}'
- at -f $RUN_TYPE $TIME
复制代码 在输入域敲回车键,输出结果如下:
what time do you wish start the payroll [03:00]:
process to start at 03:00 OK
Is it a monthly or weekly run [Weekly]:
Run type is Weekly
也可以编写脚本测试变量是否取值,然后返回带有系统错误信息的结果。下面的例子测
试变量f i l e是否取值。- $ echo "The file is ${FILES:?}"
- bash: FILES: parameter null or not set
复制代码 以上结果可读性不好,但是可以加入自己的脚本以增加可读性。- $ echo "The file is ${FILES:?" sorry cannot locate the variable files"}"
- bash: FILES: sorry cannot locate the variable files
复制代码 测试变量是否取值,如果未设置,则返回一空串。方法如下:
$ { v a r i a b l e : + v a l u e }
使用下述方法初始化变量为空字符串。
v a r i a b l e = " "
$ D E T I N A T I O N = " "
使用变量来保存系统命令参数
可以用变量保存系统命令参数的替换信息。下面的例子使用变量保存文件拷贝的文件名
信息。变量s o u r c e保存p a s s w d文件的路径,d e s t保存c p命令中文件目标。- $ SOURCE="/etc/passwd"
- $ DEST="/tmp/passwd.bak"
- $ cp ${SOURCE} ${DEST}
复制代码 下面例子中,变量d e v i c e保存磁带设备路径,然后用于在m t命令中倒带。- $ DEVICE="/dev/rmt/0n"
- $ mt -f {DEVICE} rewind
复制代码 设置只读变量
如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人
想要改变它,则返回错误信息。格式如下:
v a r i a b l e - n a m e = v a l u e
readonly variable-name
下面的例子中,设置变量为系统磁带设备之一的设备路径,将之设为只读,任何改变其值的操作将返回错误信息。- $ TAPE_DEV="/dev/rmt/0n"
- $ echo ${TAPE_DEV}
- /dev/rmt/0n
- $ readonly TAPE_DEV
- $ TAPE_DEV="/dev/rmt/1n"
- bash: TAPE_DEV: readonly variable
复制代码 要查看所有只读变量,使用命令r e a d o n l y即可。- $ readonly
- declare -ir BASHPID=""
- declare -ar BASH_VERSINFO='([0]="4" [1]="0" [2]="23" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")'
- declare -ir EUID="500"
- declare -ir PPID="2813"
- declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
- declare -r TAPE_DEV="/dev/rmt/0n"
- declare -ir UID="500"
复制代码 |
|