设为首页 收藏本站
查看: 1037|回复: 0

第六章 shell学习之变量和引用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-8-15 08:57:22 | 显示全部楼层 |阅读模式
变量
本地变量:类似于局部变量,只在当前shell进程有效
环境变量:适用于所有登录进程所产生的子进程
位置参数:用于向shell脚本传递参数,只读
变量替换和赋值
引用变量值就称为变量替换,$就为变量替换符号,如a为变量名则$a或${a}为变量值
将值赋给某个变量名就称为变量赋值,格式:variable=value或${ variable=value },如值中包含空格则必须用""
清除变量的值:
unset 变量名
设置只读变量:
variable=value
readonly variable
还可以用declare和typeset实现
查看系统中的所有只读变量:
[iyunv@localhost tmp]# readonly
declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -ir EUID="0"
...
变量赋值的模式
1.variable:?value或variable?value
对未赋值的variable显示系统错误
[iyunv@localhost tmp]# echo ${a:?blue}
bash: a: blue
[iyunv@localhost tmp]# a=black
[iyunv@localhost tmp]# echo ${a:?blue}
black
2.variable:=value
对未赋值的variable,将value值赋给它
[iyunv@localhost tmp]# a=black
[iyunv@localhost tmp]# echo ${a:=blue}
black
[iyunv@localhost tmp]# unset a
[iyunv@localhost tmp]# echo ${a:=blue}
blue
[iyunv@localhost tmp]# echo $a
blue
3.variable:-value
对未赋值的variable,返回value,但是variable仍未赋值
[iyunv@localhost tmp]# unset a
[iyunv@localhost tmp]# echo ${a:-blue}
blue
[iyunv@localhost tmp]# echo ${a:?blue}
bash: a: blue
无类型的shell脚本变量
shell脚本变量是无类型的,并且同时具有数字型和字符型两种赋值,可以不用预定义变量而直接使用,数字型的初始值为0,字符型的初始值为空
[iyunv@localhost tmp]# cat a.sh
#! /bin/sh
c=""
echo "c=$c"
let "c+=1"    #let命令用于执行算数运算,let "c+=1"等价于c+=1
echo "c=$c"
echo "e=$e"
let "e+=1"
echo "e=$e"
e="hello"          #此时该变量的数字值又变为0
echo "e=$e"
let "e+=2"
echo "e=$e"
[iyunv@localhost tmp]# ./a.sh
c=
c=1
e=
e=1
e=hello
e=2
环境变量
父进程的环境变量可以传递给子进程,但是子进程的环境变量(或者修改了父进程定义的环境变量)传递不了也影响不了父进程
定义环境变量:
ENVIRON-VARIABLE=value
export ENVIRON-VARIABLE
习惯环境变量用大写
export表明此变量为环境变量
清除环境变量:
unset ENVIRON-VARIABLE
重要的环境变量:
1.PWD和OLDPWD
PWD记录当前目录,OLDPWD记录旧的工作目录
[iyunv@localhost tmp]# echo $PWD
/tmp
[iyunv@localhost tmp]# cd
[iyunv@localhost ~]# echo $PWD
/root
[iyunv@localhost ~]# echo $OLDPWD
/tmp
2.PATH
shell为每个输入命令搜索PATH中的目录列表
[iyunv@localhost ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
[iyunv@localhost ~]# export PATH=$PATH:/tmp/bin      #添加新路径
[iyunv@localhost ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/tmp/bin
3.HOME
用户家目录的路径
[iyunv@localhost ~]# echo $HOME
/root
4.SHELL
保存默认的shell值(/bin/bash)
5.USER和UID
已登录用户的名字和已登录用户的ID
[iyunv@localhost ~]# echo $USER $UID
root 0
6.PPID和$
$PPID当前进程的父进程号,$$为当前进程的进程号
7.PS1和PS2
分别为开头的提示符和分行的提示符(即命令分多行输入时的提示符)
[iyunv@localhost ~]# echo $PS1
[\u@\h \W]\$
[iyunv@localhost ~]# echo $PS2
>
\u代表当前用户名
\h代表主机名
\H代表主机名和域名
\W代表当前工作目录的名字
\w代表当前工作目录的完整路径
\$ UID为0则显示#,否则打印$
8.IFS
指定shell的输入域分隔符,默认为空格
[iyunv@localhost ~]# export IFS=" "
[iyunv@localhost ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/tmp/bin
[iyunv@localhost ~]# export IFS=:
[iyunv@localhost ~]# echo $PATH
/usr/kerberos/sbin /usr/kerberos/bin /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin /usr/X11R6/bin /root/bin /tmp/bin
环境变量配置文件
在用户的根目录中,为隐藏文件
1.  .bash_profile
用户登录时自动执行,初始化环境变量,如果不存在该文件则执行/etc/profile
可以自己加入新的环境变量,并且执行. .bash_profile或者source .bash_profile立即生效(注销也可以)
source命令等价于.命令
直接执行文件是启动一个子shell,而子shell脚本设置的环境变量无法影响当前shell脚本,soure命令(或.命令)让简本在当前shell执行
[iyunv@localhost ~]# cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
2.  .bashrc
设置子shell的环境变量,使得用户登录时的环境变量设置与子shell的环境变量设置相分离,提高灵活性
3.   .bash_logout
在用户注销时执行,可以写入清楚某些环境变量的命令,也可以不存在
export PATH
unset USERNAME
父进程,子进程环境变量关系
子进程能继承父进程的环境变量,但是子进程修改父进程的环境变量只对子进程有效,不影响父进程环境变量,子进程创建的环境变量父进程也接收不到,而本地变量则互不影响
例:
[iyunv@localhost tmp]# cat father.sh
#! /bin/bash
fatherLocal="fatherLocal"
fatherEnviron="fatherEnviron"
export fatherEnviron
echo "in fahter.sh"
echo "father process ID is $$"
echo "fatherLocal is $fatherLocal"
echo "fatherEnviron is $fatherEnviron"
$PWD/child.sh
echo "return to father.sh"
echo "fatherLocal is $fatherLocal"
echo "fatherEnviron is $fatherEnviron"
[iyunv@localhost tmp]# cat child.sh
#! /bin/bash
echo "in child.sh"
echo "child process ID is $$ and my father is $PPID"
echo "fatherLocal is $fatherLocal"
echo "fatherEnviron is $fatherEnviron"
echo "change faterEnviron"
export "fatherEnviron=redefinfatherEnviron"
echo "new fatherEnviron is $fatherEnviron"
结果:
[iyunv@localhost tmp]# ./father.sh
in fahter.sh
father process ID is 29171
fatherLocal is fatherLocal
fatherEnviron is fatherEnviron
in child.sh
child process ID is 29172 and my father is 29171
fatherLocal is
fatherEnviron is fatherEnviron
change faterEnviron
new fatherEnviron is redefinfatherEnviron
return to father.sh
fatherLocal is fatherLocal
fatherEnviron is fatherEnviron
位置参数
$0 脚本名称
$1 第一个参数
${10} 第十个参数,从10开始要加{}
$# 参数个数
$*或$@ 所有参数,不包括$0
$$ 进程号
$PPID 父进程号
$? 退出状态,0表示没有错误,非0表示有错误
引用
引用是屏蔽特殊字符的特殊意义,而将其解释为字面意义
"" 引用除了美元符号($),反引号(``),反斜杠(\)之外的所有字符
'' 引用除了''本身的所有字符
`` 反引号,shell将反引号中的内容解释为系统命令
\ 反斜杠,屏蔽下一个字符的特殊含义
对于变量加双引号可以保留多个空格(还有换行),而不解释为字段的分隔符(IFS默认为空),即双引号有防止变量变分隔符的作用
例:
[iyunv@localhost tmp]# a="a       b       c"
[iyunv@localhost tmp]# echo $a
a b c
[iyunv@localhost tmp]# echo "$a"
a       b       c
[iyunv@localhost tmp]# echo '$a'
$a
[iyunv@localhost tmp]# echo 'why can't I'm you are'
why cant Im you are
[iyunv@localhost tmp]# echo "why can't I'm you are"
why can't I'm you are
命令替换
将命令执行的标准输出替换该命令所在的位置
反引号(``)和$()
$()命令可以嵌套
$()将\就是\,而反引号(``)将\解释为空格
利用反引号可以将其它语言执行的结果赋值给shell变量,从而用shell处理
例:
[iyunv@localhost tmp]# echo \\
\
[iyunv@localhost tmp]# echo $(echo \\)
\
[iyunv@localhost tmp]# echo `echo \\`
#空白行
command `echo`   #command代表任何命令,这里相当于不带参数
command "`echo`"  #带空字符串参数
command `echo x y`  #带两个参数,为x和y
command "`echo x y`"   #带一个参数,为x y
转义
作用:
1.解除一些特殊字符的含义
2.单个\在命令行中为出现二级提示符,在shell脚本中同样适用
3.在echo、sed、awk等命令中让一些字母能够表达特殊含义
1.
variable="()\\{}\$\""
echo $variable
echo "$variable"
IFS='\'                        #改变输入变量分隔符
echo $variable
echo "$variable"        #双引号有防止变量变分隔符的作用,保留变量分隔符
[iyunv@localhost tmp]# ./a3.sh
()\{}$"
()\{}$"
() {}$"
()\{}$"
2.
2.1
[iyunv@localhost tmp]# echo \
> hello world
hello world
2.2
[iyunv@localhost tmp]# echo \     #echo可以用""也可以不用
> "hello world"
hello world
2.3
[iyunv@localhost tmp]# echo "\"   #注意这和前面两个存在本质的区别,这里的\转义了"导致缺少后",补全命令才结束,和2.4同
> hello world"
"
hello world
2.4
[iyunv@localhost tmp]# echo "
> hello
> world"
hello
world
2.5
[iyunv@localhost tmp]# variable=\
> hello world
bash: world: command not found         #变量赋值如果有空格必须用引号
2.6
[iyunv@localhost tmp]# variable=\
> "hello world"
[iyunv@localhost tmp]# echo $variable
hello world
2.7
[iyunv@localhost tmp]# cat a5.sh
#! /bin/bash
echo \                                                   #单个/在shell脚本中同样适用
hello world
[iyunv@localhost tmp]# ./a5.sh
hello world
3.
\后跟字母的特殊含义:
\n 新的一行
\r 返回
\t tab键
\v或\f 换行但光标忍停留在原来的位置(横坐标相同)
\b 退格键
\a 发出警报声
\0xx ASCII码0xx对应的字符
例:
[iyunv@localhost tmp]# echo hello\b\101
hellob101
[iyunv@localhost tmp]# echo $'hello\b\101'        #和-e ""基本等价
hellA
[iyunv@localhost tmp]# echo -e "hello\b\0101"    #注意\0101的0,没有0不能解析成ASCII码
hellA
[iyunv@localhost tmp]# echo -e "hello\b\101"
hell\101
[iyunv@localhost tmp]# echo -e hello\b\101        #注意-e没有""同样不能解析
hellob101
注意:
echo [选项] [字符串]
选项-e表示将转移符(\)后跟字符形成的特殊字符解释成特殊意义
选项-n表示输出文字后不换行:
[iyunv@localhost tmp]# echo -n "hello"
hello[iyunv@localhost tmp]#



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-23875-1-1.html 上篇帖子: 第五章 shell学习之文件的排序、合并和分割 下篇帖子: 第七章 shell学习之退出、测试、判断及操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表