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

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

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

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

相关文章

openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144) - 验证

文章目录 openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144) - 验证概述笔记重复数字IO的问题想法手工实现程序实现确定要摘掉的数字重合线自动化测试的问题测试程序的场景测试程序的运行效果测试程序实现备注END openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-14…

Leetcode刷题详解——优美的排列

1. 题目链接:526. 优美的排列 2. 题目描述: 假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm(下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列 : perm[i] 能够被…

Win11专业版安装Docker Desktop,并支持映射主机的gpu

一、Windows环境下安装 Docker 必须满足: 1. 64位Windows 11 Pro(专业版和企业版都可以) 2. Microsoft Hyper-V,Hyper-V是微软的虚拟机,在win11上是自带的,我们只需要启动就可以了 二、下载Docker Desktop安装包 方式一:进入官网下载 https://docs.docker.com/desktop…

图论11-欧拉回路与欧拉路径+Hierholzer算法实现

文章目录 1 欧拉回路的概念2 欧拉回路的算法实现3 Hierholzer算法详解4 Hierholzer算法实现4.1 修改Graph,增加API4.2 Graph.java4.3 联通分量类4.4 欧拉回路类 1 欧拉回路的概念 2 欧拉回路的算法实现 private boolean hasEulerLoop(){CC cc new CC(G);if(cc.cou…

【已验证-直接用】微信小程序wx.request请求服务器json数据并渲染到页面

微信小程序的数据总不能写死吧,肯定是要结合数据库来做数据更新,而小程序数据主要是json数据格式,所以我们可以利用php操作数据库,把数据以json格式数据输出即可。 现在给大家讲一下微信小程序的wx.request请求服务器获取数据的用…

大数据毕业设计选题推荐-生产大数据平台-Hadoop-Spark-Hive

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

junit写搜索树测试

用法 assertTrue(range.contains("Two")); 2个参数,右边错就打印左边. AbstractSelfBalancingBinarySearchTree abt; AbstractBinarySearchTree.Node node; Before public void setUp() { abt new AbstractSelfBalancingBinarySearchTree() { Override protecte…

深度学习 python opencv 火焰检测识别 火灾检测 计算机竞赛

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

Mysql数据库 14.SQL语言 视图

一、视图的概念 视图:就是由数据库中一张或多张表根据特定的条件查询出的数据狗造成的虚拟表 二、视图的作用 安全性,简单性 三、视图的语法 语法 create view 视图表 as select_statement; 代码实现 #创建视图 将查询结果创建称为视图&#x…

百度王颖:百度文库以AI创作能力突破语言边界,促进思想碰撞和文化融通

1月9日,2023年世界互联网大会乌镇峰会“网络传播与文明交流互鉴论坛”召开。百度副总裁、互娱和垂类平台负责人王颖出席并发表“以技术搭建跨文化交流桥梁”主题演讲。她表示,在大模型的加持下,百度各个产品都在重构,通过技术助力…

第24章_mysql性能分析工具的使用

文章目录 1. 数据库服务器的优化步骤2.查看系统性能参数3. 统计SQL的查询成本:last_query_cost4. 定位执行慢的 SQL:慢查询日志4.1 开启慢查询日志参数4.2 查看慢查询数目4.3 测试慢sql语句,查看慢日志4.4 系统变量 log_output, l…

TensorFlow2.0教程3-CNN

` 文章目录 基础CNN网络读取数据卷积层池化层全连接层模型配置模型训练CNN变体网络简单的深度网络添加了其它功能层的深度卷积NIN网络文本卷积基础CNN网络 读取数据 import numpy as np import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.la…

uniapp中在组件中使用被遮挡或层级显示问题

uniapp中在组件中使用或croll-view标签内使用uni-popup在真机环境下会被scroll-view兄弟元素遮挡,在开发环境下和安卓系统中可以正常显示,但在ios中出现了问题 看了许多文章都没有找到问题的原因,最后看到这一个文章http://t.csdnimg.cn/pvQ…

138.随机链表的复制(LeetCode)

深拷贝,是指将该链表除了正常单链表的数值和next指针拷贝,再将random指针进行拷贝 想法一 先拷贝出一份链表,再对于每个节点的random指针,在原链表进行遍历,找到random指针的指向,最后完成拷贝链表random…

CSS3 分页、框大小、弹性盒子

一、CSS3分页&#xff1a; 网站有很多个页面&#xff0c;需要使用分页来为每个页面做导航。示例&#xff1a; <style> ul.pagination { display: inline-block; padding: 0; margin: 0; } ul.pagination li {display: inline;} ul.pagination li a { color: black; f…

SW如何显示样条曲线的控标

刚刚学习隔壁老王的sw画图时&#xff0c;怎么点都点不出样条曲线的控标&#xff0c;于是果断查询了一下解决方法&#xff0c;其实很简单&#xff0c;只不过是培训机构故意不说&#xff0c;叫你还解决不了&#xff0c;难受了就会花钱买他们的课了。毕竟如果学会了怎么解决问题了…

数据结构之双向链表

目录 引言 链表的分类 双向链表的结构 双向链表的实现 定义 创建新节点 初始化 打印 尾插 头插 判断链表是否为空 尾删 头删 查找与修改 指定插入 指定删除 销毁 顺序表和双向链表的优缺点分析 源代码 dlist.h dlist.c test.c 引言 数据结构…

devops完整搭建教程(gitlab、jenkins、harbor、docker)

devops完整搭建教程&#xff08;gitlab、jenkins、harbor、docker&#xff09; 文章目录 devops完整搭建教程&#xff08;gitlab、jenkins、harbor、docker&#xff09;1.简介&#xff1a;2.工作流程&#xff1a;3.优缺点4.环境说明5.部署前准备工作5.1.所有主机永久关闭防火墙…

学习c#的第五天

目录 C# 运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 C# 中的运算符优先级 C# 运算符 算术运算符 下表显示了 C# 支持的所有算术运算符。假设变量 A 的值为 10&#xff0c;变量 B 的值为 20&#xff0c;则&#xff1a; 运算符描述实例…

CentOs7 NAT模式连接网络

1.配置动态网络 1.1 检查主机网卡配置 检查主机的网络设置 进入控制面板&#xff0c;找到网络共享中心 查看适配器是否都已经开启 1.2 设置虚拟机的网络配置 打开虚拟机网络配置设置&#xff0c;对网卡VMnet8 进行设置 记住网关 全部选择应用&#xff0c;确定 1.3 设置…