摘自: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. Zabbix使用总结

    1. CentOS 7上启动zabbix-server失败,/var/log/messages中的报错信息如下: Feb :: mysql-server1 systemd: Starting Zabb ...

  2. Js_checkbox的互斥

    function ck_click(obj) { var ck_20 = document.getElementById("ck_20"); var ck_25 = documen ...

  3. 谷歌算法研究员:我为什么钟爱PyTorch?

    老铁们好!我是一名前谷歌的算法研究员,处理深度学习相关项目已有三年经验,接下来会在平台上给大家分享一些深度学习,计算机视觉和统计机器学习的心得体会,当然了内推简历一定是收的.这篇文章,不想说太多学术的 ...

  4. Alpha版本项目展示得分

    团队名称 得分 newbe 80 C705 100 ourteam 60 sevens 50 sixsix 190 dxteam 75 hots 200 Echo 90

  5. Daily Scrumming* 2015.12.12(Day 4)

    一.团队scrum meeting照片 二.今日总结 姓名 WorkItem ID 工作内容 签入链接以及备注说明  江昊 任务1036 进行界面开发,明日准备开发第一个界面,社团展示界面 工作暂未完 ...

  6. VMware 虚拟机CentOS 7 网路连接配置 无eth0简单解决办法

    个人博客:http://www.cnblogs.com/miaojinmin799/ 在前面几步基本和网上linux配置差不多,最后一步要配置eth0时出现如图所示结果使用ifconfig -a命令 ...

  7. js生成uuid代码

    function uuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 3 ...

  8. win8以上windows系统eclipse环境下图片显示乱码问题解决

    相信升级了win10系统的诸多安卓开发者在用eclipse时会发现一个很不爽的地方,就是原本win7环境下能正常打开的图片文件现在成了一页乱码,我曾多次碰到这个问题,在网上也很难找到行之有效的具体解决 ...

  9. Beta阶段冲刺四

    Beta阶段冲刺四 Task1:团队TSP 团队任务 预估时间 实际时间 完成日期 新增其他学院的爬虫 180 130 11.30 新增其他学院的数据库字段修改 180 160 12.1 新增其他学院 ...

  10. ESXi 20181229 刚学到的知识点

    1. 查看性能 能够获取到服务器的电源消耗 这里很明显的就能看到 2路服务器的情况下 电源在300w 以下,  平均值 270w 左右. 2. 然后在配置里面能够看到 服务器的信息 设置还能看到 序列 ...