SHELL的变量和运算符

本地变量 :在用户现在的shell生命期的脚本中使用
   变量名 =变量值
eg:
   LOCALHOST='test'     //设置变量(变量名必须大写)
   echo $LOCALHOST  or   echo ${LOCALHOST}    //显示变量值  
set 命令式显示本地所有的变量
   当你退出系统之后,本地变量的生命周期就结束了。
readonly设置一个变量后,那这个变量的值就不能改变了,谨慎使用
    readonly变量名   只输入readonly则显示系统已经存在的只读变量名。
 
环境变量 :环境变量可以用于所有用户进程
 1.用户自己的环境变量   $HOME .bash_profile   可以在这个文件里面添加环境变量,在自己home目录下面设置的环境变量只对自己生效
 2.系统的环境变量        /etc/profile          在这个里面添加的环境变量,对整个系统中所有的用户都生效
 查看系统中的环境变量   cat more vim  /etc/profile 这个文件,或者直接 env
 定义环境变量: export 变量名 =变量值
eg: 变量名大小写都可以
    export LIU=tom
    echo $LIU
export liu=tom2
    echo $liu
变量替换 :变量的值替换变量的名字
eg:
    tony="tony is a name"
    echo $tony 
替换方式:{}用不用都是一样的,variable name变量名,value随便给的一个提示
        ${variable name}              显示变量名的值,则显示其值
        ${variable name:+value}       如果设置了变量名,则显示value,否则为空
        ${variable name:?value}       如果未设置变量名,显示用户定义错误信息value  ||可以提醒变量是否定义了
        ${variable name:-value}       如果未设置变量名,则显示其值value
        ${variable name:=value}       如果未设置变量名,设置其值,并显示
eg:
[root@localhost ~]# this="123"           //设置变量this的值
[root@localhost ~]# echo $this           //显示变量this的值
123
[root@localhost ~]# echo ${this:+that}    //如果设置了this变量的值,则显示that(that是提示)
that
[root@localhost ~]# echo ${this1:+"that"}  //如果没有设置this1变量,则显示为空
 
[root@localhost ~]# echo ${this1:?no defind}   //如果没有设置变量this1,则显示错误,no defind是给你的提示
-bash: this1: no defind
[root@localhost ~]# echo ${this1:-no defind}   //如果没有设置变量this1,则显示提示,但不报错
no defind
[root@localhost ~]# echo ${this:-no defind}     //如果设置变量this,则显示变量的值,不给提示
123
[root@localhost ~]# echo ${this2:=defind}       //如果没有设置变量this2,则这句相当于设置并且赋值 
defind
[root@localhost ~]# echo $this2       //显示刚才用上面的方式设置的变量this2的值
defind
 
    变量清除 unset变量名   readonly既不能重新设置值也不能unset掉,unset也不能删除环境变量
 
位置变量 :向脚本中使用位置参数,向系统命令传递参数 $0,$1,...$9
$0表示脚本中的名字,$1表示脚本中的第一个参数,然后依次类推
           (脚本的第一行是脚本是用什么shell写的)
           (脚本的第二行是脚本的名字,脚本的用途)            写脚本养成好习惯
           (脚本的第三行是由谁写的,什么时间写的)
eg:向脚本中使用位置参数
#####vim eg1.sh 
#!/bin/bash   
#eg1.sh       
echo "this is script name: $0"
echo "it is one parameters: $1"
echo "it is two parameters: $2"
echo "it is three parameters: $3"
echo "it is four parameters: $4"
echo "it is five parameters: $5"
####保存退出,chmod +x eg1.sh 
####运行./eg1.sh 1 2 3 4
[root@localhost ~]# ./eg1.sh 1 2 3 4
this is script name: ./eg1.sh
it is one parameters: 1
it is two parameters: 2
it is three parameters: 3
it is four parameters: 4
it is five parameters: 
 
eg:向系统命令传递参数 
#####vim eg2.sh
#!/bin/bash
#eg2
find /root -name $1 -print
####保存退出,chmod +x eg2.sh 
####运行./eg2.sh gnome-vfs
[root@localhost ~]# ./eg2.sh gnome-vfs
/root/.gnome/gnome-vfs
 
标准shell变量:bash默认建立了一些标准环境变量,可在/etc/profile中定义
 EXINIT :保存使用vi编辑器的初始化选项
 HOME :用于记录用户的主目录
 IFS :用作shell指定的缺省域分隔符;一个个字段域之间用什么隔开的理论上可以任意字符,比喻/usr/bin;/usr/sbin这里的IFS就是”;”了。
 LOGNAME :登录名
 MAIL :用户邮箱存放的位置
 MAILCHECK:用户的邮箱每隔多少秒(默认60秒)检查一下是否有新邮件发过来。
 MAILPATH:当用户有多个邮箱时,可以用到这个变量,也就是mail存在哪几个文件中,它的格式和 PATH变量一样。
 TERM:用户登录系统的终端类型什么,默认是vt100.
 PATH:可执行文件寻找的路径。
 TZ:表示时区。
 PS1:登录系统的提示符 比如:“[root@localhost ~]#” 就是提示符
 PS2:命令提示符,一般在一行输不完,需要输入多行时的提示符。默认是”>”
 PWD:当前目录是什么。
 SHELL:当前运行的shell是哪个。
 TERMINFO:终端类型的配置信息。
 EDITOR:设置编译器工具
eg:
[root@localhost ~]# echo $MAILCHECK
60
[root@localhost ~]# set | grep "MAILCHECK"
MAILCHECK=60
 
PS1提示符的设置
\d:代表日期,格式为星期 月 日
\t:24小时格式显示时间,HH:MM:SS
\A:24小时格式显示时间, HH:MM
\T:12小时格式显示时间,HH:MM:SS
\H:完整的主机名称
\h:只取主机名称的第一个名字
\u:当前账户名
\v:bash版本信息
\w:完整工作目录
\W:只列出最后一个目录
\#:执行的第几个指令
\$:root用户提示符是#,其他的用户提示符是$
eg:
PS1='[\u@\h \W]\$ '   提示符 [root@localhost ~]#
PS1="\u: \w\\$ " 这样,提示符就变成:root: /usr/bin$ 
 
特殊变量
  $0 正在被执行命令的名字。
  $# 表示传递到脚本的参数个数
  $* 以一个字符串显示所有向脚本传递的参数,跟位置变量不同的是这里参数可超过9个。
  $$ 表示当前运行脚本的进程ID号
  $! 表示后台运行的一个进程的ID号
  $@ 与$#相同,但是使用时加引号,并在引号中返回每一个参数
  $- 显示shell使用的当前选项,与set命令相同
  $? 显示最后命令运行的推出状态,0表示没有错误,其他任何值表示有错误 
eg:
#####vim eg2.sh
#!/bin/bash   
#eg2.sh       
echo "this is script name: $0"
echo "it is one parameters: $1"
echo "it is two parameters: $2"
echo "it is three parameters: $3"
echo "it is four parameters: $4"
echo "it is five parameters: $5"
echo "this is :$#"
echo "this is :$*"
echo "this is process ID:$$"
echo "this is last:$?"
####保存退出,chmod +x eg2.sh 
####运行 ./eg2.sh A B C D F
this is script name: ./eg2.sh
it is one parameters: A
it is two parameters: B
it is three parameters: C
it is four parameters: D
it is five parameters: F
this is :5
this is :A B C D F
this is process ID:7976
this is last:0   
                  
影响变量的命令
declare
  设置或显示变量
  -f 只显示函数名
  -r 创建只读变量(declare 和typeset)
  -x 创建转出变量
  -I 创建整数变量
  使用+替代-,可以颠倒选项的含义
export
  用于创建传给子shell的变量
   --表明选项结束,所有后续参数都是实参。
  -f 表明在“名-值”对中的名字是函数名。
  -n 把全局变量转换成局部变量。即命令的变量不再传给子shell
  -p 显示全局变量列表
readonly
  用于显示或只读变量
  --表明选项结束
  -f 创建只读变量
set
 设置或重设各种shell
shift [n]
  用于移动位置变量,调整位置变量,使$3 的值赋予$2,$2的值赋予$1
typeset
  用于显示或设置变量,是declare的同义词
unset
  用于取消变量的定义
  -f 删除只读变量 ,但不能取消从shell环境中删除指定的变量 和函数
eg:
#####vim eg2.sh
#!/bin/bash   
#eg2.sh       
echo "this is script name: $0"
echo "it is one parameters: $1"
echo "it is two parameters: $2"
echo "it is three parameters: $3"
echo "it is four parameters: $4"
echo "it is five parameters: $5"
echo "this is :$#"
echo "this is :$*"
echo "this is process ID:$$"
echo "this is last:$?"
shift
echo "now this is one:$1"
echo "now this is two:$2"
####保存退出,chmod +x eg2.sh 
####运行 ./eg2.sh A B C D F
this is script name: ./eg2.sh
it is one parameters: A
it is two parameters: B
it is three parameters: C
it is four parameters: D
it is five parameters: F
this is :5
this is :A B C D F
this is process ID:8094
this is last:0
now this is one:B
now this is two:C
 
eg:
 
#####vim eg2.sh
#!/bin/bash   
#eg2.sh       
echo "this is script name: $0"
echo "it is one parameters: $1"
echo "it is two parameters: $2"
echo "it is three parameters: $3"
echo "it is four parameters: $4"
echo "it is five parameters: $5"
echo "this is :$#"
echo "this is :$*"
echo "this is process ID:$$"
echo "this is last:$?"
shift 2
echo "now this is one:$1"
echo "now this is two:$2"
####保存退出,chmod +x eg2.sh 
####运行
./eg2.sh A B C D F
this is script name: ./eg2.sh
it is one parameters: A
it is two parameters: B
it is three parameters: C
it is four parameters: D
it is five parameters: F
this is :5
this is :A B C D F
this is process ID:8103
this is last:0
now this is one:C
now this is two:D
 
引号
    双引号 " "
    单引号 ''
反引号 ``
反斜杠 \
eg:
[root@localhost ~]# echo ert *     //得到所有root目录的文件和目录
ert anaconda-ks.cfg Desktop Documents Downloads eg1.sh eg2.sh install.log install.log.syslog
[root@localhost ~]# echo ert "*"
ert *
[root@localhost ~]# echo "ert *"
ert *
[root@localhost ~]#
 
eg:双引号:把它所包含的内容作为普通字符,但‘’ \ $  `` 除外
[root@localhost ~]#  echo -e "your system is init done.\nplease reboot"
your system is init done.
please reboot
[root@localhost ~]#  echo "`date`"
Wed Jan 23 07:51:49 CST 2013
[root@localhost ~]# echo "$LANG"
en_US.UTF-8
 
eg:单引号:把它所包含的内容全都作为普通字符
[root@localhost ~]# echo 'date'
date
[root@localhost ~]# echo '`date`'
`date`
[root@localhost ~]# echo '\n'
\n
 
eg:反引号:执行系统的命令,并执行出来
[root@localhost ~]# date
Fri Mar  1 18:48:22 CST 2013
[root@localhost ~]# echo date
date
[root@localhost ~]# echo $date  //date是系统的命令,不是系统的变量,所以没有输出
 
[root@localhost ~]# echo `date`
Fri Mar 1 18:48:39 CST 2013
 
eg:反斜杠:屏蔽特殊字符的特殊含义
[root@localhost ~]# echo *
anaconda-ks.cfg Desktop Documents Downloads eg1.sh eg2.sh install.log install.log.syslog 
[root@localhost ~]# echo \*
*
 
运算符
  位运算符:
           反运算符:~
  左移运算符:<<  相当于乘以2
  右移运算符:>>   相当于除以2
  比较运算符:&
  异减运算符:^
  或运算符:|
eg:
[root@localhost ~]# echo $[ 8+2 ] 
10
[root@localhost ~]# echo $[ 8<<2 ] 
32
[root@localhost ~]# echo $[ 8>>2 ] 
2
[root@localhost ~]# echo $[ 8 & 2 ] 
0
[root@localhost ~]# echo $[ 8 ^ 2 ] 
10
[root@localhost ~]# echo $[ 8 | 2 ] 
10
[root@localhost ~]# echo $[ ~ 8 ] 
-9
[root@localhost ~]#
逻辑符:  && ,|| ,> ,== ,< ,!=  分别是与、或、大于、等于、小于、不等于  
eg:
[root@localhost ~]# var=23
[root@localhost ~]# let var+=43
[root@localhost ~]# echo $var
66