第一节:变量 大纲: 2.1.1 本地变量 2.1.2 环境变量 2.1.3 变量替换 2.1.4 位置变量 2.1.5 标准shell变量 2.1.6 特殊变量 2.1.7 影响变量的命令 2.1.8 引号 2.1.9 运算符 2.1.10 表达式替换 2.1.11 运算符的优先级 在进行讲解前,我们要知道什么是shell变量? 其实linux下面的变量,linx下的shell变量和其它高级语言中的定义是一样的,都是放在内存中一定的存储单元,而这个存储单元里面存放这个变量的值,而这个值是可以改变的,我们就称它为变量. 2.1.1 本地变量 定义:是在用户现在的shell生命期的脚本中使用; 例:[redhat@server redhat]$name="Red Hat Linux" #把变量设置为Red Hat Linux [redhat@server redhat]$echo ${name} or #显示变量内容 =[redhat@server redhat]$echo $name #等同上面的语意 Red Hat Linux #显示其设定内容, [redhat@server redhat]$set | grep "name" #查看刚才所设定的内容,或不加'grep "name"'查看用户自己所有的本地变量, [redhat@server redhat]$readonly name #把name这个变量设置为只读变量,不允许再次设置,这可参考变量定义;-_-! [redhat@server redhat]$name="He SenLin" #重新赋值 bash:name:readonly variable #只读文件系统 [redhat@server redhat]$readonly #查看系统存在的只读文件 附:重新登录一下系统,再次用 [redhat@server redhat]$echo ${name} #本地变量就不存在了, 说明本地变量只能存活在用户shell的生命周期中,重登录就不在了, 2.1.2 环境变量 定义:环境变量用于所有用户进程<通称为子进程>,包括编辑器,脚本和应用,登录进程为父进程,shell中执行的用户进程均为子进程,不像本地变量只用于现在的shell. 存在目录在所有用户的主目录下<即/home>/.bash_profile或 如何设置环境变量?第一种方法就是编辑上面的二个文件,还可以用"export"进行设定或更改;这可不像本地变量只需 name="Red Hat Linux"那样简单,但却可以把本地变量更改为环境变量;只须在本地变量结束后,输入:export <变量名>;例,我们把name由本地变量修改为环境变量,我们可以这样做; [root@server root]#name="Red Hat Linux" #本地变量 [root@server root]#export name #变量name由本地升为环境 当然也可以用下面这种方法; [root@server root]#export name="Red Hat Linux" #直接定义name为环境变量; 定义后,可通过env进行查看,不知道上面的本地环境变量由哪个命令进行查看你记住了没有?,演示一下查看现在定义的环境变量; [root@server root]#env | grep "name" Red Hat Linux 同样不加后面grep "name",这个参数也是查看所有的环境变量;更同样的是我们也可以运行readonly这个参数给name以只读属性; Tips:环境变量就是全部包含在本地变量中<因为它即可运行中父进程中也可运行于子进程中>,注意一点,本地变量不能运行在全部进程中,只有环境变量可以,再不懂就联想一下人与自然吧;-_-!还是不会?用绝招: [root@server root]#you=myfriend #设置本地变量name为myfriend [root@server root]#echo ${you} #查看一下是否成功 myfriend #成功 [root@server root]#sh #更换shell环境等同重登录,这相当一个 sh-2.05b#echo $you #用户子进程 #没显示,说明不存在,真的不存在? sh-2.05b#exit #返回bash环境 [root@server root]#echo $you #再次查看; myfriend #又出来了,怎么回事? [root@server root]#export you #把变量you设为环境变量; [root@server root]#sh #再试一次; sh-2.05b#echo $you myfriend #ok,you see? 再不懂,,你就把我杀了吧,,什么,你不知道我住在哪?汗-_-! 再补充一点,就是在sh进程中设置环境变量是可以写回bash环境中,因为bash是父进程,只有老的才有小的,小的怎么才能有老的哩?<长大了就有老的喽,哦,也对!..乱语> 2.1.3 变量替换 定义:用变量的值替换它的名字. 查看方式:echo <通用本地,环境...> 可以用echo显示可以单个变量的取值; [root@server root]#str="this is example" #设置本地变量 [root@server root]#echo "can you see `echo $str`" #显示 cat you see this is example #替换就到这了,不明白明再来 变量替换续 除了上面的这个方式以外还有五种哦;别急,一个一个来;-_-!<先说好,偶不是皮条> 格式 定义 ${variable name} 显示实际值到variable name 1
${variable name :+value} 如果设置了variable name,就把value显示, 未设置则为空; 2 ${variable name:-value} 如果设置了variable name,就显示它,未设置就显示 value<仅显不存本地中>>; 3 ${variable name:?value} 未设置提示用户错误信息value; 4 ${variable name:=value} 如未设置就把value设置并显示<写入本地中>, 5 变量清除: unset <变量name> [root@server root]#echo $name #变量 name是否存在? Red Hat Linux #存在 [root@server root]#unset name #清除name变量 [root@server root]#echo $name #是否成功 #成功 注意:如果用readonly限制了只读属性就会失败,还有怎么从环境变量中去掉那个变量呢?还记的用哪个设定环境变量的吗?对.export,只须在它后面加"-n"参数即可 2.1.4 位置变量 定义:位置变量表示$0,$1,$2,....$9 $0 $1 $2 $3 $4 脚本名 A B C D 向脚本中使用位置参数; 向系统命令传递参数; 例:./test<在程序中进行替换> [root@server root]#vi /test #创建并编辑/test文件 #!/bin/bash #test echo "这是脚本的第一个名称: $0" echo "这是脚本的第二个位置参数: $1" echo "这是脚本的第三个位置参数: $2" echo "这是脚本的第四个位置参数: $3" echo "这是脚本的第五个位置参数: $4" [root@server root]#chmod u+x ./test #加执行权限; [root@server root]#./test A B C #加参数证验 echo "这是脚本的第一个名称: ./test echo "这是脚本的第二个位置参数: A echo "这是脚本的第三个位置参数: B echo "这是脚本的第四个位置参数: C echo "这是脚本的第五个位置参数: <向系统命令中传递位置参数> [root@server root]#vi test1.sh #新建一个脚本文件 #!/bin/bash #name:test1.sh #to call: test1.sh 755 #使用方式 find ~ -perm $1 -print $2 #系统命令 [root@server root]#chmod u+c test1.sh [root@server root]#./test1.sh 755 date #位置一为755,2位date /dev/ip /dev/iput . . . Fri May 13 2:31:54 CST 2006
2.1.5 标准变量: bash默认建立一些环境变量就是标准变量,可以通俗的说就是不是你加的而是装好机子带的那些环境变量, 可在/etc/profile中进行定义, 命令 意义 HOME 用户主目录 IFS 默认分隔符 MAIL 邮箱地址 MAILCHECK 邮箱检查间隔 PWD 用户当前工作目录 LOGNAME 当前用户登录名 2.1.6 特殊变量 命令 意义 $# 传递到脚本的参数列表 $? 前个命令执行情况,0成功,其它值失败 $$ 脚本运行的当前进程号 $! 运行脚本最后一个命令 $* 显示脚本全部参数 2.1.7 影响变量的命令 declare 设置或显示变量 -f 只显示函数名 -r 创建只读变量 -x 创建转出变量 -i 创建整数变量 使用"+"代替"-",可以颠倒选项的意思,-r除外, export 用于传递给子shell的变量 -- 表明选项结束,所有后续参数都是实参, -f 表明在"名-值"对中的名字是函数名, -n 把全局变量转换成局部变量,换句话就是不再传给shell -p 显示全局变量列表, shift 用于移动位置变量,调整位置变量,使$3的值赋给$2.$2的值赋予$1.
[root@server root]#vi /test #!/bin/bash #test echo "这是脚本的第一个名称: $0" echo "这是脚本的第二个位置参数: $1" echo "这是脚本的第三个位置参数: $2" echo "这是脚本的第四个位置参数: $3" echo "这是脚本的第五个位置参数: $4" shift echo "这是脚本的第二个位置参数: $1" echo "这是脚本的第三个位置参数: $2" [root@server root]#chmod u+x ./test [root@server root]#./test A B C echo "这是脚本的第一个名称: ./test echo "这是脚本的第二个位置参数: A echo "这是脚本的第三个位置参数: B echo "这是脚本的第四个位置参数: C echo "这是脚本的第五个位置参数: $4" shit #显示的时候并没有,加在此只会明了 echo "这是脚本的第二个位置参数: B echo "这是脚本的第三个位置参数: C 给shfit加一个数试一下: [root@server root]#vi ./test #!/bin/bash #test echo "这是脚本的第一个名称: $0" echo "这是脚本的第二个位置参数: $1" echo "这是脚本的第三个位置参数: $2" echo "这是脚本的第四个位置参数: $3" echo "这是脚本的第五个位置参数: $4" shift 2 echo "这是脚本的第二个位置参数: $1" echo "这是脚本的第三个位置参数: $2" [root@server root]#./test A B C D echo "这是脚本的第一个名称: ./test echo "这是脚本的第二个位置参数: A echo "这是脚本的第三个位置参数: B echo "这是脚本的第四个位置参数: C echo "这是脚本的第五个位置参数: D shit 2 #显示的时候并没有,加在此只会明了 echo "这是脚本的第二个位置参数: C echo "这是脚本的第三个位置参数: D
第二节 引号 2.1 引号的必要性 2.2 双引号有什么作用 2.3 单引号的作用 2.4 反引号的作用 2.5 反斜杠的作用 2.1 引号的必要性? 变量和替换操作,在脚本中执行变量替换时最容易犯的一个错误就是引用错误,为什么会出现这样的错误呢,这就是因为对上面这些号,杠运用的错误?你想不错吗?那就follow me吧! 2.2 这章节我不多讲,只给一个例子,不懂可以联系我:hesenlin521@163.com 以下引用"网中人<大侠>"的一篇例子; # TOPIC='Q & A' # 用單引號保留特殊符號和空白
# Q1=What\'s\ your\ \"topic\"\?
# echo $Q1 What's your "topic"?
# 用 \ 將特殊符號(含引號)和空白跳脫出來
#
# 跳脫後﹐特殊符號和空白都保留下來。
# ANS="It is $TOPIC."
# echo $ANS It is Q & A.
# 用雙引號保留變數值($)
#
# 用雙引號﹐顯示出變數值。
# WRONG_ANS='It is "$TOPIC".'
# echo $WRONG_ANS It is "$TOPIC".
# 用單引號保留特殊符號和空白(同第一行)
# # 用單引號﹐全部保留﹔同時﹕
# $ 也當成一般符號保留﹐而非變數值。
# ALT_ANS='the $TOPIC'\ is\ "'$TOPIC'"\.
# echo $ALT_ANS The $TOPIC is 'Q & A'.
# 同時混合單引號﹑雙引號﹑和跳脫字符 \
#
# 單引號保留全部﹔雙引號保留變數值﹔ # \ 將特殊符號跳脫出來。
在此,我讲解一下各个引号的作用吧;双引主要是转意$,\,``<反引号>三个特殊字符的意义,其它的全部当普通字符进行显示, 单引号,是很冷酷的那种,就是把所有的字符都当一个普通字符来显示, [redhat@server redhat]$echo '$PWD,\n is your \n work directory' $PWD,\n is your \n work directory 那个杠就是屏蔽特殊字符的特殊含义,例 [redhat@server redhat]$echo * myfiel bash tehce desktop .... [redhat@server redhat]$echo \* * ok,,就讲这么多了, 第三节 运算符 顾名思义就是告诉计算机哪些数值应该用哪种运算符进行运算,+,-,*,\,通过表达式对变量,数字,字符用的运算的符号就叫运算符; 通常表达式:是运算符和数字,变量,字符对象的集合体; 3.1 运算符类型; 按位运算符;在其它语言中经常见到哦, ~,<<,>>,|,^ $[]表示形式告诉shell求中括号中的表达式的值; $[ 2+8 ] 运算符 说明 ~var 反运算符,把var中所有的二进制为1的变为0,为0的变为1 var< 出的各位,最右端的各位上补上0值,每做一次按位左移就有实 var乘2; var>>str 右移运算符,把var中所有的二进制位向右移动str位,忽略最右 移出的各位,最左的各位上补0,每次做一次右移就有实现var除以2, var&str 与比较运算符,var和str对应位,对于每个二进制来 说,如果二都为1,结果为1.否则为0; var^str 异域运算符,比较var和str对应位,对于二进制来说 如果二者互补,结果为1,否则为0; var | str 或运算符,比较var和str的对应位,对于每个二进制来 说,如二都该位有一个1或都是1,结果为1,否则为0; 逻辑运算符 && 1 1才为1 || 有一个1即为1 赋值运算符.+=,==,^=.|= let count =$count +=$change 第三节.表达式替换 也就是刚才用的$[]等同于$(()) 运算符的优先级 级别 运算符 说明 1 =,+=,-=,/=, %=,*=,&=,^=, 赋值运算符 |=,<<=,>>== 2 || 逻辑或 3 && 逻辑与 4 | 按位或 5 ^ 按异位与 6 & 按位与 7 ==,!= 等于/不等于 8 <=,>=,<,> 大于或等于/小于或等于/大于/小于 9 <<,>> 按位左移/按位右移 10 +,- 加减 11 *,/,% 乘,除,取模 12 ! ,~ 逻辑非,按位取反或补码 13 -,+ 正负
| | |