[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]
变量类型:
Shell中有以下几种变量:
1) 本地变量
2) 环境变量
3) 位置变量
4) 标准变量
5) 特殊变量
1) 本地变量
本地变量在用户现在的Shell生命周期的脚本中使用。
用法: variable-name=value
set: 可以显示本地所有的变量
注意,本地变量如果加上readonly,则该本地变量不能被修改,也就是说该变量仅仅是可读的,另外,可以直接输入readonly或readonly -p打印出所的的本地变量,例如:
[email protected]:~$ TIP="Hello World!" [email protected]:~$ set | grep TIP TIP='Hello World!' [email protected]:~$ echo $TIP Hello World! [email protected]:~$ echo ${TIP}} Hello World!} [email protected]:~$ TIP="hello world!" [email protected]:~$ echo $TIP hello world! [email protected]:~$ readonly TIP [email protected]:~$ TIP="hello shell!" bash: TIP: 只读变量 [email protected]:~$ readonly declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath" declare -ir BASHPID declare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d" declare -ar BASH_REMATCH='([0]="\${TIP" [1]="\${" [2]="TIP")' declare -ar BASH_VERSINFO='([0]="4" [1]="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")' declare -ir EUID="1000" declare -ir PPID="2162" declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor" declare -r TIP="hello world!" declare -ir UID="1000" [email protected]:~$ readonly -p declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath" declare -ir BASHPID declare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d" declare -ar BASH_REMATCH='([0]="\${TIP" [1]="\${" [2]="TIP")' declare -ar BASH_VERSINFO='([0]="4" [1]="3" [2]="11" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")' declare -ir EUID="1000" declare -ir PPID="2162" declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor" declare -r TIP="hello world!" declare -ir UID="1000"
2) 环境变量
环境变量用于所有的用户进程(通常称为子进程),登录进程称为父进程。Shell中执行的用户进程均称为子进程。本地变量仅用于本地用户的进程,而环境变量则可用于所有的子进程,包括编辑器,脚本和应用。
“export 变量” 可以将该变量设置为环境变量,另外,可以直接输入export命令或env命令,就可以查看所有的环境变量,如:
[email protected]:~$ export NAME="jesson20121020" [email protected]:~$ env | grep NAME NAME=jesson20121020
3) 位置变量
在Shell中位置有变量有9个,即$1,...,$9,超过9个就要用其他的方式实现,参考以下脚本:
parm.sh
#!/bin/bash #parm echo "脚本的名称:" $0 echo "脚本的第一个参数:" $1 echo "脚本的第二个参数:" $2 echo "脚本的第三个参数:" $3 echo "脚本的第四个参数:" $4 echo "脚本的第五个参数:" $5 echo "脚本的第六个参数:" $6 echo "脚本的第七个参数:" $7 echo "脚本的第八个参数:" $8 echo "脚本的第九个参数:" $9
运行以上脚本得到:
[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G 脚本的名称: ./parm 脚本的第一个参数: A 脚本的第二个参数: B 脚本的第三个参数: C 脚本的第四个参数: D 脚本的第五个参数: E 脚本的第六个参数: F 脚本的第七个参数: G 脚本的第八个参数: 脚本的第九个参数:
再看一个脚本,实现按文件名查找当前目录下的文件
searchfile.sh
#!/bin/bash #searchfile find . -name $1 -print
如果我们要查找当前目录下的parm.sh这个文件,就可以这样做:
[email protected]:~/develop/workspace/shell_workspace$ ./searchfile.sh parm.sh ./parm.sh
可以看到,查找到了,并打印出来了。
4) 标准变量
bash默认建立了一些标准的环境变量,可以在/etc/profile中定义,主要有EXINIT,HOME(家目录),IFS(默认分隔符),LOGNAME,MAIL,MAILCHECK(默认为60),MAILPATH,PATH,PSI,PS2(用于一行运行多个命令时),SHELL,TERM(终端),TZ(时区),PWD(当前目录),MANPATH(帮助文档存放目录),TERMINFO,EDITOR等。
5) 特殊变量
$#: 传递到脚本的参数个数
$*: 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可以超过9个。
$$: 脚本运行的当前进程ID号。
$!: 后台运行的最后一个进程的进程ID号。
[email protected]: 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$-: 显示shell使用的当前选项,与set命令功能相同。
$?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
我们修改上述的parm.sh脚本如下:
parm.sh
#!/bin/bash #parm echo "脚本的名称:" $0 echo "脚本的第一个参数:" $1 echo "脚本的第二个参数:" $2 echo "脚本的第三个参数:" $3 echo "脚本的第四个参数:" $4 echo "脚本的第五个参数:" $5 echo "脚本的第六个参数:" $6 echo "脚本的第七个参数:" $7 echo "脚本的第八个参数:" $8 echo "脚本的第九个参数:" $9 echo "显示参数个数:" $# echo "显示脚本全部参数:" $* echo "显示当前脚本的进程ID号:" $$ echo "显示前一命令运行的状态:" $?
运行一下,结果如下:
[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G 脚本的名称: ./parm.sh 脚本的第一个参数: A 脚本的第二个参数: B 脚本的第三个参数: C 脚本的第四个参数: D 脚本的第五个参数: E 脚本的第六个参数: F 脚本的第七个参数: G 脚本的第八个参数: 脚本的第九个参数: 显示参数个数: 7 显示脚本全部参数: A B C D E F G 显示当前脚本的进程ID号: 30089 显示前一命令运行的状态: 0
shell中的变量基本就这5种,下面我们再看一些与变量相关的命令吧。
与变量相关的命令:
变量替换
变量替换即用变量的值替换它的名子。
在变量名前加$,使用echo $变量名 就可以打印出该变量的值。
变量替换有以下几种方式:
变量替换方式 |
说明 |
$variable-name |
引用实际值到variable-name |
${variable-name} |
同上 |
${variable-name:+value} |
如果设置了variable-name,则显示其值,否则,为空 |
${variable-name:?value} |
如果未设置variable-name,则显示用户自定义的错误信息。 |
${variable-name:-value} |
如果未设置variable-name,则显示其值 |
${variable-name:=value} |
如果未设置variable-name,则设置其值并显示 |
以下例子演示了这几个变量替换使用方法和效果
[email protected]:~$ var="hello world!" [email protected]:~$ echo $var hello world! [email protected]:~$ echo ${var} hello world! [email protected]:~$ echo ${var:+"hello shell!"} hello shell! [email protected]:~$ echo ${var1:+"hello shell!"} [email protected]:~$ echo ${var:?"define"} hello world! [email protected]:~$ echo ${var:-"hello shell!"} hello world! [email protected]:~$ echo ${var1:-"hello shell!"} hello shell! [email protected]:~$ echo $var1 [email protected]:~$ echo ${var:="hello shell!"} hello world! [email protected]:~$ echo ${var1:="hello shell!"} hello shell! [email protected]:~$ echo $var1 hello shell!
既然有变量替换,那么相应的肯定有变量清除了。
变量清除
可以清除已设置的变量。
用法: unset variable-name
[email protected]:~$ echo $var1 hello shell! [email protected]:~$ unset var1 [email protected]:~$ echo $var1
影响变量的命令
declare
设置或显示变量
-f: 只显示函数名
-r: 创建只读变量(declare和typeset)
-x: 创建转出变量
-i: 创建整数变量
使用+替代-,可以颠倒选项的含义
export
用于创建传给子shell的变量
--: 表明选项结束,所有后续参数都是实参。
-f: 表明在"名-值"对中名字是函数名
-n: 把全局变量转换成局部变量。换名话说,命令的变量不再传递给shell。
-p: 显示全局变量列表
readonly
用于显示或设置只读变量
--: 表明选项结束
-f: 创建只读变量
set
设置或重设各种shell
shift [n]
用于移动位置变量,调整位置变量。
typeset
用于显示或设置变量
是declare的同义词
unset
用于取消变量的定义
-- 表明选项结束
-f: 删除只读变量,但不能取消从Shell环境中删除指定的变量和函数,如PATH,PSI,PS2,PPID,UID,EUDI等。
其实,这些变量大多数已使用过,我们重点看一下shift的用法及意义,如下:
parm.sh
#!/bin/bash #parm echo "脚本的名称:" $0 echo "脚本的第一个参数:" $1 echo "脚本的第二个参数:" $2 echo "脚本的第三个参数:" $3 echo "脚本的第四个参数:" $4 echo "脚本的第五个参数:" $5 echo "脚本的第六个参数:" $6 echo "脚本的第七个参数:" $7 echo "脚本的第八个参数:" $8 echo "脚本的第九个参数:" $9 echo "显示参数个数:" $# echo "显示脚本全部参数:" $* echo "显示当前脚本的进程ID号:" $$ echo "显示前一命令运行的状态:" $? shift echo "脚本的第一个参数:" $1 echo "脚本的第二个参数:" $2
运行结果:
[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G 脚本的名称: ./parm.sh 脚本的第一个参数: A 脚本的第二个参数: B 脚本的第三个参数: C 脚本的第四个参数: D 脚本的第五个参数: E 脚本的第六个参数: F 脚本的第七个参数: G 脚本的第八个参数: 脚本的第九个参数: 显示参数个数: 7 显示脚本全部参数: A B C D E F G 显示当前脚本的进程ID号: 31218 显示前一命令运行的状态: 0 脚本的第一个参数: B 脚本的第二个参数: C
接着,我们再改动一下,在shift 后加上2,如下:
parm.sh
#!/bin/bash #parm echo "脚本的名称:" $0 echo "脚本的第一个参数:" $1 echo "脚本的第二个参数:" $2 echo "脚本的第三个参数:" $3 echo "脚本的第四个参数:" $4 echo "脚本的第五个参数:" $5 echo "脚本的第六个参数:" $6 echo "脚本的第七个参数:" $7 echo "脚本的第八个参数:" $8 echo "脚本的第九个参数:" $9 echo "显示参数个数:" $# echo "显示脚本全部参数:" $* echo "显示当前脚本的进程ID号:" $$ echo "显示前一命令运行的状态:" $? shift 2 echo "脚本的第一个参数:" $1 echo "脚本的第二个参数:" $2
运行结果如下:
[email protected]:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G 脚本的名称: ./parm.sh 脚本的第一个参数: A 脚本的第二个参数: B 脚本的第三个参数: C 脚本的第四个参数: D 脚本的第五个参数: E 脚本的第六个参数: F 脚本的第七个参数: G 脚本的第八个参数: 脚本的第九个参数: 显示参数个数: 7 显示脚本全部参数: A B C D E F G 显示当前脚本的进程ID号: 31366 显示前一命令运行的状态: 0 脚本的第一个参数: C 脚本的第二个参数: D