SHELL (2) —— Shell变量的核心基础知识和实践
摘自:Oldboy Linux运维——SHELL编程实战
Shell变量:用一个固定的字符串(也可能是字符、数字等的组合)代替更多、更复杂的内容,该内容里可能还会包含变量、路径、字符串等其它的内容。
变量是暂时存储数据的地方及数据标记,所存储的数据存在于内存空间中,通过正确的调用内存空间中变量的名字就可以取出与变量对应的数据。
变量的内容一般要加双引号,以防止出错,特别是当值里的内容之间有空格时。
变量类型可分为两类:环境变量和普通变量。
环境变量也可称为全局变量,可以在创建它们的Shell及其派生出来的任意子进程Shell中使用,环境变量又可分为自定义环境变量和bash内置的环境变量。
普通变量也可称为局部变量,只能在创建它们的Shell函数或Shell脚本中使用。普通变量一般由开发者在开发脚本程序时创建。
环境变量
环境变量一般是指用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行。S和力量通过环境变量来确定登录用户名、命令路径、终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、Shell脚本和各类应用。
按照系统规范,所有环境变量的名字均采用大写形式。正确的环境变量定义方法为export OLDGIRL=1。
通常环境变量被定义并保存在用户家目录下的.bash_profile文件或全局的配置文件/etc/profile中。
在查看设置的变量时,有3个命令可以显示变量的值:set、env和declare(替代早期的typeset)。set命令输出所有的变量,包括全局变量和局部变量;env命令只显示全局变量;declare命令输出所有的变量、函数、整数和已经导出的变量。set -o命令显示bash Shell的所有参数配置信息。
如果想要设置环境变量,就要在给变量赋值之后或在设置变量时使用export命令,带-x选项的declare内置命令同样可以。格式如下:
export 变量名=value
变量名=value ; export 变量名
declare -x 变量名=value
对于用户的环境变量设置,比较常见的是用户家目录下的.bashrc和.bash_profile。
常用的全局环境变量的配置文件如下:
/etc/profile
/etc/bashrc
/etc/profile.d/
若要在登录后初始化或显示加载内容,则把脚本文件放在/etc/profile.d/下即可(无须加执行权限)。
设置登录提示的两种方式:
1. 在/etc/motd里增加提示的字符串,如下:
cat /etc/motd
Welcome to Vurtne.Lu Linux Shell training.
2. 在/etc/profile.d/下面增加如下脚本:
cat /etc/profile.d/Vurtne_Lu.sh
echo "Welcome to Vurtne.Lu Linux Shell training."
登录后显示的内容如下:
Welcome to Vurtne.Lu Linux Shell training.
书写crond定时任务时要注意,脚本要用到的环境变量最好先在所执行的Shell脚本中重新定义。
unset可以消除本地变量和环境变量。
登录shell:需要用户名、密码登录后才能进入的shell
非登录shell:不需要输入用户名和密码即可打开的Shell
执行exit命令,退出一个shell(登录或非登录shell);
执行logout命令,退出登录shell(不能退出非登录shell)。
登入shell加载启动脚本的顺序为:
/etc/profile → /etc/profile.d/ → .bash_profile → .bashrc → /etc/bashrc
非登入shell加载启动脚本的顺序:
.bashrc → /etc/bashrc → /etc/profile.d
普通变量
为普通变量的定义赋值,一般有以下3种写法:
变量名=value
变量名='value'
变量名="value"
变量名一般是由字母、数字、下划线组成的,可以以字母或下划线开头。
当变量后面连接有其它字符的时候,必须给变量加上大括号{},例如:$dbname_tname改成${dbname}_tname
变量定义的基本技巧总结:
① a=1+$a #输出为a=1+1
不加引号时,值里有变量的会被解析后再输出
② b='1+$a' #输出为b=1+$a
输出变量内容时单引号里是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。
③ c="1+$a" #输出为c=1+1+1
输出变量内容时引号里的变量及命令会经过解析后再输出内容,而不是把双引号中的变量名及命令(命令需要反引起来)原样输出。
数字内容的变量定义可以不加引号,其他没有特别要求的字符串等定义最好都加上双引号,如果真的需要原样输出就加单引号,定义变量加双引号是最常见的使用场景。
把一个命令的结果作为变量的内容赋值的方法:
变量名=`ls`
变量名=$(ls)
tar zcf etc_`date +%F`.tar.gz /etc #将时间作为压缩包名打包
tar zcf $(uname -n).tar.gz /etc/services #将主机名作为压缩包名打包文件
以下是单引号、双引号与不加引号的范例:
[root@yeebian ~]# echo 'today is date'
today is date
[root@yeebian ~]# echo 'today is `date`'
today is `date`
[root@yeebian ~]# echo "today is date"
today is date
[root@yeebian ~]# echo "today is `date`"
today is Wed May 24 10:20:54 EDT 2017
[root@yeebian ~]# echo "today is $(date)"
today is Wed May 24 10:21:11 EDT 2017
[root@yeebian ~]# echo today is $(date)
today is Wed May 24 10:21:20 EDT 2017
下面是awk调用Shell中的变量:
[root@yeebian ~]# ETT=123
[root@yeebian ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@yeebian ~]# awk 'BEGIN {print $ETT}' [root@yeebian ~]# awk 'BEGIN {print '$ETT'}'
123
[root@yeebian ~]# awk 'BEGIN {print "'$ETT'"}'
123
[root@yeebian ~]# ETT='test'
[root@yeebian ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@yeebian ~]# awk 'BEGIN {print $ETT}' [root@yeebian ~]# awk 'BEGIN {print '$ETT'}' [root@yeebian ~]# awk 'BEGIN {print "'$ETT'"}'
test
[root@yeebian ~]# ETT="ting"
[root@yeebian ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@yeebian ~]# awk 'BEGIN {print $ETT}' [root@yeebian ~]# awk 'BEGIN {print '$ETT'}' [root@yeebian ~]# awk 'BEGIN {print "'$ETT'"}'
ting
[root@yeebian ~]# ETT=`pwd`
[root@yeebian ~]# echo $ETT
/root
[root@yeebian ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@yeebian ~]# awk 'BEGIN {print $ETT}' [root@yeebian ~]# awk 'BEGIN {print '$ETT'}'
awk: BEGIN {print /root}
awk: ^ unterminated regexp
awk: cmd. line:1: BEGIN {print /root}
awk: cmd. line:1: ^ unexpected newline or end of string
[root@yeebian ~]# awk 'BEGIN {print "'$ETT'"}'
/root
通过上述几个例子显示:不管变量如何定义、赋值,除了家单引号以外,利用awk直接获取变量的输出,结果都是一样的,因此,在awk取用Shell变量时,我们更多得还是喜欢先用echo加符号输出变量,然后通过管道给awk,进而控制变量的输出结果。
[root@yeebian ~]# ETT="vurtne"
[root@yeebian ~]# echo "$ETT" | awk '{print $0}'
vurtne
[root@yeebian ~]# echo '$ETT' | awk '{print $0}'
$ETT
[root@yeebian ~]# echo $ETT | awk '{print $0}'
vurtne
[root@yeebian ~]# ETT=`pwd`
[root@yeebian ~]# echo "$ETT" | awk '{print $0}'
/root
[root@yeebian ~]# echo '$ETT' | awk '{print $0}'
$ETT
[root@yeebian ~]# echo $ETT | awk '{print $0}'
/root
三剑客grep、sed和awk:grep和sed都符合前面引号总结的规律,唯有awk比较特殊。
关于自定义变量字符串变量的建议:
1)内容是纯数字、简单的连续字符(内容中不带任何空格)时,定义时可以不加任何引号;
2)没有特殊情况时,字符串一律用双引号定义赋值,特别是多个字符串中间有空格时;
3)当变量里的内容需要原样输出时,需要用单引号(''),这样的需求极少。
SHELL (2) —— Shell变量的核心基础知识和实践的更多相关文章
- 第二阶段:高级核心基础知识·第4章shell特性·2
1.统计日志,日志内容 39.96.187.239 - - [11/Nov/2019:10:08:01 +0800] "GET / HTTP/1.1" 302 0 "-& ...
- Java核心基础知识(一):概念、语法、使用、源码
1. Java中OOP的特点? OOP(Object Oriented Programming):面向对象编程.具有封装.继承.多态三大特征. 封装:解决数据安全性问题: 继承:解决代码的重用性问题: ...
- JavaScript中函数函数的定义与变量的声明<基础知识一>
1.JavaScript中函数的三种构造方式 a.function createFun(){ } b.var createFun=function (){ } c.var createFun=new ...
- 第11天:JS中变量、字符串基础知识
一.js简介用来制作页面交互效果,提高用户体验. js页面效果:轮播图.选项卡.地图.表单验证javascript是弱变量类型的语言,变量只需要用var来声明.而java要根据变 量类型来声明, in ...
- 批处理命令中set定义的两种变量介绍 计算机基础知识
摘自: http://www.amhl.net/wenzhang/DianNaoChangShi/20101201/127422.html 所谓的自定义变量,就是由我们来给它赋予值的变量. ①赋值变量 ...
- 运维核心基础知识之——MD5sum校验文件
如何使用MD5sum工具校验你的文件. 演示过程截图: 先给文件创建一个md5值 md5sum oldboy.txt 然后将md5sum生成的md5值写入到一个文件police.log md5sum ...
- 前端进阶笔记之核心基础知识---那些HTML标签你熟悉吗?
目录 1.交互实现 1.1 meta标签:自动刷新/跳转 1.2 title标签:消息提醒 2.性能优化 2.1 script标签:调整加载顺序提升渲染速度 2.2 link标签:通过预处理提升渲染速 ...
- 第二阶段:高级核心基础知识·第1章Linux三剑客·1
1.用vmware添加一块10G的硬盘,且永久挂载到/data01中,写出详细的步骤 2.用自己语言描述raid0和raid1的区别 RAID 0: 将两个或以上相同信号,容量的硬盘组合,磁盘阵列的总 ...
- Jmeter博文索引~基础知识和实践操作汇总
所有Jmeter笔记的目录/索引 一,基础操作和常用操作 Jmeter入门(一)理论基础 Jmeter安装及配置(含JDK安装) Jmeter之设置线程组运行次数/时间 Jmeter之参数化(4种设置 ...
随机推荐
- stl源码剖析 详细学习笔记priority_queue slist
// // priority_queue.cpp // 笔记 // // Created by fam on 15/3/16. // // //------------------------- ...
- UE4官方行为树快速入门文档解析和修改
近学习了UE4官方文档的行为树快速入门指南,发现里面的部分逻辑稍稍有点混乱和重叠,于是加入了自己的想法,修改了部分行为树逻辑,优化了其AI寻路能力. 初始的基本操作和资源创建同官方文档一样:1个Fol ...
- web前端开发分享-css,js入门篇
学习没有捷径,但学习是有技巧与方法. 一,css入门篇: 推荐书籍:css哪些事儿,精通css. 理由:css那些事儿,他是一本介绍css基础类的书,是入门的经典读物. 系统的介绍了css的选 ...
- dokuwiki工具栏添加换行回车快捷键与按钮
需求 dokuwiki的语法要求以 \\ 为换行符(\\后面必须有1个空格).编辑器有快捷键.快捷键说明如下.https://www.dokuwiki.org/start?id=zh-tw:acces ...
- centos crontab 计划任务 设置与查看
centos 上 crontab 计划任务 ,这个版本解释的比较清晰 林涛 发表于:2017-4-27 11:11 分类:26点 标签:crontab,Linux,计划任务 36次 这个版本的cron ...
- Final发布 视频展示
1.视频链接 视频地址:http://v.youku.com/v_show/id_XMzk1OTYyNjE0NA==.html?spm=a2hzp.8244740.0.0 杨老师粉丝群——弹球学成语项 ...
- Alpha 答辩总结
前言 作业发布 组长 成员 贡献比例 ★ 530 雨勤 23% 311 旭 23% 403 俊 18% 223 元 23% 437 海辉 13% 10天 Alpha 冲刺站立会议博客链接汇总 Alph ...
- Ns3 构建哑铃型拓扑,并实现两个点的TCP连接(详细请戳全文)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaUAAADlCAIAAAB8n38hAAAV8UlEQVR4nO3dMWjjyBoH8CkNj1uc5v
- 读C#程序(第三周)
阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...
- Beta冲刺——day2
Beta冲刺--day2 作业链接 Beta冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602134 王龙 ...