[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]
变量类型:
Shell中有以下几种变量:
1) 本地变量
2) 环境变量
3) 位置变量
4) 标准变量
5) 特殊变量
1) 本地变量
本地变量在用户现在的Shell生命周期的脚本中使用。
用法: variable-name=value
set: 可以显示本地所有的变量
注意,本地变量如果加上readonly,则该本地变量不能被修改,也就是说该变量仅仅是可读的,另外,可以直接输入readonly或readonly -p打印出所的的本地变量,例如:
jesson@jesson-K43SV:~$ TIP="Hello World!"
jesson@jesson-K43SV:~$ set | grep TIP
TIP='Hello World!'
jesson@jesson-K43SV:~$ echo $TIP
Hello World!
jesson@jesson-K43SV:~$ echo ${TIP}}
Hello World!}
jesson@jesson-K43SV:~$ TIP="hello world!"
jesson@jesson-K43SV:~$ echo $TIP
hello world!
jesson@jesson-K43SV:~$ readonly TIP
jesson@jesson-K43SV:~$ TIP="hello shell!"
bash: TIP: 只读变量
jesson@jesson-K43SV:~$ 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"
jesson@jesson-K43SV:~$ 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命令,就可以查看所有的环境变量,如:
jesson@jesson-K43SV:~$ export NAME="jesson20121020"
jesson@jesson-K43SV:~$ 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
jesson@jesson-HP:~/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如果我们要查找当前目录下的parm.sh这个文件,就可以这样做:
#searchfile
find . -name $1 -print
jesson@jesson-HP:~/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号。
$@: 与$#相同,但是使用时加引号,并在引号中返回每个参数。
$-: 显示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 "显示前一命令运行的状态:" $?
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F Gshell中的变量基本就这5种,下面我们再看一些与变量相关的命令吧。
脚本的名称: ./parm.sh
脚本的第一个参数: A
脚本的第二个参数: B
脚本的第三个参数: C
脚本的第四个参数: D
脚本的第五个参数: E
脚本的第六个参数: F
脚本的第七个参数: G
脚本的第八个参数:
脚本的第九个参数:
显示参数个数: 7
显示脚本全部参数: A B C D E F G
显示当前脚本的进程ID号: 30089
显示前一命令运行的状态: 0
与变量相关的命令:
变量替换
变量替换即用变量的值替换它的名子。
在变量名前加$,使用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,则设置其值并显示 |
以下例子演示了这几个变量替换使用方法和效果
jesson@jesson-K43SV:~$ var="hello world!"既然有变量替换,那么相应的肯定有变量清除了。
jesson@jesson-K43SV:~$ echo $var
hello world!
jesson@jesson-K43SV:~$ echo ${var}
hello world!
jesson@jesson-K43SV:~$ echo ${var:+"hello shell!"}
hello shell!
jesson@jesson-K43SV:~$ echo ${var1:+"hello shell!"}
jesson@jesson-K43SV:~$ echo ${var:?"define"}
hello world!
jesson@jesson-K43SV:~$ echo ${var:-"hello shell!"}
hello world!
jesson@jesson-K43SV:~$ echo ${var1:-"hello shell!"}
hello shell!
jesson@jesson-K43SV:~$ echo $var1
jesson@jesson-K43SV:~$ echo ${var:="hello shell!"}
hello world!
jesson@jesson-K43SV:~$ echo ${var1:="hello shell!"}
hello shell!
jesson@jesson-K43SV:~$ echo $var1
hello shell!
变量清除
可以清除已设置的变量。
用法: unset variable-name
jesson@jesson-K43SV:~$ echo $var1
hello shell!
jesson@jesson-K43SV:~$ unset var1
jesson@jesson-K43SV:~$ 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
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ./parm.sh A B C D E F G接着,我们再改动一下,在shift 后加上2,如下:
脚本的名称: ./parm.sh
脚本的第一个参数: A
脚本的第二个参数: B
脚本的第三个参数: C
脚本的第四个参数: D
脚本的第五个参数: E
脚本的第六个参数: F
脚本的第七个参数: G
脚本的第八个参数:
脚本的第九个参数:
显示参数个数: 7
显示脚本全部参数: A B C D E F G
显示当前脚本的进程ID号: 31218
显示前一命令运行的状态: 0
脚本的第一个参数: B
脚本的第二个参数: C
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
jesson@jesson-HP:~/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