1、设定变量
设定变量的语法: 变量名称=值
在设定变量时,需要注意的是:等号两边紧邻的,不可以有空白。通常比较好的习惯是,把字符串(值)用双引号或单引号括起来,且等号右边的值含有空白,一定要用引号引起来。例如
- myname=wsp #这种方式也可以,更好的习惯是
myname="wsp"
- yourname="Black Jack" #右边一定要用引号,因为字符串中出现了空格
另外,在写Script时,为了怕打错变量名称,造成排错上的困难,我们可以规定:变量一律要经过设定,程序才能使用。做法如下例:
- #!/bin/bash
- shopt -s -o nounset #-s 打开选项; -o是指可以使用set -o设定的选项
- #nounset 表示变量一定要先设定,才能使用
- declare Infomix=50 #declare声明变量Infomix,并设值为50
- echo $Infomix #显示结果:50
- #若这里把变量名字写错了,执行时就会显示错误信息
2、取得变量值
“变量值”指的是:变量名称所代表的内存空间所存储的内容。
取得变量值的方法是,在变量名称前面加上$,形式如下:
需要注意的是,如若变量的后面接有英语单词或底线,需要用{}把$和变量名称隔开,否则shell无法正确判断变量。例如
- myname="wsp"
- echo $myname #显示 wsp
- echo Hi,${myname}Mmmm #显示 wspMmmm
$放在变量名之前,表示要取变量值,但如果要显示$这个字符,需要使用\符号,转义其特殊意义,或者使用单引号。
- I=8
- echo \$I #显示 $I
- echo '$I'
#显示 $I
3、取消和情况变量
(3-1)取消变量
在Shell Script中需要取消某一个变量或函数,这个动作称为“取消变量”。取消变量是把该变量由变量空间释放。不过,若某变量的属性是只读的话,则不能删除该变量。
取消变量的方法:使用unset
unset的后面可以接变量名或函数名。用法如下:
- unset 变量名称 #先尝试取消变量,若失败,再尝试取消与该变量同名的函数
- unset -v 变量名称 #-v 表示取消变量
- unset -f 函数名称 #-f 表示取消函数
(3-2)清空变量
unset不但把变量的内容(值)清空,而且让这个变量不存在。和unset的做法有一点接近的是“清空变量”。清空变量是把变量的内容删除,其值为null(空),但该变量仍然存在(在变量空间中),这和取消变量是不一样的。
“清空变量”的做法是: 变量名称=
这个方法,其实是把变量重新设定一个空值给它,等号右边是空的。
4、变量和引号
用单引号或双引号把值括起来,是否有差别? 有。
在双引号中,可以进行如下三个操作:(1)替换变量 (2)替换命令执行结果 (3)替换算术运算结果。若想抑制在双引号中替换变量,可以使用\转义$。而单引号的作用则是形成一个所见所得的字符串(即写什么,就显示什么),不会进行任何的变量操作。
- myname="Bash Shell"
- HelloWord1="Hi,I am $myname"
- echo $HelloWord1 #显示:Hi,I am Bash Shell
- HelloWord2='Hi,I am $myname'
- echo $HelloWord2 #显示:Hi,I am $myname
- HelloWord3="Hi,I am \$myname"
- echo $HelloWord3 #显示:Hi,I am $myname
5、变量的有效范围与环境变量
变量一旦设定之后,只有在该shell的环境中有效,它无法影响其他shell环境中的变量。因此,一旦script文件执行完毕(该script执行时为目前shell的子shell),该script的变量即不再有效。
那么,变量要如何处理,才能为子shell取用?
当子shell产生时,它会继承父shell的环境变量等条件,因此,只要使变量成为环境变量,就能为子shell取用。变成环境变量的方法可使用export这个命令:
- testVAR="Hello World"
- export testVAR
- #也可以等价成下面一行
- export testVAR="Hello World"
export是Bash的内置命令,用途是把某一变量输出,变成环境变量,以使后续的各种操作(包括子shell)皆可用于提取该变量的内容。若执行export 或 export -p,会列出目前所有的环境变量。另外,“declare -x 变量名称”这一指令也可以把某一个变量变成环境变量,例如- declare -x textVAR="Hello World" #这个作用和export是一样的
取消环境变量的方法和取消变量是一样的,可以用=号把变量内容清空,或用unset命令把变量取消。
6、Bash 的内置变量
Bash默认建立了许多内置变量。这里先少量介绍几个。
(6-1)BASH
用途:Bash的完整路径名。通常是:/bin/bash 或 /usr/local/bin/bash。 用例:echo $BASH
(6-2)BASH_VERSION
用途:Bash的版本。 用例:echo $BASH_VERSION
(6-3)HOME
用途:设定用户家目录的位置。通常,root的家目录是/root,一般用户的家目录在/home/账号。替换 ~ 的结果,就是HOME变量值。
(6-4)HOSTNAME
用途:主机名。用例:echo $HOSTNAME
(6-5)HOSTTYPE
用途:主机形态。例如i386.
(6-6)IFS
用途:定义字段分隔符。默认值为:空格符、tab字符、换行字符(newline)
(6-7)LANG
用途:目前语系(locale)的名称。 用例:echo $LANG
(6-8)PATH
用途:命令的搜索路径。 用例为:echo $PATH。 如果要自行添加搜索路径,一般的做法为:export PATH=/root/bin/:$PATH。这样可以在PATH增加路径/root/bin。
(6-9)PS1
用途:主要提示符号。 默认值为\s\v\$。其中,\s表示shell的名称,\v表示bash的版本号,\$表示若使用者是root,则替换成'#',否则替换成'$'。
(6-10)SHELL
用途:shell的文件路径。默认为'/bin/bash'。
(6-11)UID
用途:用户代码,即密码文件账号中的第3个域值。
(6-12)$1~$n
用途:位置参数。传入程序或函数式的参数,第一个参数是$1,第二个参数是
$2,其他类推。若位置参数n超过9个以上,则要用${n},例如${10}。 需要注意的是:$0代表执行程序的名称本身。
(6-13)$*
用途:代表所有的位置参数,并且视为一个字符串。例如:tes.sh ABC 123 xyz, 则$*的内容为字符串"ABC 123 xyz"。
(6-14)$@
用途:代表所有的位置参数,但$@代表各位置参数组成的串行。例如:tes.sh ABC 123 xyz, 则$*的内容为"ABC"、"123"、"xyz"这3个字符串。
(6-15)$#
用途:位置参数的个数。例如:tes.sh ABC 123 xyz, 则$#的值为3。
(6-16)$?
用途:上一个命令执行结束后的传回值。通常0代表执行成功,非0代表有误。
(6-17)$$
用途:目前bash shell的进程编号。
(6-18)$!
用途:上一个后台程序的进程编号。
7、调整变量属性
不能修改内容的变量称为只读变量。通常,使用只读属性来定义不变常数。Bash 有两个内置命令,可以定义只读变量:readonly 和 declare 。
(7-1)只读变量:使用readonly命令
readonly的语法为:readonly 变量名称
- readonly pi=3.14 #如果再试图给pi赋值,就会提示pi是只读的
readonly的其他用法:执行readonly 或readonly -p 显示目前具有只读属性的变量列表; readonly -a 数组变量,设定只读数组。
(7-2)只读变量:使用declare命令
declare的语法: declare -r 变量名称
- declare -r pi=3.14 #如果再试图给pi赋值,就会提示pi是只读的
declare除了可以调整只读属性,还有其他用法,如下:
- 选项 用途 用例 释义
- -p 显示变量的属性 declare -p x 显示变量x的属性
- -a 变量是一个数组 declare -a arry 设定arry是一个数组
- -i 变量是一个整数 declare -i a 设定变量a是整数形态
- -r 设定只读变量 declare -r a 设定变量是只读变量
- -x 设为环境变量 declare -x PATH 设定PATH为环境变量
8、别名
替指令取一个短而方便的代称,这样的机制称为“别名”。
Bash的内置命令alias可以用来建立别名, 其语法为:alias 别名=指令。需要注意的是,=号两旁不可以有空格,如果等号右边的指令还有空白,需要用单引号含括该指令。此外,直接执行alias 或 alias -p 可显示目前已设定的别名。
- alias ll='ls -l --color=auto' #执行ll就等于执行
ls -l --color=auto
- alias cp='cp -i' #别名可以跟原命令名相同
取消别名的方法是:unalias 别名,例如:unalias ll。如果要取消所有别名,可以使用 unalias -a。
数组是一种数据结构,每个数据项称为数组元素,且可以使用索引的方式获得各元素的值。bash的数组,其元素个数没有限制,数组的索引由0开始,但不一定连续(可以跳跃)。索引页可以用算术表示式,如1+2。不过,bash仅只是一维的数组(与Bash版本有关)。
(9-1)数组的用法
直接举例说明:
- A[0]=5 #这里创建了一个数组A,需要注意的是索引从0开始
- A[4]=10 #可以跳跃
- A[3]="bash shell" #需要的话,可以随时增加元素
欲显示或取得某一个元素值,其语法为: ${数组[索引值]},例如:echo ${A[0]}、 echo ${A[1+1]}。当然数组还有其他的建立方法:- B=(23 88 99 66) #一次顺序设定每个元素的值
- echo ${B[2]} #显示99
- C=([3]=77 [1]=100 [5]=66) #指定个别元素的索引
- echo ${C[5]} #显示66
(9-2)取出数组所有的元素
bash可以一次取出所有的元素,语法为:${数组[@]} 或 ${数组[*]}。区别是${数组[@]}得到是以空格隔开的元素,而${数组[*}得到一整个字符串。
- B=(23 88 99 66)
- echo ${B[@]} #显示的是23 88 99 66
- echo ${B[*]} #${B[*]} 得到的是"23 88 99 66"
(9-3)取出数组元素的个数
计算数组元素的个数(长数组度)的语法是:${#数组[@]} 或 ${#数组[*]}。
- B=(23 88 99 66)
- echo ${#B[@]} #显示4
- A[3]="bash shell" #若数组元素是字符串,可以通过语法:${#数组[索引]} 获取元素长度
- echo ${#A[3]} #显示10
Bash Shell的启动配置文件机制,可以为用户提供自定义工作环境。使用者可以比较启动配置文件,安排方便工作的环境。自定义环境的主要目的是为了让用户登录主机时,能拥有安全及易于执行的命令环境,包括:建立文件的权限,命令搜索路径、环境变量、别名、显示文件使用的颜色等等。
通常,可以自定配置的文件是:~/.bash_profile 和 ~/.bashrc。这里的~只的是家目录。一般会在.bash_profile中设定可以一体适用的命令、搜索路径及环境变量,而把其他大部分的设定放在.bashrc中,比如别名等。