Linux:Bash中变量的定义与使用

news2024/9/27 23:25:02

  相关文章

Linux专栏icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12234591.html


        在bash shell中,变量(variable)是参数(parameter)的一类,用于存储值,且变量还可以拥有属性(attributes),这通过bash内建命令declare来完成。

        一个存储空字符串的变量被看做是未设置(unset)的变量,可以通过bash内建命令unset将一个已设置的变量转化成未设置的。

        给一个变量赋值可以通过下面的命令来完成。

name=[value]

        其中的name是一个合法的标识符,由数字、字母和下划线组成,且不能以数字开头。name后面必须紧跟=,不能有空格。如果有空格,则bash会将name解析成一个命令,而后面的=[value]解析为它的参数,这是一个错误。令人遗憾的是,即使用反斜杠\将空格转义,bash依然无法识别name =[value]这样的命令。[value]和=之间可以有空格,但这个空格必须被引号包围或反斜杠转义,否则空格之后的部分会被当做另一个命令名而不是value的一部分(这很有趣,在赋值命令后加其他命令不需要使用;分开,只需要使用空格分开)。value中如果有空格,则也需要使用引号包围或反斜杠转义,原因同理。下面展示了这些性质。

例1
1a=test1   
bash: 1a=test1: command not found...  //错误,name不能以1开头,否则会被识别为命令名

a =test1
bash: a: command not found...         //错误,name和value之间不能有空格,否则name会被单独解析为一个命令名

a\ =test1                             
bash: a =test1: command not found...  //错误,即使转义空格,bash依旧识别不了这种格式

a= test1
bash: test1: command not found...     //错误,这会被解析为将空字符串赋值给a,并执行test1命令

a=\ test1   //bash可以解析这种格式的赋值
echo "$a"   //使用了双引号"",为的是打印出变量a的值中空格,否则其会被解析为分隔符                   
 test1      //前面有空格

a=" test1"  //bash可以解析这种格式的赋值
echo "$a"   //使用了双引号"",为的是打印出变量a的值中空格,否则其会被解析为分隔符                   
 test1      //前面有空格

a=te st1
bash: st: command not found...        //错误,st会被解析为另一个命令

a=test1 echo $a         //这是合法的,echo命令可以正常执行,而无需;分隔
test1

a="te st1"  //bash可以解析这种格式的赋值
echo "$a"   //使用了双引号"",为的是打印出变量a的值中空格,否则其会被解析为分隔符                   
te st1      //变量值中有空格

        赋值命令中的value在使用前会首先进行拓展(实际上所有命令在解析前都会进行拓展,比如大括号拓展、波浪号拓展、参数(变量)拓展、命令替换、算数拓展、路径拓展等),在这里我们只涉及到简单的变量拓展,就是以$name或${name}这种形式出现的拓展,它们两者的区别在于,后者更清晰的体现了变量名字的范围,而前者依赖bash解析到一个不合法的name字符从而确定name的范围。但需要注意的是,name在拓展后不会被解析为赋值语句,下面举例说明这些性质。

例2
a=test1   //给a变量赋值test1
b=$a      //这条命令在执行前会先拓展为b=test1
echo $b   //这条命令在执行前会先拓展为echo test1
test1
b=$aa     //错误,变量拓展是贪婪的,这代表着bash会把aa解析为一个变量名($aa后的换行符不是合法的命名字符),而不是$a再加上a
b=${a}a   //这是正确的,因为{}明确指出了参数名的范围,所以参数拓展后为b=test1a
echo $b   //这条命令在执行前会先拓展为echo test1a
test1a
c=b      
$c=$a     //错误,即使name也使用了参数拓展,bash也无法识别这种形式的赋值语句
bash: b=test1: command not found...

        例1中还使用了双引号"...",它使得其引用内容中的拓展正常进行(它不会使$失去作用,除此之外还有反引号`和某些条件下的转义符\),但它会使得其引用内容中的一些字符失去其特殊意义(空格、换行符等),只代表其字面意思,例如空格符,bash一般会将其当做分隔命令和其选项、参数的依据,而一个包含在双引号""内的空格符则只代表空格的字面意思。而单引号'...'的作用更加激进,它使得其引用内容的拓展也不进行,字符也都失去其特殊意义。

        还有一个需要提到的是转义符\,它能使其后的任何一个字符失去其特殊意义(包括自己),当转义符被包括在双引号中,转义符在其后是$、`、"、\或换行符时保持其转义的能力,否则被当做字面量,例如其后紧跟着双引号或单引号的末尾,则双引号或单引号的末尾被转义,则此时后面还需要一个没有被转义的末尾来结束引用,简单来说就是,如果硬碰硬,则引号会被转义符打败。下面的例3说明了这些性质。

例3
echo     hello world   //不使用引号,则其hello world前的空格都会被当做分隔符,最终echo获得两个参数hello和world
hello world
echo "   hello world"  //使用引号,则其hello world前的空格不会被当做分隔符,最终echo获得一个参数"   hello world"
   hello world
a=test1
echo "$a"              //双引号内的拓展可以正常进行,echo命令在执行前被拓展为echo "test1"
test1
echo '$a'              //单引号内的拓展不进行,echo命令为其字面意思echo '$a'
$a
echo "te'$a'st"        //双引号内可以直接嵌套单引号,此时单引号值表现其字面意思,因此$a的拓展可以进行,拓展为echo "te'test1'st"
te'test1'st
echo \$a               //转义符使$失去特殊意义,拓展不进行
$a
echo '$a'              //单引号使$失去特殊意义,拓展不进行
$a
echo "\$a"             //双引号本应使得转义符\失去特殊意义,但其后是$,因此转义符保持其转义能力$被转义,拓展不进行
$a
echo "\1"              //双引号本因转义符\失去特殊意义,只有字面意义
\1

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

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

相关文章

Python 第四十三章 MYSQL 补充

多表查询 1.笛卡尔积:将两表所有的数据一一对应,生成一张大表 select * from dep,emp; #两个表拼一起 select * from dep,emp where dep.id emp.dep_id; #找到两表之间对应的关系记录 select * from dep,emp where dep.id emp.dep_id and dep.name技术; #筛选部门名称为技…

springboot优雅停机

import org.springframework.context.annotation.Configuration;import javax.annotation.PreDestroy;Configuration public class DataBackupConfig {PreDestroypublic void backData(){System.out.println("开始备份..."System.currentTimeMillis());System.out.pr…

基于springboot留守儿童爱心网站源码和论文

随着留守儿童爱心管理的不断发展,留守儿童爱心网站在现实生活中的使用和普及,留守儿童爱心管理成为近年内出现的一个热门话题,并且能够成为大众广为认可和接受的行为和选择。设计留守儿童爱心网站的目的就是借助计算机让复杂的管理操作变简单…

如何实现无公网ip远程访问本地websocket服务端【内网穿透】

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

数据结构奇妙旅程之二叉树题型解法总结

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

【推荐100个unity插件之16】3D物品描边效果——Quick Outline免费插件

文章目录 前言地址介绍使用例子完结 前言 关于3D描边,其实之前有用shader弄过一个:【实现100个unity特效】shader实现3D物品闪光和描边效果 但是很遗憾的是他不支持URP项目,所以现在推荐这款插件,他能很好的支持URP,…

每日一题 2859. 计算 K 置位下标对应元素的和(简单)

每次有空做每日一题,都碰到简单题。。。。。。 class Solution:def sumIndicesWithKSetBits(self, nums: List[int], k: int) -> int:ans 0for i in range(len(nums)):cnt 0t iwhile t > 0:cnt 1 if t & 1 1 else 0t >> 1ans nums[i] if cnt…

嵌入式工程师如何写好技术文档

嵌入式方案设计文档该怎么写?你是不是从来没有想过这个问题?今天就来分享一篇优秀的文章: 很多技术人自己非常轻视技术文档的书写,然而又时常抱怨文档不完善、质量差、更新不及时…… 这种在程序猿间普遍存在的矛盾甚至已经演变成…

【LeetCode】222. 完全二叉树的节点个数(简单)——代码随想录算法训练营Day16

题目链接:222. 完全二叉树的节点个数 题目描述 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值&#xf…

电工必备:故障电弧探测器安装方式

故障电弧探测器可以对故障电弧(包括故障并联电弧、故障串联电弧)进行有效的检测, 当检测到线路中存在引起火灾的故障电弧时,可以进行现场的声光报警,并将报警信息传输 给电气火灾监控设备。 故障电弧探测器适用于工…

Python连接MQTT服务器订阅和发布主题-Python物联网开发

一、前言 在物联网开发中,掌握MQTT可以说是一项必备的技能,要使用Python连接MQTT服务器、订阅和发布主题,我们需要导入paho-mqtt库。 二、实现代码 在之前的文章中,我们也介绍了JAVA是如何连接MQTT服务器实现发布和订阅主题的功能…

详细介绍node中动态数据内容的压缩应用

未使用 compression 压缩文件时 代码演示: const express require("express"); // 在node express框架当中,对node express框架进行一个引入const app express(); // 利用express()调用,对实例化对象进行获取app.get("/&q…

外汇天眼:美国证券交易委员会(SEC)采纳了一系列规定,以加强与特殊目的收购公司(SPACs)相关的投资者保护

美国证券交易委员会(SEC)今天通过了一系列新规和修订,以增强特殊目的收购公司(SPACs)的首次公开募股(IPOs)中的披露,并在SPACs与目标公司之间的后续业务合并交易(de-SPAC…

FinBert模型:金融领域的预训练模型

文章目录 模型及预训练方式模型结构训练语料预训练方式 下游任务实验结果实验一:金融短讯类型分类实验任务数据集实验结果 实验二:金融短讯行业分类实验任务数据集实验结果 实验三:金融情绪分类实验任务数据集实验结果 实验四:金融…

蓝桥杯省赛无忧 课件42 插入排序

01 插入排序的思想 02 插入排序的实现 03 例题讲解 #include <iostream> #include <vector> using namespace std; void insertionSort(vector<int>& arr) {int n arr.size();for (int i 1; i < n; i) {// 选择arr[i]作为要插入的元素int key arr…

linux系统配置本地yum源

配置本地yum源原因&#xff1a;没有网络&#xff0c;无法使用yum更新下载软件&#xff0c;所以验旧配置一个本地yum源 第一&#xff1a;挂载镜像或者拷贝一份目录下有repodate文件的源 1&#xff09;虚拟机cd/dvd需要绑定iso镜像文件如上图 2&#xff09;备份/etc/yum.repo.d目…

【SVD生成视频+可本地部署】ComfyUI使用(二)——使用Stable Video Diffusion生成视频 (2023.11开源)

SVD官方主页 &#xff1a; Huggingface | | Stability.ai || 论文地址 huggingface在线运行demo : https://huggingface.co/spaces/multimodalart/stable-video-diffusion SVD开源代码&#xff1a;Github&#xff08;含其他项目&#xff09; || Huggingface 在Comfyui使用&…

【Midjourney】绘画风格关键词

1.松散素描(Loose Sketch) "Loose sketch"&#xff08;松散素描&#xff09;通常指的是一种艺术或设计中的手绘风格&#xff0c;其特点是线条和形状的表现相对宽松、自由&#xff0c;没有过多的细节和精确度。这样的素描通常用于表达创意、捕捉概念或者作为设计的初步…

清华大学学生一行赴麒麟信安调研交流

1月24日&#xff0c;清华大学信息科学技术学院电子工程系学子组成的社会实践支队一行到访麒麟信安&#xff0c;调研交流长沙市先进计算产业发展情况和未来规划。 在公司展厅&#xff0c;清华大学学子详细了解了麒麟信安的发展历程、国产操作系统产业现状&#xff0c;以及麒麟信…