【Linux】【Shell】Shell 基础与变量

Shell 基础

  • Shell 基础
    • 查看可用的 Shell
    • 判断当前 Shell 类型
  • 变量
  • 环境变量
    • 查看环境变量
    • 临时环境变量
    • 永久环境变量
    • PATH 变量
  • 自定义变量
    • 特殊赋值(双引号、单引号、反撇号)
  • 预定义变量
  • bashrc


Shell 基础


Shell 是一个用 C 语言编写的程序,相当于是一个翻译,把我们在计算机上的操作或我们的命令,翻译为计算机可识别的二进制命令,传递给内核(Kernal),以便调用计算机硬件执行相关的操作;同时,计算机执行完命令后,再通过Shell翻译成自然语言,呈现在我们面前。

Linux 中的各种命令其实都是独立的应用程序,通过操作系统提供的接口和 Kernal 进行交互,从实现某种操作。

【具体内部和操作系统相关,这里不在过多说明。】

简单来说,Shell 就是一种命令行解释器,它接受用户输入的命令,并将其转换为操作系统可以执行的指令。它不仅仅是一个简单的命令行界面,还是一个功能强大的脚本编程环境,可以编写自动化任务和复杂的工作流程。

Shell是用户和Linux(或者更准确的说,是用户和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由 Shell 先解释然后传给Linux内核。

Shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 Shell 命令集。此外,Shell 也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。

不论何时你键入一个命令,它都被 Linux Shell 所解释。一些命令,比如打印当前工作目录命令(pwd),是包含在Linux bash 内部的(就象DOS的内部命令)。其他命令,比如拷贝命令(cp)和移动命令(rm),是存在于文件系统中某个目录下的单独的程序。而对用户来说,你不知道(或者可能不关心)一个命令是建立在 Shell 内部还是一个单独的程序,因为使用方法都是一样的。

一般情况下,Linux 中的命令的按照如下顺序执行:

  1. 以相对/绝对路径执行指令,例如“ /bin/ls ”或“ ./ls ”;
  2. alias 找到该指令来执行;
  3. 由 bash 内置的 (builtin) 指令来执行;
  4. 通过 $PATH 这个变量的顺序搜寻到的第一个指令来执行。

查看可用的 Shell


由于早年的 Unix 年代,发展者众,所以由于 Shell 依据发展者的不同就有许多的版本,如 Bourne SHell (sh) 、C SHell、K SHell、 TCSH 等。

每一种 Shell 都各有其特点了,大多数 Linux 使用的默认版本为 “ Bourne Again SHell (简称 BASH) ”,这个 Shell 是 Bourne Shell 的增强版本。

在 Linux 系统中,使用 cat /etc/shells 可以查看查看当前系统中可用的 Shell 。

在这里插入图片描述

不同类型的 Shell 的语法及其包含的命令会有一定的不同,除非有特别说明,否则后续使用的命令都是 BASH 中命令。

Tips:

第一个流行的 shell 是由 Steven Bourne 发展出来的,为了纪念他所以就称为 Bourne shell ,或直接简称为 sh !而后来另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计依附于 BSD 版的 Unix 系统中的shell ,这个 Shell 的语法有点类似 C 语言,所以才得名为 C shell ,简称为 csh。


判断当前 Shell 类型


Linux 中判断当前 Shell 的类型的方法有很多,部分方法如下所述。

方法1:

通过环境变量 SHELL 来查看:

echo $SHELL

方法2:

在 Terminal 输入命令 ps,查看当前运行的 shell 是什么。如下图所示,有一个进程是 csh,说明当前 shell 的类型是 csh。

在这里插入图片描述


变量


变量是 bash 环境中非常重要的一个内容。

Linux 是多用户多任务的环境,每个人登陆系统都能取得一个 bash shell, 每个人都能够使用 bash 下达 mail 这个指令来收受“自
己”的邮件等等。问题是, bash 是如何得知你的邮件信箱是哪个文件? 这就需要“变量”的帮助。

变量,简单的说,就是让某一个特定字串代表不固定的内容。

我们每个帐号的邮件信箱默认是以 MAIL 这个变量来进行存取的, 当 dmtsai 这个使用者登陆时,他便会取得 MAIL 这个变量,而这个变量的内容其实就是 /var/spool/mail/dmtsai, 那如果 vbird 登陆呢?他取得的 MAIL 这个变量的内容其实就是/var/spool/mail/vbird 。 而我们使用信件读取指令 mail 来读取自己的邮件信箱时,该程序可以直接读取 MAIL 这个变量的内容, 就能够自动的分辨出信箱的归属。


在 Linux Shell 中,变量主要有两大类:环境(系统)变量用户定义变量

每种类型的变量依据作用域不同,又分为全局变量局部变量。全局变量作用在整个 Shell 会话及其子 Shell,局部变量作用在定义它们的进程及其子进程内。

环境变量属于全局变量,它在任何的 Shell 中都可以使用。


环境变量


Linux是一个多用户的操作系统。多用户意味着每个用户登录系统后,都有自己专用的运行环境。而这个环境是由一组变量所定义,这组变量被称为环境变量。用户可以对自己的环境变量进行修改以达到对环境的要求。

一些常用的环境变量及其作用:

  • HOME

    用户的主工作目录,即为用户登录到Linux系统中时的默认目录。

  • PATH

    PATH 变量用于设置可执行程序的默认搜索路径。

    当我们输入一个指令时,Shell 会先检查命令是否是系统内部命令,如果不是则会再去检查此命令是否是一个应用程序,Shell会试着从PATH指定的路径下寻找这些应用程序。

    PATH 变量中可以指定多条路径,不同的路径使用 : 进行区分。

    # echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    

    在 IC 的环境下,如果安装了一些 EDA 工具,这些 EDA 工具的启动程序的所在的路径就要放到 PATH 中,这样才能在 Terminal 中使用 dc_shell, vcs, verdi 等直接启动 EDA 工具。

  • HISTSIZE

    保存历史命令的条数。我们输入的指令都会被系统保存下来,这个环境变量记录的就是保持指令的条数。一般为1000。

    历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取我们可以通过history命令来查看。可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2

  • LOGNAME、USER、HOSTNAME

    登录名、用户名和主机名。

  • SHELL

    当前使用的默认 Shell 解释器的名称。

  • PS1

    BASH 解释器的提示符。

    在这里插入图片描述
    【C shell 中 PS1 对应的变量名称为 prompt】

    CentOS 默认的 PS1 为 [\u@\h \W]$,在终端对应的提示信息为:[dmtsai@study ~]$


查看环境变量


echo 命令可以显示某个具体的环境变量的值,可用于快速检查一个变量的修改是否生效。

在这里插入图片描述

env 显示当前 shell 环境下的所有环境变量及其值。

BASH 中不只有环境变量,还有一些与 BASH的操作接口有关的变量,以及用户自己定义的变量。set 会显示当前 shell 的所有变量。


临时环境变量


环境变量和用户自定义变量之间的差异主要是“该变量是否会被子程序所继续引用”。

当你登陆 Linux 并取得一个 bash 之后,你的 bash 就是一个独立的程序,这个程序的识别使用的是一个称为程序识别码,被称为 PID 的就是。 接下来你在这个 bash 下面所下达的任何指令都是由这个 bash 所衍生出来的,那些被下达的指令就被称为子程序。

使用 export 命令将一个自定义变量变成环境变量,从而可以让该变量的值继续存在于子程序。

该命令设定的环境变量仅在当前窗口生效,关闭窗口或新建其他窗口,无法查看到之前设置的临时环境变量

在这里插入图片描述

export 命令也可以临时设置改变环境变量的值,相当于是给变量一个新的值,然后把之前的值覆盖了。


永久环境变量


使用 export 命令指定的环境变量仅在当前 Shell 及其子 Shell 中生效,如果像让变量永久生效,可以将其放到环境变量配置文件中。

在 Linux 系统中,环境变量的全局配置文件为 /etc/profile,在此文件中定义的变量作用于所有用户。除此之外,每个用户还有自己的独立配置文件(~/.bash_profile, ~/.profile,~/.bashrc等)。在这些文件中设置好环境变量之后,重新登录或者使用 source 命令之后,变量才能生效。

  • /etc/profile

    用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效。当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置.

    一般用户不会对环境变量的全局配置文件进行修改,主要是对用户个人的配置文件进行修改。

  • ~/.bash_profile & ~/.profile

    在登录 Shell 时加载的配置文件。当你通过图形界面登录、通过SSH远程连接到系统或通过终端登录时,这些文件中的设置就会生效。

    ~/.profile 作用于所有类型的 Shell,而 ~/.bash_profile 只作用于 BASH Shell。

  • .bashrc

    ~/.profile~/.bash_profile 文件只会在用户登录的时候读取一次,而.bashrc在每次打开新的终端窗口或标签时都会读取。

    .bashrc 仅作用于 BASH Shell,C Shell 中与之对应的文件是 .cshrc

    /etc/bashrc 中的配置作用于所有用户,而 ~/.bashrc 中的配置仅作用于当前用户。

    .bashrc文件会在 bash shell 调用另一个bash shell时读取,也就是在shell中再键入bash命令启动一个新shell时就会去读该文件。这样可有效分离登录和子shell所需的环境。但一般 来说都会在.bash_profile里调用.bashrc脚本以便统一配置用户环境。


PATH 变量


PATH 变量用于设置可执行程序的默认搜索路径。当仅指定文件名称来执行命令程序时,Linux 系统将在 PATH 变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”。

示例:

[root@localhost ~]# test.sh
bash: test.sh: Command not found.
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# pwd
/root

由于 test.sh 不在 PATH 目录中,所以系统无法识别这个命令,需要使用绝对路径来执行该脚本。

将脚本目录加入 PATH

方法一:将脚本的目录临时加入 PATH

[root@localhost ~]# PATH="$PATH:/root"
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root
[root@localhost ~]# test.sh 
hello world

方法二:将你自己写的脚本放到 PATH 中的某一个目录

[root@localhost ~]# mv test.sh /usr/local/bin/
[root@localhost ~]# test.sh
hello world

自定义变量


在 Bash 中,定义变量非常简单,不像其他高级编程语言(如 C/C++、Java 等)那么复杂。在定义一个新变量时,一般不需要提前声明,只需直接指定变量名称并赋值即可。

格式

name=value

Notes

  • 变量名需以字母或下划线开头,名称中不能包含特殊字符。
  • 等号两边不能有空格。
  • 新定义的变量只在当前的 Shell 环境中有效,因此称为局部变量。当进入子程序或新的子 Shell 环境时,局部变量将无法再使用。

特殊赋值(双引号、单引号、反撇号)


双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来。其他情况下双引号通常可以省略。

当要赋值的内容中包含 $、"、\ 等具有特殊含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待,输入什么就显示什么。

test=123
echo "$test"  # 输出:123
echo '$test'  # 输出:$test

反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的范围内必须是能够执行的命令行,否则将会出错。

time=`date +%T`

使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用 $() 来代替反撇号操作,以解决嵌套的问题。

ls -lh `which useradd`
# or
rpm -qc $(rpm -qf $(which useradd))

预定义变量


预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用 $ 符号和另一个符号组合表示。

  • $#:表示命令行中位置参数的个数。
  • $*:表示所有位置参数的内容,这些内容当做一个整体。
  • $@:表示列出所有位置参数,但是是以单个的形式列出。
  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0 值均表示执行出现异常。
  • $0:表示当前执行的脚本或程序的名称。
  • $$:表示返回当前进程的进程号。
  • $!:返回最后一个后台进程的进程号。

bashrc


作为配置文件,bashrc 等文件不只是用于设置变量,还可以用于配置其他内容。

bashrc 文件中,# 表示的是注释。

1. 配置别名,简化指令

当我们想把一些常用的指令以及相关指令参数,定制为更加精简的指令,就可以用 alias 为命令设置别名。

alias ll = "ls -lha"

2. 配置函数,定制指令过程

除了缩短命名,也可以用bash函数组合多个命令到一个操作,这些命令大多遵循以下语法。

# Syntax 1
function function_name {command1<^>command2</^># Syntax 2
function_name () {command_1command_2
}# Syntax 3
function_name () { commmand1; command2; }

示例:

下面的命令组合了 mkdircd 命令,输入md folder_name会在你的工作目录创建一个名为"folder_name"的目录并且进入其中。

md () {mkdir -p $1cd $1
}
# or
md () { mkdir -p $1; cd $1;}

3. 设置变量

在原来PATH的后面继续添加了新的路径:

# Syntax 1
PATH=$PATH:new_path
export PATH# Syntax 2
export PATH=$PATH:new_path

export 是让变量可以作用域子 Shell。

示例:

user@pc:~$ echo 'VAL_TS="hello, no export"' >> ~/.bashrc            #添加非export变量赋值到.bashrc
user@pc:~$ source ~/.bashrc                                         #使.bashrc生效
user@pc:~$ echo $VAL_TS                                             #输出变量 VAL_TS 值
#结果
hello, no exportuser@pc:~$ echo 'echo "val is :" $VAL_TS' > test.sh                 #添加脚本语句到脚本 test.sh
user@pc:~$ ./test.sh                                                #执行脚本 test.sh
#结果
val is :                                                            #脚本中并没有变量值user@pc:~$ echo 'export EX_VAL_TS="hello, export"' >> ~/.bashrc     #添加export变量赋值
user@pc:~$ source ~/.bashrc                                         #使.bashrc生效
user@pc:~$ echo $EX_VAL_TS                                          #输出变量 EX_VAL_TS 值
#结果
hello, exportuser@pc:~$ echo 'echo "export val is :$EX_VAL_TS' >> test.sh        #添加脚本语句到脚本
user@pc:~$ ./test.sh                                                #执行脚本 test.sh
#结果
export val is :hello, export                                        #脚本中获取到了变量值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SQL50】day 2

目录 1.每位经理的下属员工数量 2.员工的直属部门 3.判断三角形 4.上级经理已离职的公司员工 5.换座位 6.电影评分 7.修复表中的名字 8.患某种疾病的患者 9.删除重复的电子邮箱 1.每位经理的下属员工数量 # Write your MySQL query statement below #e1是经理&#xff0c;…

FIFO和LRU算法实现操作系统中主存管理

FIFO&#xff0c;用数组实现 1和2都是使用nextReplace实现新页面位置的更新 1、不精确时间&#xff1a;用ctime输出运行时间都是0.00秒 #include <iostream> #include <iomanip> #include<ctime>//用于计算时间 using namespace std;// 页访问顺序 int pa…

ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;资源共享平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本资源共享平台就是在…

LeetCode 力扣 热题 100道(六)合并两个有序链表(C++)

合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]示…

ubuntu显示管理器_显示导航栏

ubuntu文件管理器_显示导航栏 一、原始状态&#xff1a; 二、显示导航栏状态&#xff1a; 三、原始状态--->导航栏状态: 1、打开dconf编辑器&#xff0c;直接在搜索栏搜索 dconf-editor ------如果没有安装&#xff0c;直接按流程安装即可。 2、进入目录&#xff1a;org …

高集成的MCU方案已成电机应用趋势?

【哔哥哔特导读】高集成化的芯片成为当下MCU领域研发和市场布局的重点&#xff0c;但是在实际应用中仍然面临散热等痛点问题&#xff0c;MCU厂商是如何解决和优化这些痛点&#xff1f; 随着全球工业自动化、智能制造和绿色发展的不断推进&#xff0c;中国电机行业正站在新一轮…

购物街项目TabBar的封装

1.TabBar介绍 在购物街项目中 不论页面如何滚动 始终存在一个TabBar固定在该项目的底部 他在该项目中 扮演者选项卡栏的角色 内部存在若干选项 而选项中 固定存在两部分(图片文本) 其中主要涉及到TabBar/TabBarItem这些和业务无关的共享组件(建议存放于components/common中)、…

优化表单交互:在 el-select 组件中嵌入表格显示选项

介绍了一种通过 el-select 插槽实现表格样式数据展示的方案&#xff0c;可更直观地辅助用户选择。支持列配置、行数据绑定及自定义搜索&#xff0c;简洁高效&#xff0c;适用于复杂选择场景。完整代码见GitHub 仓库。 背景 在进行业务开发选择订单时&#xff0c;如果单纯的根…

最新Kali安装详细版教程(附安装包,傻瓜式安装教程)

本文主要详细介绍 kali 的安装过程&#xff0c;以及安装完成后的基本设置&#xff0c;比如安装增强工具&#xff0c;安装中文输入法以及更新升级等操作。 文章目录 实验环境准备工作步骤说明安装虚拟机安装 Kali安装增强工具安装中文输入法更新升级 实验环境 VMware &#x…

细说STM32单片机DMA中断收发RTC实时时间并改善其鲁棒性的方法

目录 一、DMA基础知识 1、DMA简介 (1)DMA控制器 (2)DMA流 (3)DMA请求 (4)仲裁器 (5)DMA传输属性 2、源地址和目标地址 3、DMA传输模式 4、传输数据量的大小 5、数据宽度 6、地址指针递增 7、DMA工作模式 8、DMA流的优先级别 9、FIFO或直接模式 10、单次传输或突…

H.265流媒体播放器EasyPlayer.js H5流媒体播放器如何验证视频播放是否走硬解

随着技术的不断进步和5G网络的推广&#xff0c;中国流媒体播放器行业市场规模以及未来发展趋势都将持续保持稳定的增长&#xff0c;并将在未来几年迎来新的发展机遇。流媒体播放器将继续作为连接内容创作者和观众的重要桥梁&#xff0c;推动数字媒体产业的创新和发展。 EasyPla…

仿Mybatis代码生成.获取索引信息

获取索引信息 1.核心思路 通过以下sql语句&#xff0c;例如对于user表 show index from user 执行结果如下: 2.实现 连接数据库后执行sql语句&#xff0c;我们重点关注下图标注的三个熟悉 代码如下: PreparedStatement ps null;ResultSet fieldResult null;List<Fiel…

【AI大模型】大型语言模型LLM基础概览:技术原理、发展历程与未来展望

目录 &#x1f354; 大语言模型 (LLM) 背景 &#x1f354; 语言模型 (Language Model, LM) 2.1 基于规则和统计的语言模型&#xff08;N-gram&#xff09; 2.2 神经网络语言模型 2.3 基于Transformer的预训练语言模型 2.4 大语言模型 &#x1f354; 语言模型的评估指标 …

详解八大排序(一)------(插入排序,选择排序,冒泡排序,希尔排序)

文章目录 前言1.插入排序&#xff08;InsertSort&#xff09;1.1 核心思路1.2 实现代码 2.选择排序&#xff08;SelectSort&#xff09;2.1 核心思路2.2 实现代码 3.冒泡排序&#xff08;BubbleSort&#xff09;3.1 核心思路3.2 实现代码 4.希尔排序&#xff08;ShellSort&…

如何在 Ubuntu 上使用 Docker 部署 LibreOffice Online

简介 LibreOffice Online&#xff08;也称为Collabora Online&#xff09;是一个开源的在线办公套件&#xff0c;它提供了与LibreOffice桌面版相似的功能&#xff0c;但完全在云端运行。这意味着用户可以通过浏览器访问和编辑文档&#xff0c;而无需在本地计算机上安装任何软件…

【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南

文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…

macOS 无法安装第三方app,启用任何来源的方法

升级新版本 MacOS 后&#xff0c;安装下载的软件时&#xff0c;不能在 ”安全性与隐私” 中找不到 ”任何来源” 选项。 1. 允许展示任何来源 点击 启动器 (Launchpad) – 其他 (Other) – 终端 (Terminal)&#xff1a; 打开终端后&#xff0c;输入以下代码回车&#xff1a; …

Flutter:RotationTransition旋转动画

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationController late AnimationController _controller;overridevoid initState() {super…

同步的意义以及机制

一、同步的意义 同步&#xff08;Synchronization&#xff09;的意义在于确保在多线程环境中&#xff0c;多个线程对共享资源的访问是安全的&#xff0c;避免竞争条件&#xff08;race conditions&#xff09;和数据不一致的情况。 具体来说&#xff0c;同步的核心目标是&…

第二十四章 Spring之源码阅读——AOP篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…