热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LinuxShell变量初探:初始值解析与使用指南

本文探讨了LinuxShell中变量的基本概念及其在BASH中的应用。变量是用于存储可变数据的标识符,能够代表不同的值。文章详细介绍了BASHshell的主要优势,包括强大的命令编辑能力、自动补全功能、命令别名设置、作业控制以及前后台任务管理。此外,还涵盖了编程脚本编写和通配符的使用方法,为初学者提供了全面的指导。

BASH:主要的优点:

命令编修能力;

命令与文件补全功能;

命令别名设置功能;

工作控制、前景背景控制;

程序化脚本;

万用字符;

1、什么是变量?

1、 让某一个特定的字符串代表不固定的内容。

2、 变量就是让一组文字或符号等来取代一些设置,或者是一串保留的数据。

3、变量的格式:变量名=变量内容(变量名一般设置为大写字母,专业一些)。

设置变量的规则:

1、 变量与变量内容以一个等号“=”来链接;

2、 等号两边不能直接接空白字符;

3、 变量名称只能是英文字母与数字,但是开头字符不能是数字;

4、 变量内容若有空白字符可以使用双引号,或单引号讲变量内容结合起来。双引号内的特殊字符如$等,可以保有原本的特性;单引号内的特殊字符则仅作为一般字符(纯文本)。

5、 可用转义符“\”将特殊符号变成一般字符;

6、 在一串指令的执行中,还需要借由其他额外的指令所提供的信息时,可以使用反撇号,而不是单引号。

7、 若该变量需要在其他子程序执行,则需要一export来使自定义变量变成环境变量。

8、 通常大写字符为系统默认变量,自行设置变量可以使用小写字符,方便判断;

9、 取消变量的方法为使用unset: “unset 变量名称”例如取消myname的设置:unset myname。

有关shell变量定义、赋值及变量输出加单引号、双引号、反引号与不加引号的简要说明,如下表所示:

《linux shell中变量,初值是什么?,shell总结笔记——关于变量》

建议:

在脚本中定义普通字符串变量时,应尽量把变量的内容用双引号括起来;

单纯数字的变量内容可以不加引号;

希望变量的内容原样输出时需要加单引号;

希望变量值引用命令并获取命令的结果时就用反单引号或$( )。

env命令——查询环境变量。

random命令:随机产生的数字是在0——32768之间。

set命令:查询的是所有的变量,包括环境变量和自定义变量。

$:代表的是当前shell的PID号,如echo $$;

?:代表的是上一个指令的回传值,如echo $?

自定义变量与环境变量最大的区别是:该变量是否会被子程序(子shell)继续使用。

各种变量定义的作用域:

环境变量=全域变量

自定义变量=区域变量

关于系统中的环境变量解释:

《linux shell中变量,初值是什么?,shell总结笔记——关于变量》

PS1——系统特定变量名

其中PS1这个变量需要解释下,其他可以自行看懂,PS1可用的选项如下:

\d :可显示出“星期月日”的日期格式,如:”Mon Feb 2″

\H :完整的主机名称。举例来说,我的练习机为“study.centos.vbird”

\h :仅取主机名称在第一个小数点之前的名字,如我主机则为“study”后面省略

\t :显示时间,为 24 小时格式的“HH:MM:SS”

\T :显示时间,为 12 小时格式的“HH:MM:SS”

\A :显示时间,为 24 小时格式的“HH:MM”

\@ :显示时间,为 12 小时格式的“am/pm”样式

\u :目前使用者的帐号名称,如“dmtsai”;

\v :BASH 的版本信息,如我的测试主机版本为 4.2.46(1)-release,仅取“4.2”显示

\w :完整的工作目录名称,由根目录写起的目录名称。但主文件夹会以 ~ 取代;

\W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。

# :下达的第几个指令。

\$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $

用法示例:

[root@localhost ~]# PS1='[\u@\h\w\A#\#]\$’ #添加上面的一些选项

[root@localhost~13:07#5]#cd /etc #多执行两下命令

[root@localhost/etc13:07#6]#cd /boot

[root@localhost/boot13:07#7]#exit

#可以发现,执行PS1这个变量并结合一些选项的使用,可以暂时改变命令提示符的变化,

#并且后面的数字会每执行一次,就增加一个数,这是\#的作用

设置变量的方式1

《linux shell中变量,初值是什么?,shell总结笔记——关于变量》

[root@localhost ~]# path=$PATH #先自定义一个变量,引用“PATH”的值,用“path”变量做测试

[root@localhost ~]# echo $path #输出进行确认下

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@localhost ~]# echo ${path#/*local/sbin:} #试着删除一个

/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

#在上面的命令中,“$”是关键字,用在这种删除模式所必须存在的;

#“path”就是原本的变量名称;

#“#”代表从变量内容的最前面开始向右删除,且只删除最短的那个;

#“/*local/sbin:”代表要被删除的部分,由于“#”代表从前面开始删除,

#所以这里就从“/”写起,并且可以使用“*”这个万用字符,可以代表任意内容。

#但这条命令并没有改变“path”变量的内容,可以将“echo”换为“path=”即可直接改变变量内容。

#如下:

[root@localhost ~]# path=${path#/*local/sbin:}

[root@localhost ~]# echo $path

/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

#这就将原本的变量值更改成功了。

关于其他的更改方式,参考上面的表格即可咯!

(2)

《linux shell中变量,初值是什么?,shell总结笔记——关于变量》

示例1——测试一下是否存在username这个变量,若不存在则赋值username为root。

[root@localhost ~]# echo $username #查看username变量是否存在

[root@localhost ~]# username=${username-root} #如果变量内容不存在就赋值为root

[root@localhost ~]# echo $username #变量不存在,所以将它赋值了root

root

[root@localhost ~]# username=’lv jian zhao’ #那么现在给它赋值

[root@localhost ~]# username=${username-root} #再次使用这个,表示如果值不存在,则将它赋值为root

[root@localhost ~]# echo $username #再次输出,会发现还是我们手工赋的值,并没有给它赋值为root

lv jian zhao

#从上面可以看出“-”号的作用,就是如果值不存在,就给它赋值“-”号后面的值,若存在,则放弃。

示例2——若username未设置或为空字串,则将username内容设置为root

[root@localhost ~]# username=”” #将username设置为空字串

[root@localhost ~]# username=${username-root} #若值不存在,则赋值为root

[root@localhost ~]# echo $username

#输出该变量,会发现还是空的,因为username的值是存在的,只不过是空字串而已,所以并没有赋值为root

[root@localhost ~]# username=${username:-root} #使用“:-”试试

[root@localhost ~]# echo $username #会发现已经赋值为root了

root

#说明:“:-”的作用就是如果值为空或是未设置,都能被后面的内容替换。

设置变量的方式2

环境变量一般是指用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行。Shell通过环境变量来确定登录用户名、命令路径、终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、Shell脚本和各类应用。

环境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,因此,如果希望永久保存环境变量,可在用户家目录下的.bash_profile或.bashrc(非用户登录模式特有,例如远程文件中,或者全局配置/etc/bashrc(非用户登录模式特有,例如远程SSH)或/etc/profile文件中定义。在将环境变量放入上述的文件中后,每次用户登录时这些变量都将被初始化。

按照系统规范,所有环境变量的名字均采用大写形式。在将环境变量应用于用户进程程序之前,都应该用export命令导出定义,例如:正确的环境变量定义方法为export OLDGIRL=1。

有一些环境变量,比如HOME、PATH、SHELL、UID、USER等,在用户登录之前就已经被/bin/login程序设置好了。通常环境变量被定义并保存在用户家目录下的.bash_profile文件或全局的配置文件/etc/profile中,具体的环境变量说明请参考下表:

《linux shell中变量,初值是什么?,shell总结笔记——关于变量》

在查看设置的变量时,有3个命令可以显示变量的值:set、env和declare(替代早期的typeset)。set命令输出所有的变量,包括全局变量和局部变量;env命令只显示全局变量;declare命令输出所有的变量、函数、整数和已经导出的变量。set-o命令显示bash Shell的所有参数配置信息。

查看举例:

[root@localhost ~]# env | tail #使用env命令进行查看全局变量

[root@localhost ~]# set -o #使用set -o查看bash shell的所有参数配置信息

设置环境变量的方式

如果想要设置环境变量,就要在给变量赋值之后或在设置变量时使用export命令,具体设置见下文的示例。其实,除了export命令,带-x选项的declare内置命令也可以完成同样的功能(注意:此处不要在变量名前面加$):

export命令和declare命令的格式如下:

①export 变量名=value②变量名=value ; export 变量名③declare -x 变量名=value

#以上就是三种设置环境变量的三种方法

上面设置的全局变量只是临时设置的,重启系统后,就失效了,那么可以将变量写入以下几个文件其中之一即可,使其永久生效:

1、只对用户的环境变量配置

[lv@localhost ~]$ ls ~/.bashrc ~/.bash_profile

#对于用户的环境变量设置,比较常见的是用户家目录下的这两个目录,推荐写入第一个文件“.bashrc”

2、全局环境变量的配置

常见的全局环境变量的配置文件如下:

/etc/profile

/etc/bashrc #推荐在此文件中优先设置

/etc/profile.d/

环境变量总结

环境变量的定义:

变量名通常要大写;

变量可以在自身的shell及子shell中使用;

常用export来定义环境变量;

数字内容的变量定义可以不加引号,其他没有特殊要求的字符串等定义最好都加上双引号;如果真的需要原样输出就加单引号;定义变量加双引号是最常见的使用场景;

如果需要获取命令结果赋值给变量,则可以使用反撇号“(tab键上面的那个按键)或者括号“()”将命令字括起来;

执行env默认可以显示所有的环境变量名称及对应的值;

输出时用“echo $变量名”,取消时用“unset 变量名”;

书写crond定时任务时要注意,脚本要用到环境变量最好现在所执行的shell脚本中重新定义;

如果希望环境变量永久生效,则可以将其放在用户环境变量文件或全局环境变量文件里;

环境变量初始化与对应文件的生效顺序:

在登录Linux系统并启动一个bash shell时,默认情况下bash会在若干个文件中查找环境变量的设置这些文件,这些文件可统称为系统环境文件。bash检查的环境变量文件的情况取决于系统运行shell的方式。系统运行shell的方式一般有3种:①通过系统用户登录后默认运行的shell;②非登录交互式运行shell;③执行脚本运行非交互式shell。

用户登录系统后首先会加载/etc/profile全局环境变量文件,这是Linux系统上默认的shell主环境变量文件,系统上每个用户登录都会加载这个文件。

当加载完/etc/profile文件后,才会执行/etc/profile.d目录下的脚本文件,这个目录下的脚本文件有很多,例如:系统的字符集设置(/etc/sysconfig/il8n)等。

之后开始运行$HOME/.bash_profile(用户环境变量文件),在这个文件中,又会去找$HOME/.bashrc(用户环境变量文件),如果有,则执行,如果没有,则不执行。在$HOME/.bashrc文件中又会去找/etc/bashrc(全局环境变量文件),如果有,则执行,如果没有,则不执行。

如果用户的shell不是登录时启动的(比如手动敲下bash时或者其他不需要输入密码的登录及远程连接情况),那么这种非登录shell只会加载$HOME/.bashrc,并会去找/etc/bashrc文件。因此如果希望在非登录shell下也可以督导设置的环境变量等内容,就需要将变量设定等写入$HOME/.bashrc或者/etc/bashrc,而不是$HOME/.bash_profile或/etc/profile。

———————— 本文至此结束,感谢阅读 ————————


推荐阅读
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 本文详细介绍了 Linux 系统中用户、组和文件权限的设置方法,包括基本权限(读、写、执行)、特殊权限(SUID、SGID、Sticky Bit)以及相关配置文件的使用。 ... [详细]
  • 本文详细介绍如何通过设置SSH密钥来获取连接GitHub远程仓库的权限,包括生成密钥、添加到GitHub账户以及验证连接等步骤。 ... [详细]
  • 写在前面,排序算法属于面试中绝对不会错过的一道题,不管是原理,手撕,变形,优化,全都是考点。接 ... [详细]
  • 解决Linux history命令不记录执行时间的方法
    本文探讨了如何通过配置环境变量来使Linux系统中的history命令记录每条命令的执行时间,包括具体的配置步骤和效果展示。 ... [详细]
  • 随着技术社区的发展,越来越多的技术爱好者选择通过撰写博客来分享自己的学习经验和项目进展。本文将介绍一个具体案例,即将一套原本运行于Windows平台的代码成功移植到Linux(Redhat)环境下的过程与挑战。 ... [详细]
author-avatar
想丶风吹叶落
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有