001. 变量、环境变量

news2024/11/25 1:05:01
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/bash

printf "%-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/bash

fruit=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'
	-> $PATH
  
echo "$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的值。
  • 通过这次修改,在向环境变量中添加新路径时,当且仅当旧值存在,才会增加:。

-----------------------------------

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

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

相关文章

[工业自动化-5]:西门子S7-15xxx编程 - PLC系统初识别 :PLC概述与发展史

目录 前言: 一、PLC的由来:自动化产线的大脑 二、PLC发展史 三、常见的PLC厂家:欧洲日本 四、PLC VS 电脑 4.1 PLC VS CPU 4.2 PLC VS 单片机 4.3 PLC VS 工控机 五、PLC系统组成 参考: 前言: 一、PLC的由来…

黑客(网络安全)技术——高效自学

前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学 今天给大家分享一下,很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习…

PTA_乙级_1002

思路&#xff1a;不仅超出int还超出Longlong,直接用string类型定义n&#xff0c;for循环来遍历每一位字符然后转换成数字进行累加&#xff0c;再用to_string把数字和转换成字符串&#xff0c;再用for循环把数字和的每一位定位到pinyin字符串数组上输出 #include <iostream&…

【C++】AVL树的4中旋转调整

文章目录 前提一、AVL树的结构定义二、AVL的插入&#xff08;重点&#xff09;1. 插入的结点在较高左子树的左侧&#xff08;右单旋&#xff09;2. 新节点插入较高右子树的右侧&#xff08;左单旋&#xff09;3.新结点插入较高右子树的左侧&#xff08;先右单旋再左单旋&#x…

MFC-TCP网络编程服务端-Socket

目录 1、通过Socket建立服务端&#xff1a; 2、UI设计&#xff1a; 3、代码的实现&#xff1a; &#xff08;1&#xff09;、CListenSocket类 &#xff08;2&#xff09;、CConnectSocket类 &#xff08;3&#xff09;、CTcpServerDlg类 1、通过Socket建立服务端&#xff…

ts面试题总结

文章目录 前言ts和js的区别&#xff1f;什么是Typescript的方法重载&#xff1f;Typescript中never 和 void 的区别&#xff1f;typescript 中的 is 关键字有什么用&#xff1f;TypeScript支持的访问修饰符有哪些&#xff1f;如何定义一个数组&#xff0c;它的元素可能是字符串…

11-2 mybatis入门细节

mybatis Mybatis 单表CURD细节 ${} 与#{} 区别(面试题) ${} 拼接sql 造成sql注入 #{} 使用?占位 如果作为值, 推荐使用#{} ${} 实现一些动态排序,使用 #{column} select * from tb_userinfo order by ? desc column: id 赋值 sql: select * from tb_userinfo order by id …

AIGC,ChatGPT 快速批量处理Word文本内容

在文档编辑与创作的过程中,会避免不了,输入错误内容与打错字的情况。 如果我们一个一个手动去修改,会比较费时间。 如下: 进行内容修改与更新的时候,我们知道可以使用Ctrl+H 来查找与替换,但查找与替换一次也只能替换一个值。

博捷芯BJCORE:划片机在划切工艺中需要注意以下几点

划片机在划切工艺中需要注意以下几点&#xff1a; 1. 测高时工作台上不能有任何物品&#xff0c;以免影响测高精度。 2. 切割前检查参数是否正确选择&#xff0c;包括切割速度、切割深度等。 3. 更换刀片时&#xff0c;检查刀片是否平稳旋转&#xff0c;确保刀片安装牢固。 …

开发知识点-stm32/ESP32/Mega2560嵌入式设计

嵌入式设计 STM32四轴飞行器原理图解析小马哥 DragonFly四轴软件开发 13 STM32 SPI总线通讯SPI 总线协议简介SPI 物理层SPI 协议层SPI 通信时序 STM32硬件SPI接口简介SPI接口 利用库函数初始化配置 ESP32 “F:\res\marlin-2.0.x” “F:\res\Marlin-2.1.2” STM32四轴飞行器 小…

深度学习中的“钩子“(Hook):基于pytorch实现了简单例子

目录 基本概念一个详细的示例 基于resnet50的一个hook应用例子前向传播示例反向传播示例 基本概念 在深度学习中&#xff0c;“钩子”&#xff08;Hook&#xff09;是一种机制&#xff0c;可以在神经网络的不同层或模块中插入自定义的代码&#xff0c;以便在网络的前向传播或反…

python开发数字人助理版

Fay数字人助理版是fay开源项目的重要分支&#xff0c;专注于构建智能数字助理的开源解决方案。它提供了灵活的模块化设计&#xff0c;使开发人员能够定制和组合各种功能模块&#xff0c;包括情绪分析、NLP处理、语音合成和语音输出等。Fay数字人助理版为开发人员提供了强大的工…

第三章《补基础:不怕学不懂概率统计》笔记

3.1 什么是概率 概率亦称“或然率”&#xff0c;它反映随机事件出现的可能性大小&#xff0c;在现实生活中有着极其普遍的应用。 3.1.1 最简单的概率的例子 3.1.2 概率论与数理统计的关系 概率论与数理统计的关系可以概括为&#xff0c;概率论是数理统计的理论基础&#xf…

fastspar微生物相关性推断

fastspar 简介 fastspar是基于Sparcc通过C编写的&#xff0c;速度更快&#xff0c;内存消耗更少。sparcc是基于OTU的原始count数&#xff0c;通过log转换和标准化去除传统相对丰度的天然负相关&#xff08;因为所有OTU之和为1&#xff0c;某些OTU丰度高另外一些自然就少&…

nssm部署nginx

nssm install Nginx8098 --安装nginx nssm start Nginx8098 --启用nginx nginx 选择nginx路径&#xff0c;安装

Kyligence Copilot 亮相第六届进博会,增添数智新活力

11月5日&#xff0c;第六届中国国际进口博览会&#xff08;以下简称“进博会”&#xff09;在上海国家会展中心盛大启幕&#xff0c;众多新科技、新成果、新展品亮相本届进博会。作为阿斯利康&#xff08;AstraZeneca&#xff09;合作伙伴&#xff0c;跬智信息&#xff08;Kyli…

ApiFox添加全局参数

文章目录 Apifox右上角打开 管理环境Apifox右上角打开 管理环境 我们发现,从登录以后,在请求其他接口,每次都需要添加一个Header 头信息.这样很繁琐.那Apifox是否支持我们设置全局参数呢?方便我们每次调用需要添加Header参数的接口需要每次都重新编写.当然支持,下面带着大家配…

Hikyuu 1.3.0 发布,高性能量化交易研究框架

Hikyuu 是一款基于 C/Python 的高性能开源量化交易研究框架&#xff0c;用于快速策略分析及回测。与其他量化平台或回测软件相比&#xff0c;具备&#xff1a; 超快的回测速度&#xff1b;对完整的系统交易理念进行抽象&#xff0c;并分解为不同的组件&#xff0c;通过重用不同…

Redis被攻击纪实

一、前言 声明&#xff1a;本文仅供技术交流使用&#xff0c;严禁采用本文的方法进行任何非法活动。 上周新来的同事分享Redis的原理和机制&#xff0c;想起2017年的时候测试环境Redis被攻击&#xff0c;最后只能重新安装服务器&#xff0c;今天试验一把利用Redis漏洞进行攻击…

Hybrid综合应用

1、需求 实现不同vlan间PC不可互访&#xff0c;而不同vlan的PC均可访问服务器的特殊效果&#xff0c;具体要求如下。 1&#xff09;在交换机中创建相关vlan 2&#xff09;修改端口模式与pvid 3&#xff09;修改端口允许通过的数据帧 4&#xff09;结果验证&#xff0c;vlan5与…