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种设置 ...
随机推荐
- 使用DOS工具修复数据库
当SQL Server 实例出现异常,无法远程链接时,数据库管理员需要登陆到SQL Server实例机器上,通过命令行工具,修复异常. 一,使用net命令行启动数据库 通过net start 命令启动 ...
- 苹果电脑获取Android Studio的发布版SHA1和开发版SHA1
最近开始转战安卓,准备把我在苹果上的应用也在安卓上来一波,其中就遇到一个问题就是最牛天气(iOS和微信小程序都已经有了,就差安卓的了)引用的百度的定位功能,需要填写发布版SHA1和开发版SHA1,作为 ...
- GitHub 新手教程 五,Git GUI 新手教程(2),Clone Existing Repository 克隆代码库
1,注意: 网上大部分教程都是从“Create New Repository”讲起,这其实给我们新手埋了很大的一个坑.按照类似的教程,仅做到一半,各种错误窗口就会弹出来了,像什么:“非同一代码库”.“ ...
- 初学Direct X(7) ——位图的旋转,缩放以及平移
初学Direct X(7) --位图的旋转,缩放以及平移 本文旨在实现通过D3DXMatrixTransformation2D函数实现位图的旋转,缩放以及平移操作,但是具体的原理部分会在后面进一步的探 ...
- iOS开发面试题整理
前言 本文借鉴整理了iOS高级开发常见的面试题,并且分博客一一分析,希望能和大家一起进步学习. 欢迎大家关注我的 Github
- [SHELL]输入输出重定向与管道
一 . 输出重定向(将命令的输出重定向到文件): ls -al > test 以覆盖的方式写入 ls -al >> test 以追加的方式写入 二 . 输入重定向(将文件的内容重定向 ...
- 关于sql server2008数据库的连接的几个问题及解决办法
写在开头 不得不说给一台新的服务器配置和部署的确是个不小的工程,在这里先感谢我们的DEV焉域政同学在这方面做出的一些贡献:把安装过程极为困难的sql server2008成功安装到服务器上,并且为我们 ...
- DeepID1,DeepID2
1.DeepID1 (Deep Learning Face Representation from Predicting 10,000 Classes) Step1:构建网络框架 DeepConvNe ...
- beta2
组员1:吴晓晖(组长) 过去两天完成了哪些任务 代码重构基本完成 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员2:陈锦谋 过去两天完成了哪些任务 重新制作图标 ...
- [转贴]CentOS7.5 Kubernetes V1.13(最新版)二进制部署集群
CentOS7.5 Kubernetes V1.13(最新版)二进制部署集群 http://blog.51cto.com/10880347/2326146 一.概述 kubernetes 1.13 ...