专栏首页大闲人柴毛毛Linux Shell(一)——Shell变量

Linux Shell(一)——Shell变量

1 变量的分类

在Linux中,变量分为环境变量 和 局部变量。 环境变量能被子进程继承,而局部变量只能在当前进程中使用。 并且,不论是环境变量还是局部变量,他们又都可以分为系统变量 和 自定义变量。系统变量是系统启动时自动创建的变量,往往为系统运行提供支持;而自定义变量是用户自己定义的。一般而言,系统变量全为大写,自定义变量全为小写。

1.1 常见的环境变量

系统提供了一些默认的环境变量,如下:

  • HOME:用户主目录 当我们使用cd 或cd ~时就会调用这个环境变量找到用户主目录。
  • SHELL:当前使用的SHELL
  • HISTSIZE:历史命令的最大条数
  • MAIL:当前用户的邮箱目录
  • PATH:可执行文件的查找路径。 这是一个非常重要的环境变量,当我们直接写一个命令时,系统就会在PATH路径中寻找这个命令,这样我们在执行命令的时候就不用输命令完整的路径了。多个路径之间用:分隔。
  • LANG:当前系统的语言
  • RANDOM:随机数生成器的路径。 该路径默认指向/dev/random这个文件,这个文件是一个随机数生成器,当我们使用$RANDOM时就能获得一个0-32767之间的随机整数。

1.2 常见的局部变量(非环境变量)

  • PS1:命令提示符 在命令输入光标前有一串用中括号括起来的信息,这就是命令提示符。命令提示符究竟需要显示哪些信息,这就是由PS1这个局部变量决定的。由于它是局部变量,因此子进程中无法继承这个变量,子进程拥有自己的PS1。 我们可以修改这个变量,使得它显示我们需要的信息,如:我们让命令提示符显示当前用户名和当前完整的路径:
[root@iZ28st035lsZ ~]# PS1='[\u:\w]:'
[root:~]:
  • $:当前shell的PID 可以通过如下命令查看当前shell的PID:
echo $$
  • ?:上个命令的执行结果 上个命令若执行成功,则echo $?就会返回0;若上个命令执行失败,则该值为一个非0整数。

1.3 环境变量与局部变量的区别

环境变量相当于全局变量,它可以被子进程继承;而局部变量只能在当前shell中使用。那么,什么是子进程呢?

1.4 什么是子进程?

在一个bash中开启一个新的bash,那么原本的bash称为父进程,新的bash称为子进程。 子进程会继承父进程的所有环境变量,而父进程的局部变量只能在父进程中使用。

2 变量的显示与设置

2.1 变量的显示:echo

显示一个变量有两种方式,这两种方式等价:

  • 方式一:
echo $变量名
  • 方式二:
echo ${变量名}

2.2 变量的设置

变量的设置较为简单,如下所示:

变量名=变量值

但是,变量的设置具有较多的注意点!

2.2.1 设置变量的注意事项:

  • 等号两侧都不能含有任何空格!若变量值必须有空格,则可以使用单引号 或 双引号将变量值包裹起来,如下所示:
myName='chai bo zhou'
或
myName="chai bo zhou"

但是,单引号和双引号包裹变量值有本质的区别: 若变量值中包含特殊字符,则按照特殊字符代表的含义输出,如:

username="username is $myName"
echo $username

则输出的结果为:username is chai bo zhou。 若改为单引号,则以一个字符串的形式输出:

username='username is $myName'
echo $username

则输出结果为:username is $myName。

  • 变量名绝对不能含有空格,即使用单/双引号的方式包裹也无济于事!
  • 转移字符\可以将特殊字符转换成一般的字符,即这些特殊字符将失去它原有的特性,它退化成一个字符串了。特殊字符有:回车键、$、\、空格、!等。
  • 若变量值中包含命令的话,可以使用反单引号或$(命令)包裹命令,这样命令就会原样执行,如:
currentPath="current path is : $(pwd)"
echo $currentPath
输出结果为:current path is : /root
  • 可以使用export将自定义变量升级成环境变量,供子进程使用。
  • 一般系统变量全部大写,自定义变量用小写。

2.3 取消变量

unset 变量名

3 环境变量

自定义变量相当于局部变量,只能在当前shell中使用;而环境变量相当于全局变量,可以在子shell中使用。

3.1 查看变量

3.1.1 查看环境变量:env

env是environment的缩写,代表的就是环境变量的意思。他会把系统中所有的环境变量都数出来,如下所示:

[root@iZ28st035lsZ ~]# env
TERM=xterm-256color
SHELL=/bin/bash
CATALINA_HOME=/usr/tomcat
SSH_CLIENT=218.94.83.132 55624 22
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=
MAIL=/var/spool/mail/root
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/tomcat/tomcat:/usr/web2/tomcat:/usr/tomcat:/usr/jdk/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

3.1.2 查看环境变量 与 自定义变量:set

set命令可以查看到所有的环境变量 和 自定义的变量。

3.1.3 查看环境变量:export

export和env都会输出所有的环境变量,但export还会输出环境变量的类型:

[root:~]:export
declare -x CATALINA_HOME="/usr/tomcat"
declare -x CATALINA_HOME2="/usr/web2/tomcat"
declare -x CATALINA_HOME3="/usr/local/tomcat/tomcat"
declare -x CLASSPATH=".:/usr/jdk/lib/dt.jar:/usr/jdk/lib/tools.jar"
declare -x CVS_RSH="ssh"

3.2 设置环境变量

设置环境变量首先需要创建一个局部变量:

变量名=变量值

然后再通过export命令将该局部变量提升为环境变量:

export 变量名

4 从键盘读取变量:read

read [-p 提示语] [-t 时间] 变量名
-p:后面加上提示语
-t:后加上秒数,表示等待用户输入的时间

用户输入之后的值会存储到变量名中。

5 变量类型:declare/typeset

Linux中的变量一共有5种类型,分别是:字符、整型、只读、环境变量。

declare -/+参数 变量名=变量值
-a:将变量变成数组类型
-i:将变量变成int型
-x:将变量变成环境变量型
-r:将变量变成只读型

+:表示取消操作,即:将变量还原成字符型。

6 变量内容的删除 与 替换

之前介绍的unset命令是将变量删除,而接下来介绍的命令是对变量内容的删除或替换。

操作方式

说明

${变量名#关键词}

从变量值的头部开始,依次向后删除到关键词第一次出现的位置为止

${变量名##关键词}

从变量值的头部开始,依次向后删除到关键词最后一次出现的位置为止

${变量名%关键词}

从变量值的尾部开始,依次向前删除到关键词第一次出现的位置为止

${变量名%%关键词}

从变量值的尾部开始,依次向前删除到关键词最后一次出现的位置为止

${变量名/旧字符串/新字符串}

从变量值的头部开始,依次向后找到第一个旧字符串,并将其替换

${变量名//旧字符串/新字符串}

将变量值中所有的旧字符串替换成新字符串

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深入理解JVM(十)——类加载器

    类与类加载器 类加载器的作用:将class文件加载进JVM的方法区,并在方法区中创建一个java.lang.Class对象作为外界访问这个类的接口。 类与类加...

    大闲人柴毛毛
  • 张全蛋和李小花的故事——“代理模式”

    举个例子: 假设张全蛋喜欢上了李小花,张全蛋准备给李小花送一些礼物,但张全蛋又非常害羞,因此买了礼物之后让王尼玛代送。王尼玛跑到李小花把礼物送给她之后就走了。 ...

    大闲人柴毛毛
  • 数据库事务详解

    什么是『事务』? 事务就是一组具有原子性的操作,这一组操作要么全都正确执行,要么全都不执行。 事务能保证数据库从一种一致性状态转换为另一种一致性状态。 事...

    大闲人柴毛毛
  • VSCode的Python扩展下程序运行

    在VSCode中编写Python程序时,由于有些地方要使用环境变量,但是发现设置的环境变量有时不起作用,花了点时间研究了一下,过程不表,直接说结论。

    py3study
  • 2-6 两个有序序列的中位数 (20 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    韩旭051
  • 可视化布局算法的框架设计

    原项目是一个Web项目,采用传统的Servlet方式,后台主要完成的工作是计算节点的坐标,将节点的坐标封装成json格式由与前台进行交互。前期阶段,从前后台的数...

    ZONGLYN
  • 【蓝桥杯】ADV-204 快速幂

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • java 解析 XML实例

    package com.hseact.fecp.servlet; import java.io.IOException; import javax.xml....

    庞小明
  • centos5.3下安装hping3的方

    安装环境准备: gcc libpcap-dev tcl-dev 安装步骤: #tar -zxvf hping3-200541105.tar.gz -C...

    py3study
  • JavaSE学习总结(二)——Java语言基础

    一、Java程序预览 Java的语法与C非常类似,这里先使用几个非常简单的程序以点带面来区分C语Java的区分再细讲每个知识点。该文仅针对有编程基础的朋友参考。...

    张果

扫码关注云+社区

领取腾讯云代金券