shell学习笔记(二)shell变量与运算符目录:

====================================================

本地变量—局部变量
本地变量—局部变量
变量替换
位置变量
标准shell变量
特殊变量
影响变量的命令
引号
运算符
    位运算符
    逻辑运算符
    关系(条件)运算符
    赋值运算符
表达式替换
运算符的优先级

====================================================

 

变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell中可用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量

变量名必须以字母或下划线字符开头。其余的字符可以是字母、数字(0~9)或下划线字符。任何其他的字符都标志着变量名的终止。名字是大小写敏感的。给变量赋值时,等号周围不能有任何空白符。为了给变量赋空值,可以在等号后跟一个换行符。创建一个局部变量最简单的格式是给一个变量赋值

 
本地变量—局部变量
 
只限于现在的shell
设置变量 eg: viong=“123”
              echo $viong
Set 查看本地变量
Readonly 查看只读变量 
Unset viong 清除变量
 
环境变量—全局变量
 
所有用户进程
Export 设置环境变量 eg:export viong=“123”
Env 查看环境变量 也可以直接执行export
修改环境变量目录 /etc/profile
 
变量替换
 
variable ['vεəriəbl] 变量
value ['vælju:]
variable 是通过 echo 显示出来
 
${ variable name}         
${ variable name:+value}  如果设置了 variable name ,则显示其值,否则为空
${ variable name:?Value}  如果未置了 variable name ,则显示用户定义错误信息
${ variable name:-value}  如果未置了 variable name ,则显示其值
${ variable name:= value}  如果未置了 variable name ,则设置其值并显示
 
eg export viong= 123
echo ${viong:+”5”}   5
echo ${viong1:+”5”}  为空
echo ${viong1:?”no defined”} no defined
echo ${viong1:-”5”}  5
echo ${viong1:=”5”} 5 并且把 viong1= 5
 
位置变量
 
位置变量有10个 从$0-$9    其中$0是显示脚本名字
 
Eg:[root@viong_app1 soft]# cat find.sh
#!/bin/bash
#find
find / -name $1 -print
[root@viong_app1 soft]# ./find.sh soft
/root/soft
/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/vgacon/soft
/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/soft
 
标准shell变量
( 大写)
Bash默认设置了,会自动解析
 
EXINIT 定义初始化VI
HOME 主目录
IFS      字行页之间分割 默认是用空格
LOGNAME 登录名
MAIL    标准用户邮箱存储的位置
MAILCHECK 检查邮箱的时间间隔
MAILPATH 多个邮箱的时候显示路径
TERM 终端类型
PATH 可执行文件的路径
TZ     表示时区
PS1 登录系统提示符
 
eg:[root@viong_app1 soft]#
PS1='[\u@\h \W]\$ '   
‘[ \u 用户名@\h 主机名字 \W当前目录]\$’ ROOT登录是#提示符   其它用户是$提示符
 
ps2 在一行上面运行多个命令的时候 会有“>“提示符
 
PWD 查看当前目录
 
特殊变量
 
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可超过9个
$$  脚本运行的当前进程ID
$! 后台运行的最后一个进程的进程ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数
$- 显示shell使用的当前选项,与set命令功能相同
$?  显示最后命令的退出状态,0 表示没有错误,其它任何值表明有错误
 
eg:
 [root@viong_app1 soft]# cat find.sh
#!/bin/bash
#find
find / -name $1 -print
echo "$2"
echo "$3"
echo "$#"
echo "$*"
echo "$$"
echo "$?"
 
[root@viong_app1 soft]# ./find.sh soft viong lin
/root/soft
/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/vgacon/soft
/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/soft
viong
lin
3
soft viong lin
11349
0
 
影响变量的命令
 
declare 
 
-设置或显示变量
-f 只显示函数名
-r 创建只读变量
-x 创建转出变量
-i 创建整数变量
使用+替代-,可以颠倒选项的含义,但是无法颠倒-r参数
可以通过export或者readonly查看获取 readonly一旦设置无法删除及更改
想删除只读变量,只有重启系统才能自动取消
 
export
 
-- 直接加实参
-f 表明在“名-值“对中的名字是函数名
-p 显示全局变量列表
-n 把全局变量转换成局部变量,换句话说,命令的变量不再传给shell
 
readonly  把变量设置为只读状态,一旦设置无法更改
set    设置或者重设变量的定义
unset 取消变量的定义,但不能取消shell环境中删除指定的变量和函数 PATH PS1
 
shift[n] 用于移动位置变量,调整位置变量,使$3的值赋予$2,$2的值赋予$1
 
[root@viong_app1 soft]# cat find.sh
#!/bin/bash
#find
find / -name $1 -print
echo "$2"
echo "$3"
ech0 "4"
echo "$#"
echo "$*"
echo "$$"
echo "$?"
shift
echo "$2" /显示相当于$3
echo "$3" /显示相当于$4
 
[root@viong_app1 soft]# ./find.sh soft viong lin lee
/root/soft
/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/vgacon/soft
/usr/src/kernels/2.6.18-194.el5-x86_64/include/config/soft
viong
lin
./find.sh: line 6: ech0: command not found
4
soft viong lin lee
11364
0
lin
lee
 
typeset 用于显示或者设置变量 与declare是同义词
 
引号
 
双引号 可引用除了字符$, ` (反引号), \ 外的任意字符或字符串
 
eg:
echo viong * 与echo “viong *”
[root@viong_app1 soft]# echo -e "viong5,$HOME '\n* lin`echo viong3`"
viong5,/root '
* linviong3
'\n 是单引号\n  因为符合比较小难辨别
\n 代表回车
 
单引号会将引号里的所有字符,包括引号都作为一个字符串,如前面加 –e 转移字符 后面\n会被定义为回车换行
eg:
[root@viong_app1 soft]# echo -e 'viong5,$HOME \n* lin`echo viong3`'
viong5,$HOME
* lin`echo viong3`
去掉\n前面单引号做演示
 
反引号用于设置系统命令的输出到变量,shell将反引号中的内容作为一个系统命令,并执行其内容
eg:
[root@viong_app1 soft]# echo $viong
123
[root@viong_app1 soft]# echo "lin`echo $viong`"
lin123
 
反斜杠  如果一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义
如特殊含义字符:& * + $ | ?
eg:
[root@viong_app1 ~]# echo *
anaconda-ks.cfg install.log install.log.syslog soft
[root@viong_app1 ~]# echo \*
*
运算符
 
运算符是对计算机发的指令
运算对象
-数字 字符
-变量
-表达式
 
位运算符
 
$[ ] 表达式的值
 
~ A   
反运算符 所有的二进制为1变0,0变1
eg:
[root@viong_app1 ~]# echo $[~4]
-5
 
4    100
所以~4 =011
 
-5 既然是负数,那么这个数一定是按有符号数的规则来表示的,一个二进制按位取反
并加一,就可得到它自己的负数的补码
~x+1=-x
所以我们把~5按位取反 -5= 010(~5 101取反010)+1 ->011即=~4
 
更简单就是 ~x=-x-1 规则去计算
位运算符大部分用在汇编语言中来表示内存中的存储逻辑位,很复杂
 
A<
 
A中的二进制位左移B位 ,忽略最左端移出的各位,最右端各位补上0,每做一次换位左移就有实现A乘以2^B
 eg:
010 左移三位 10000 =2^4
2<<3 相当于2x2x2x2=16
 
A>>B 右移运算符
 
A中的二进制位右移B位 ,忽略最右端移出的各位,最左端各位补上0,每做一次换位左移就有实现A除以2 ^B
eg:
10000 右移三位 100
16>>2 相当于 16/2/2=4
 
A&B 与比较运算符
 
 A与B对于位,对于每个二进制位来说,如果二者该位都是1,则结果位1,否则位为0
eg:
4 100
2 010
echo $[4&2] 则为0
echo $[2&2]  则为2
 
A^B 异或运算符
 
比较A 与B 的对应位,对于每个二进制位来说,如果二者该为互补,则结果为1,否则为0
eg:
4 100
2 010
echo $[4^2] 则为6
echo $[2^2] 则为0
 
|    或运算符
 
比较A与B的对应位,对于每个二进制位来说,如果二者该位有一个是1或者都是1,则结果为1,否则结果位为0
 
eg:
4 100
2 010
6 110
echo $[4|2] 则为6
echo $[2|6] 则为6
 
逻辑运算符
 
&&  与运算符
 
对于每个二进制位来说,如果二者该位都是1 ,则结果值为1 ,否则结果值为0
 
A     B     A&&B
0     0      0       
1     0      0
0     1      0
1     1      1
 
eg
4 100
2 010
echo $[4&&2]  则为0
echo $[2&&2]  则为1
 
|| 或运算符
 
对于每个二进制位来说,如果二者该位都是1,则 结果值为1,否则 结果值为0
 
A      B     A||B
0      0      0       
1      0      1
0      1      1
1      1      1
eg:
4 100
2 010
echo $[4||2] 则为1
echo $[0||0] 则为0
 
! 非运算符
 
关系(条件)运算符
 
<, <=, ==,!=, >, >=, ~(匹配正则表达式), !~(不匹配正则表达式)
 
赋值运算符
 
用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种
 
let count= $count + $change
let count+= $count
eg:
[root@viong_app1 ~]# viong=12
[root@viong_app1 ~]# echo viong
viong
[root@viong_app1 ~]# echo $viong
12
[root@viong_app1 ~]# let viong+=5    let是bash内置的整数运算
[root@viong_app1 ~]# echo $viong
17
[root@viong_app1 ~]# let viong-=5
[root@viong_app1 ~]# echo $viong
12
[root@viong_app1 ~]# let viong*=5
[root@viong_app1 ~]# echo $viong
60
 
表达式替换
 
$[ ] 和$[] 一样 ,所有shell的求值都是用整数完成
$[ ] 可以接受不同基数的数字
[base#n] n 表示基数从2到36的任何基数
 
运算符的优先级

shell学习笔记(二)shell变量与运算符_第1张图片