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 ]
[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
本文转自 jie783213507 51CTO博客,原文链接:http://blog.51cto.com/litaotao/1187976,如需转载请自行联系原作者