Shell变量及相关的命令
一个变量就是内存中被命名的一块存储空间.一个Shell变量的名字可以包含数字,字母和下划线,变量名的开头只准许是字母和下划线.变量名中的字母是大小写敏感的,变量名没有限制.
Shell可以是以下两种:Shell环境变量和用户定义变量.
1.Shell环境变量
环境变量是用来定制Shell的运行环境,保证Shell命令的正常运行.所有环境变量会传递给Shell的子进程,这些变量大多数在/etc/profile文件中初始化,而/etc/profile是在用户登录的时候执行的,这个文件由系统管理员编写,用来为系统的所有用户建立一个通用的环境.可以在~/.profile文件中给部分或全部环境变量赋不同的值,它同样在登录的时候执行,或者在~/.bashrc,~/bash_login和~/.bash_profile中修改,它们在Bash启动的时候执行.
一些重要的可修改的Bash环境变量
BASH Bash的完整路径名
CDPATH 包含cd命令要逐个查找的路径,cd命令在这些路径下查找 作为参数传递给它的目录名.如果CDPATH没有设置,cd命令则查找当前目录
EDITOR 在应用程序中使用的默认的编辑器
ENV linux查找配置文件的路径
HISTFILE 存放历史记录的文件的路径名
HOME 用户的主目录名字
IFS Bash用来分割命令行中参数的分割符号
MAIL 用户的主目录的命令
MAILCHECK Shell应该多久检查一次用户的系统邮箱,并在有新邮件的时候通知用户
PATH 包含用户检索路径的变量 --Shell依据这个变量在它指出的目录下面查找外部命令和程序
PPID 父进程的ID号
PS1 出现在命令行的主Shell提示符,通常被设置为$,但是这是可以修改的
PS2 出现在一个命令的第二行的二级Shell提示符号
PWD 很熟悉,当前工作目录的名字
TERM 用户的控制终端的类型
一些重要的只读Bash环境变量
$0 程序的名字
$1~$9 命令行参数1~9的值
$* 所有命令参数的值
$@ 所有命令行参数的值
$# 记录了命令行参数的总个数
$$ 当前进程的ID号
$? 最近一次命令的退出状态
$! 最近一次后台进程的ID号
2.用户定义的变量
用户定义的变量在Shell脚本中用来作为临时的存储空间,他们的值在程序执行的过程中是可以改变的.这些变量可以设置为只读的,而且也可以被传递给定义它们的那个Shell脚本,不同于其他的编程语言,在Bash编程编程语言中,不需要定义并初始化一个Shell变量,一个没有被初始化的Shell变量自动地被初始化为一个空串.
set命令可以打印出目前所有的Shell变量.
好了,来先写一个简单的Shell吧(为了避免自己写的脚本与系统命令重名,建议shell脚本以.sh结尾. 但自己写的脚本还是可能与系统自带的脚本重名, 建议命名前通过$ which Shellname.sh).
vi一个hello.sh放在ScriptFile文件夹下
$vi hello.sh
文件内容:{
date
who
}
$cd ScriptFile
$./hello.sh
显示如下:
yaoyuan@yaoyuan-desktop:~/ScriptFile$ ./hello.sh
yaoyuan tty7 2008-10-11 21:09 (:0)
yaoyuan pts/0 2008-10-11 22:47 (:0.0)
控制Shell提示符
Bash允许很方便地控制Shell提示符,可以指定一个或多个特殊字符作为提示符变量(PS1,PS2等),以此可以显示不同的Shell提示符.
一些有用的特殊字符及其描述
\H 主机域名的全称
\T 时间,格式为hh:mm:ss,12小时格式
\d 日期,格式为"weekday month date"
\h 计算机的主机名的第一部分(第一个"."前面的部分)
\s 用户shell的名字
\t 时间,格式为hh:mm:ss,23小时
\u 当前用户的用户名
\v Bash的版本号
\w 当前的工作目录
来试一下
yaoyuan-desktop$PS1='\t$'
23:29:56$PS1='\s-\v$'
bash-3.2$PS1='\v$'
3.2$PS1='\H$'
yaoyuan-desktop$PS1='\s$'
bash$PS1='\H$'
yaoyuan-desktop$
变量声明
Bash并不要求声明变量,但是可以使用declare和typeset命令来声明变量,对它们进行初始化,并设定它们的属性.一个变量的属性规定了该变量可以被赋给的值的类型和该变量的范围.一个Bash变量默认是一个字符串,但是可以把一个变量定义为一个整型值.
声明变量,初始化变量,设置它们的属性
declare[+-options][name[=value]]
typeset[+-options][name[=value]]
-a 每一个"name"是一个数组
-f 每一个"name"是一个函数
-i "name"是一个整数
-r 给每一个"name"标记上只读的属性
-x 表示每一个"name"都可以被子进程访问到
再试试看:
yaoyuan-desktop$declare -i age=42
yaoyuan-desktop$echo $age
42
yaoyuan-desktop$declare -rx OS=linux
yaoyuan-desktop$echo $OS
linux
使用name=value,改变一个变量的值
yaoyuan-desktop$echo $age
42
yaoyuan-desktop$age=100
yaoyuan-desktop$echo $age
100