赞
踩
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
常见的Shell变量类型如下:
自定义变量:由用户自己定义,修改和使用。
环境变量:由系统维护,用于设置工作环境。
只读变量:只可以读取不可以更改。
位置变量:通过命令行给脚本传递参数。
预定义变量:Bash中内置的一类变量,不能修改,有些规定好的变量放在那里让你使用。
Bash中的变量操作相对比较简单,不像其它高级编程语言那么复杂。在定义一个新的变量时,一般不需要提前进行声明而是直接指定变量名称并赋给初始值即可。
定义变量的基本格式为“变量名=变量值”,等号两边没有空格。变量名称需要以字母或下划线开头,名称中不可以包含特殊字符。例如name='root',直接赋值字串、变量引用:name="$USER"、命令引用:name=`COMMAND` 或者 name=$(COMMAND)。
通过在变量名称前添加符号“$”,可以引用一个变量的值。使用echo命令可以查看变量,可以在一条echo命令中同时查看多个变量值。当变量名称容易和紧跟其后的其它字符混淆时,需要添加“{}”将其括起来,否则无法确定正确的变量名称。对于未定义的变量名称,将显示为空值。
在“=”后边直接指定变量内容是为变量赋值的最基本的方法,除此之外还有一些特殊的赋值操作,可以更加灵活地为变量赋值,以便适用于各种复杂的管理任务。
(1)双引号
双引号主要用于界定字符串,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下的双引号通常可以忽略。在双引号范围内,使用“$”符号可以引用其它变量的值,从而能够直接调用现有的变量的值来赋给新的变量。
(2)单引号
当要赋值的内容中包含“$”“"”“\”等具有特殊含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其它变量的值,任何字符均作为普通字符看待。但赋值内容中包含单引号时,须使用“\”符号进行转义,以免冲突。
(3)反撇号
反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的范围内必须是能够执行的命令行,否则将会出错。使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用“$()”代替反撇号进行操作,用以解决难以嵌套的问题。
我们还可以使用Bash的内置命令read来给变量赋值。read命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备读入一行内容,并以空格为分隔符,将读入的每一个字段挨个赋值给指定的变量。若指定的变量只有一个,则将整行内容赋值给此变量。
read命令有两个常用参数:“-p”和“-t”。read -p用于设置提示信息,read -t用于设置等待时间(默认单位为秒),以便告知用户应该输入什么内容等相关事项和规定输入时间内为输入自动跳出。例如:
- [root@localhost opt]# read -p "现在的时间是" time
- 现在的时间是9点
- [root@localhost opt]# echo $time
- 9点
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
为了使用户定义的变量在所有的子shell环境中有效能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所有的子shell环境中可以使用。可以同时指定多个变量名称作为参数,变量名之间以空格分割。
- [root@localhost opt]# abc=123
- [root@localhost opt]# echo $abc
- 123
- [root@localhost opt]# export abc
- [root@localhost opt]# bash
- [root@localhost opt]# echo $abc
- 123
Shell脚本的数值运算多用于脚本程序的过程控制,在Bash Shell环境中,expr只能进行整数的运算,不支持小数运算。整数值的运算主要通过内部命令expr进行,基本格式如下所示:(需要注意,运算符与变量之间至少要一个空格)
expr 变量1 运算符 变量2 [运算符 变量3]
运算符 | 意义 |
++ -- | 增加和减少,可以前置也可以放到末尾 |
\* / % | 乘法、除法、取余 |
+ - | 加法、减法 |
< <= > >= | 比较符号 |
== != | 等于和不等于 |
& ^ | | 位的与、异或和或 |
&& || | 逻辑的与和或 |
除了用户自定义的Shell变量以外,在Linux系统中还有一系列的特殊变量--环境变量、位置变量、预定义变量。
环境变量指的是出于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登陆终端等。环境变量的值由Linux系统自动维护,会随着用户状态的改变而改变。
使用env命令可以查看到当前工作环境下的环境变量,对于常见的一些环境变量应了解其各自的用途。例如,USER变量表示用户的名称,HOME表示用户的宿主目录,LANG表示语言和字符集,PWD表示当前所在的工作目录,PATH表示命令搜索路径等。
- [root@localhost ~]# env
- HOSTNAME=localhost.localdomain
- SHELL=/bin/bash
- USER=root
- PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
- PWD=/root
- LANG=en_US.UTF-8
- HOME=/root
PATH变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux系统将在PATH变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”。
在Linux系统中,环境变量的全局配置文件/etc/profile,在此文件中定义的变量作用于所有用户。除此之外,每个用户还有自己的独立配置文件(~/.bash_profile)。若要长期变更或设置某个环境变量,应在上述文件中配置。
为了在使用Shell脚本程序时,方便通过命令行为程序提供操作参数,Bash引入了位置变量的概念。当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
位置变量也称为位置参数,使用$1、$2、$3、……、$9表示。例子如下。
[root@localhost ~]# vim 1.sh #!/bin/bash echo "$1" 位置1 echo "$2" 位置2 echo "${10}" 位置10 echo "$10" 位置1和0 echo "$*" 将所有项当成一个值 echo "$@" 所有项 echo "$0" 脚本自身 echo "$#" 后面参数的个数 [root@localhost ~]# ./1.sh {1..10} 1 2 10 10 1 2 3 4 5 6 7 8 9 10
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另一个符号组合表示,较常用的几个预定义变量的含义如下:
- $*:表示所有位置参数的内容看成一个整体返回 返回所有
- $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
- $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
- $#:表示命令行中位置参数的总个数
- $0:表示当前执行的脚本或程序的名称 当前脚本的名字
- $$:当前bash的进程id
- $!: 后台任务最后一个id
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。