摘自: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变量的核心基础知识和实践的更多相关文章

  1. 第二阶段:高级核心基础知识·第4章shell特性·2

    1.统计日志,日志内容 39.96.187.239 - - [11/Nov/2019:10:08:01 +0800] "GET / HTTP/1.1" 302 0 "-& ...

  2. Java核心基础知识(一):概念、语法、使用、源码

    1. Java中OOP的特点? OOP(Object Oriented Programming):面向对象编程.具有封装.继承.多态三大特征. 封装:解决数据安全性问题: 继承:解决代码的重用性问题: ...

  3. JavaScript中函数函数的定义与变量的声明<基础知识一>

    1.JavaScript中函数的三种构造方式 a.function createFun(){ } b.var createFun=function (){ } c.var createFun=new ...

  4. 第11天:JS中变量、字符串基础知识

    一.js简介用来制作页面交互效果,提高用户体验. js页面效果:轮播图.选项卡.地图.表单验证javascript是弱变量类型的语言,变量只需要用var来声明.而java要根据变 量类型来声明, in ...

  5. 批处理命令中set定义的两种变量介绍 计算机基础知识

    摘自: http://www.amhl.net/wenzhang/DianNaoChangShi/20101201/127422.html 所谓的自定义变量,就是由我们来给它赋予值的变量. ①赋值变量 ...

  6. 运维核心基础知识之——MD5sum校验文件

    如何使用MD5sum工具校验你的文件. 演示过程截图: 先给文件创建一个md5值 md5sum oldboy.txt 然后将md5sum生成的md5值写入到一个文件police.log md5sum ...

  7. 前端进阶笔记之核心基础知识---那些HTML标签你熟悉吗?

    目录 1.交互实现 1.1 meta标签:自动刷新/跳转 1.2 title标签:消息提醒 2.性能优化 2.1 script标签:调整加载顺序提升渲染速度 2.2 link标签:通过预处理提升渲染速 ...

  8. 第二阶段:高级核心基础知识·第1章Linux三剑客·1

    1.用vmware添加一块10G的硬盘,且永久挂载到/data01中,写出详细的步骤 2.用自己语言描述raid0和raid1的区别 RAID 0: 将两个或以上相同信号,容量的硬盘组合,磁盘阵列的总 ...

  9. Jmeter博文索引~基础知识和实践操作汇总

    所有Jmeter笔记的目录/索引 一,基础操作和常用操作 Jmeter入门(一)理论基础 Jmeter安装及配置(含JDK安装) Jmeter之设置线程组运行次数/时间 Jmeter之参数化(4种设置 ...

随机推荐

  1. RabbitMq基础教程之基本概念

    RabbitMq基础教程之基本概念 RabbitMQ是一个消息队列,和Kafka以及阿里的ActiveMQ从属性来讲,干的都是一回事.消息队列的主要目的实现消息的生产者和消费者之间的解耦,支持多应用之 ...

  2. Laya鼠标事件阅读

    点击事件核心类:MouseManager和TouchManager. MouseManager负责收集相关事件,进行捕获阶段和目标阶段. TouchManger负责处理和分发事件,进行冒泡阶段. 捕获 ...

  3. Appium+Python3+ Android入门

    前言: Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用. 一.环境配置 1.安装Node.js https://nodejs.o ...

  4. MySQL数据库--外键约束及外键使用

    什么是主键.外键关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯 ...

  5. 三种迭代Java ArrayList方法及比较

    闲来无事,研究一下Java Collection,首先是ArrayList. 通过三种方式遍历了长度为100000的ArrayList. import java.util.*; public clas ...

  6. PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历

    题目就是给出一棵二叉搜索树,已知根节点为0,并且给出一个序列要插入到这课二叉树中,求这棵二叉树层次遍历后的序列. 用结构体建立节点,val表示该节点存储的值,left指向左孩子,right指向右孩子. ...

  7. 《Linux内核设计与实现》第五章读书笔记

    第五章  系统调用 5.1与内核通信 1. 系统调用 让应用程序受限的访问硬件设备 提供创建新进程并与已有进程通信的机制 提供申请操作系统其他资源能力是用户空间进程和硬件设备之间的中间层 2. 系统调 ...

  8. linux内核分析第四周学习笔记

    linux内核分析第四周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  9. NPM和Yarn添加淘宝镜像

    NPM设置淘宝镜像 1.查询当前配置的镜像 npm get registry > https://registry.npmjs.org/ 设置成淘宝镜像 npm config set regis ...

  10. VSCode和VUE的初始安装及简单使用入门

    (版本1.0) npm run dev 运行工程 PS F:\SDN\VIMS--前端\vue> cnpm install PS F:\SDN\VIMS--前端\vue> cnpm reb ...