001. 变量、环境变量
1、在终端中显示输出
shell脚本通常以shebang起始:#!/bin/bash/
- shebang是一个文本行,其中#!位于解释器路径之前。
- /bin/bash是Bash的解释器命令路径。
- bash将以#符号开头的行视为注释。脚本中只有第一行可以使用shebang来定义解释该脚本所使用的解释器。
脚本的执行方式有两种:
- 第一种,将脚本名作为命令行参数:
bash myScript.sh如果将脚本作为bash的命令行参数来运行,那么就用不着使用shebang了。 - 第二种,授予脚本执行权限,将其变为可执行文件。可以利用shebang来实现脚本的独立运行。可执行脚本使用shebang之后的解释器路径来解释脚本。
# 赋予脚本可执行权限
chmod 755 myScript.sh
chmod a+x myScript.sh# 执行脚本
./myScript.sh # ./表示当前目录
/home/path/myScript.sh # 使用脚本的完整路径# 内核会读取脚本的首行并注意到shebang为#!/bin/bash。它会识别出/bin/bash并执行该脚本:/bin/bash myScript.sh
当启动一个交互式shell时,它会执行一组命令来初始化提示文本、颜色等设置。这组命令来自用户主目录中的脚本文件~/.bashrc(对于登录shell则是~/.bash_profile)。Bash shell还维护了一个历史记录文件~/.bash_history,用于保存用户运行过的命令。
注意:登录shell是登录主机后创建的那个shell。但登录图形化环境(比如GNOME、KDE等)后所创建的终端会话并不是登录shell。使用GNOME或KDE这类显示管理器登录后并不会读取.profile或.bash_profile(绝大部分情况下不会),而使用ssh登录远程系统时则会读取.profile。shell使用分号或换行符来分隔单个命令或命令序列。
a. echo 命令
- 描述:echo是用于终端打印的最基本命令。默认情况下,echo在每次调用后会添加一个换行符。
- 语法:echo [选项] "内容"
-
- -e 包含转义序列的字符串
- -n 禁止在文本的尾部追加一个换行符
echo Welcome to bash
echo 'Welcome to bash'
echo "Weclome to bash"# 如果不使用引号,我们无法在echo中使用分号,因为分号在Bash shell中用作命令间的分隔符:
echo hello;echo xixi
hello
xixi
- 这些方法看起来相似,但各有特定的用途及副作用。双引号允许shell解释字符串中出现的特殊字符。单引号不会对其做任何解释。
转义字符:
默认情况下,echo会在输出文本的尾部追加一个换行符。可以使用选项-n来禁止这种行为。echo同样接受双包含转义序列的双引号字符串作为参数。在使用转义序列时,需要使用echo -e "包含转义序列的字符串"这种形式。
echo -e "1\t2\t3" # 输出:1 2 3 而不是 1\t2\t3
echo -n haha # 输出时文本尾部没有换行
打印彩色输出:
脚本可以使用转义序列在终端中生成彩色文本:
- 文本颜色是由对应的色彩码来描述的。其中包括:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。
- 对于彩色背景,经常使用的颜色码是:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47。
# 打印彩色文本
echo -e "\e[1;31m This is red text \e[0m" # 以红色字体打印 This is red text# 设置彩色背景
echo -e "\e[1;42m Green Background \e[0m" # 将 Green Bachground 的文本背景设置为绿色
- 其中\e[1;31m是一个转义字符串,可以将颜色设为红色,\e[0m将颜色重新置回。
- 这些例子中包含了一些转义序列。可以使用man console_codes来查看相关文档。
b. prinf 命令
printf命令接受引用文本或由空格分隔的参数。默认情况下,printf并不会自动添加换行符,需手动指定。
可以在printf中使用格式化字符串来指定字符串的宽度、左右对齐方式等。
- 描述:用于终端打印
- 语法:printf "内容"
#!/bin/bashprintf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564

- %s、%c、%d和%f都是格式替换符(format substitution character),它们定义了该如何打印后续参数。
-
- %-5s指明了一个格式为左对齐且宽度为5的字符串替换(-表示左对齐)。如果不指明-,字符串就采用右对齐形式。
- 宽度指定了保留给某个字符串的字符数量。对Name而言,其保留宽度是10。因此,任何Name字段的内容都会被显示在10字符宽的保留区域内,如果内容不足10个字符,余下的则以空格填充。
- 对于%f,可以使用其他参数对小数部分进行舍入(round off)。对于Mark字段,我们将其格式化为%-4.2f,其中.2指定保留两位小数。注意,在每行的格式字符串后都有一个换行符(\n)。
2、使用变量和环境变量
所有的编程语言都利用变量来存放数据,以备随后使用或修改。和编译型语言不同,大多数脚本语言不要求在创建变量之前声明其类型。用到什么类型就是什么类型。在变量名前面加上一个美元符号就可以访问到变量的值。shell定义了一些变量,用于保存用到的配置信息,比如可用的打印机、搜索路径等。这些变量叫作环境变量。
变量名由一系列字母、数字和下划线组成,其中不包含空白字符。常用的惯例是在脚本中使用大写字母命名环境变量,使用驼峰命名法或小写字母命名其他变量。
a. env | printenv 命令
- 描述:查看当前shell中所定义的全部环境变量。
- 语法:env | printenv
b. pgrep 命令
- 描述:查看相关进程的进程ID
- 语法:pgrep 进程名称
# 假设有一个叫作gedit的应用程序正在运行。我们可以使用pgrep命令获得gedit的进程ID:
pgrep gedit# 假设查到的 gedit 的进程ID为 12501,那么可以通过如下命令查看与该进程相关的环境变量:
cat /proc/12501/environ# 要想生成一份易读的报表,可以将cat命令的输出通过管道传给tr,将其中的\0替换成\n:
cat /proc/12501/environ | tr '\0' '\n'
- 特殊文件/proc/PID/environ是一个包含环境变量以及对应变量值的列表。每一个变量以name=value的形式来描述,彼此之间由null字符(\0)分隔。
c. 变量赋值
使用等号操作符为变量赋值:varName=value
- 如果value不包含任何空白字符(例如空格),那么就不需要将其放入引号中,否则必须使用单引号或双引号。
- 注意:
var = value不同于var=value。把var=value写成var = value是一个常见的错误。两边没有空格的等号是赋值操作符,加上空格的等号表示的是等量关系测试。
在变量名之前加上美元符号($)就可以访问变量的内容。可以在printf、echo或其他命令的双引号中引用变量值:
#!/bin/bashfruit=apple
count=5
echo "We have $count ${fruit}(s)"
---------------------------------------------------
d. 环境变量
环境变量是从父进程中继承而来的变量。例如环境变量HTTP_PROXY,它定义了Internet连接应该使用哪个代理服务器。该环境变量通常被设置成:
HTTP_PROXY=192.168.1.23:3128
export HTTP_PROX
- export命令声明了将由子进程所继承的一个或多个变量。
- 这些变量被导出后,当前shell脚本所执行的任何应用程序都会获得这个变量。shell创建并用到了很多标准环境变量,我们也可以导出自己的环境变量。
PATH变量列出了一系列可供shell搜索特定应用程序的目录:
echo $PATH-> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
- 各目录路径之间以:分隔。$PATH通常定义在/etc/environment、/etc/profile或~/.bashrc中。
cat /etc/profile

如果需要在PATH中添加一条新路径,可以使用如下命令:
export PATH="$PATH:/home/user/bin" # 在环境变量中添加新的路径
echo $PATH-> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/home/usr/bin
另外还有一些众所周知的环境变量:HOME、PWD、USER、UID、SHELL等。
注意:使用单引号时,变量不会被扩展,仍依照原样显示。使用双引号会显示出该变量的值
echo '$PATH'-> $PATHecho "$PATH"-> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/home/usr/bin: No such file or directory
------------------------------
e. 获取变量值的长度
$ var=12345678901234567890
$ echo ${#var}
20
f. 识别当前使用的Shell
echo $SHELL
echo $0
3、使用函数添加环境变量
环境变量通常保存了可用于搜索可执行文件、库文件等的路径列表,如$PATH。
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
这意味着只要shell执行应用程序(二进制文件或脚本)时,它就会首先查找/usr/local/sbin,然后查找usr/local/bin 依次查找。
使用源代码构建并安装程序时,通常需要为新的可执行文件和库文件添加特定的路径。假设我们要将myapp安装到/opt/myapp,它的二进制文件在/opt/myapp/bin目录中,库文件在/opt/myapp /lib目录中。
将新路径添加到环境变量起始部分:
export PATH=/opt/myapp/bin:$PATH
使用函数添加环境变量:(案例没做出来)
我们可以在.bashrc文件中定义如下函数,简化路径添加操作:
prepend() { [ -d "$2" ] && eval $1=\"$2':'\$$1\" && export $1; }
该函数用法如下:
prepend PATH /opt/myapp/bin
- 函数prepend()首先确认该函数第二个参数所指定的目录是否存在。
- 如果存在,eval表达式将第一个参数所指定的变量值设置成第二个参数的值加上:(路径分隔符),随后再跟上第一个参数的原始值。
在进行添加时,如果变量为空,则会在末尾留下一个:。要解决这个问题,可以对该函数再做一些修改:
prepend() { [ -d "$2" ] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1 ; }
- 在这个函数中,我们引入了一种shell参数扩展的形式:
${parameter:+expression} - 如果parameter有值且不为空,则使用expression的值。
- 通过这次修改,在向环境变量中添加新路径时,当且仅当旧值存在,才会增加:。
-----------------------------------
相关文章:
001. 变量、环境变量
1、在终端中显示输出 shell脚本通常以shebang起始:#!/bin/bash/ shebang是一个文本行,其中#!位于解释器路径之前。/bin/bash是Bash的解释器命令路径。bash将以#符号开头的行视为注释。脚本中只有第一行可以使用shebang来定义解释该脚本所使…...
软考软件设计师刷题笔记整理
软件设计师 HTML代码中,创建指向邮箱地址的链接正确的是ARP攻击造成网络无法跨网段通信的原因是在软件开发过程中进行风险分析关于哈夫曼树的叙述关于风险管理的叙述ISO/IEC9126软件质量模型关于结构化开发方法的叙述分布式数据库中的分片透明、复制透明、位置透明和…...
Canal
canal译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 1.canal 工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议MySQL master 收到…...
SpringBoot实现mysql与clickhouse多数据源
一、我们来实现一个mysql与clickhouse多数据源配置 二、数据源配置 # 指定服务名称 spring:application:name: demobigdatadatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/db?createDatabaseIfNotExisttrue&useUnicodetrue&…...
为什么是LangChain?
文章目录 一、前言二、认识langchain1. langchain的主要组成2. 总览LangChain2. LangChain的六大核心模块1. Models:模型统一接口2. Prompts:管理 LLM 输入3. Chains:将 LLM 与其他组件相结合,执行多个chain4. Indexes:…...
Labview的分支判断
和其他的编程语言一样的。都会有switch,case, if ,else; 再combo box中实现 再后台程序中对应的写上逻辑就好了。...
蓝桥杯双周赛算法心得——串门(双链表数组+双dfs)
大家好,我是晴天学长,树和dfs的结合,其邻接表的存图方法也很重要。需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .串门 2) .算法思路 串门(怎么存图很关键…...
mysql 配置主从复制 及 Slave_SQL_Running = no问题排查
一、配置主数据库 1、在mysql 配置文件my.cnf中设置主数据库配置 server-id1 //唯一的标示符 log-binmysql-bin //开启二进制日志2、重启数据库 3、安全规范的写法是新建一个用户给这个用户复制的权限(直接用root也可以不建议) CREATE USER repl% IDEN…...
再获5G RedCap能力认证!宏电5G RedCap工业智能网关通过中国联通5G物联网OPENLAB开放实验室测试验证
近日,中国联通5G物联网OPENLAB开放实验室携手宏电股份完成5G RedCap工业智能网关端到端的测试验证,并颁发OPENLAB实验室面向RedCap终端的认证证书,为RedCap产业规模推广、全行业赋能打下坚实基础。 中国联通5G物联网OPENLAB开放实验室是中国…...
牛客--汽水瓶python
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。 小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。 数据范围:输入的正整数满足 1≤n≤100 注意ÿ…...
TSINGSEE智能分析网关V4车辆结构化数据检测算法及车辆布控
车辆结构化视频AI检测技术,可通过AI识别对视频图像中划定区域内的出现的车辆进行检测、抓拍和识别,系统通过视频采集设备获取车辆特征信息,经过预处理之后,接入AI识别算法并与车辆底库进行对比,快速识别车辆身份和属性…...
git解决冲突的方法。
1、 cherry-pick git fetch ssh://jingyou.caigerrit.transtekcorp.com:29418/leshan refs/changes/23/34123/3 && git cherry-pick FETCH_HEAD2、 文件解冲突! 3、 cherry-pick完整。 git cherry-pick --continue4、查看状态。 5、 push。 git push o…...
[MT8766][Android12] 取消WIFI热点超过10分钟没有连接自动关闭设定
文章目录 开发平台基本信息问题描述解决方法 开发平台基本信息 芯片: MT8766 版本: Android 12 kernel: msm-4.19 问题描述 之前有个需求要设备默认开启WIFI热点,默认开启usb共享网络;而热点在原生的设定里面有个超时机制,如果在限定时间内…...
智能中仍存在着许多未被发现的逻辑
自然规律不仅包括精确的也包括模糊的,即模糊的基本自然律意味着自然界中的现象与规律并不是绝对精确的,存在一定的模糊性和不确定性。因此,用数学来完全描述和预测这些现象可能会有限制。 智能与人工智能(AI)抑或智能化…...
基于公共业务提取的架构演进——外部依赖防腐篇
背景 有了前两篇的帐号权限提取和功能设置提取的架构演进后,有一个问题就紧接着诞生了,对于诸多业务方来说,关键数据源的迁移如何在各个产品落地? 要知道这些数据都很关键: - 对于帐号,获取不到帐号信息是…...
uniapp小程序接入腾讯云【增强版人脸核身接入】
文档地址:https://cloud.tencent.com/document/product/1007/56812 企业申请注册这边就不介绍了,根据官方文档去申请注册。 申请成功后,下载【微信小程序sdk】 一、解压sdk,创建wxcomponents文件夹 sdk解压后发现是原生小程序代…...
Sass 最基础的语法
把每个点最简单的部分记录一下,方便自己查找 官方文档链接 Sass 笔记 1. & 父选择器,编译后为父选择器2. : 嵌套属性3. $ 变量3.1 数据类型3.2 变量赋值3.3. 数组3.4. map 4. 算数运算符5. #{}插值语法5.1 可以在选择器或属性名中使用变量5.2 将有引…...
2023年11月数据库流行度最新排名
点击查看最新数据库流行度最新排名(每月更新) 2023年11月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多,这个数据库就被认为越受欢迎。这是一个领先指标。原始数…...
JavaEE-部署项目到服务器
本部分内容为:安装依赖:JDK,Tomcat,Mysql;部署项目到服务器 什么是Tomcat Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器。 为什么我们需要…...
计算机网络期末复习-Part1
1、列举几种接入网技术:ADSL,HFC,FTTH,LAN,WLAN ADSL(Asymmetric Digital Subscriber Line):非对称数字用户线路。ADSL 是一种用于通过电话线连接到互联网的技术,它提供…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
