三、shell - 变量

目录

1、简介

1.1 变量的定义语法:

1.2 变量的定义需遵循的规则

1.3 变量的作用域

2、用户变量

2.1 定义变量

2.2 访问变量

2.3 变量的其他赋值方式

2.4 只读变量

2.5 删除变量

​​​​​​​3、环境变量

​​​​​​​3.1 常见的环境变量

​​​​​​​3.2 自定义环境变量

​​​​​​​4、特殊变量


1、简介

shell变量是一种很“弱”的变量,默认情况下,一个变量保存一个串,shell不关心这个串是什么含义。所以若要进行数学运算,必须使用一些命令例如let、declare、expr、双括号等。

在shell中有3种变量:用户变量、环境变量、特殊变量,其中用户变量在编程过程中使用量最多,环境变量主要是在程序运行时需要设置,特殊变量在对参数判断和命令返回值判断时会使用。

1.1 变量的定义语法:

变量名=变量值

1.2 变量的定义需遵循的规则

  1. 变量名可以由字母、数字和下画线组成,但是不能以数字开头。
  2. 在 Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须使用特殊命令。
  3. 变量用等号"="连接值,"="左右两侧不能有空格
  4. 变量值中如果有空格,则需要使用单引号或双引号包含,如 test="hello world!"。双引号括起 来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符。
  5. 在变量值中,可以使用转义符"\"。
  6. 不能使用bash里的关键字(可用help命令查看保留关键字)。

1.3 变量的作用域

当前文件

2、用户变量

​​​​​​​2.1 定义变量

在对变量赋于字符串值时,建议使用引号将其包裹。如果字符串中存在空格,请一定要使用单引号或双引号将整个内容包裹。

注意:单引号里的内容原封不动的输出,双引号里有变量的调用则会调用变量

[root@node1 shell]# username="geeker"

​​​​​​​2.2 访问变量

要对变量进行调用时,在变量名前加美元符号$

[root@node1 shell]# echo $username

geeker

如果需要增加变量的值,那么可以进行变量值的叠加。不够变量需要用双引号包含"$变量名"或${变量名}

[root@node1 ~]# usernmae="geeker" 

[root@node1 ~]# echo $usernamedb.log #这种方式不可以 

.log

[root@node1 ~]# echo "$username"db.log #可以

geekerdb.log

[root@node1 ~]# echo ${username}db.log #可以 

geekerdb.log

测试脚本

脚本内容:test1.sh

#!/bin/bash 

string="I am shell" 

num=5 

echo "a=${num},string=${string}"

执行脚本

[root@node1 shell]# sh test1.sh

a=5,string=I am shell

​​​​​​​2.3 变量的其他赋值方式

  1. 可以使用read关键字从键盘获取内容赋值给变量
  2. 可以通过$(linux命令)或者$`linux命令`来执行linux命令,并将命令的执行结果赋值给变量

脚本内容:test2.sh

#!/bin/bash 

echo "who are you?" 

read name  #从键盘获取变量的值 

pwd_string=$(pwd) #将当前的绝对路径赋值给pwd_string变量 

date_string=`date` #将当前时间赋值给date_string变量,注意这里使用的是反引号

echo "hello, $name" 

echo $pwd_string 

echo $date_string 

执行脚本

[root@node1 shell]# sh test2.sh

who are you?

geeker

hello, geeker

/export/data/shell

2020年 05月 10日 星期日 16:50:21 CST

​​​​​​​2.4 只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

test3.sh

#!/bin/bash 

myUrl="http://www.google.com"

readonly myUrl

myUrl="http://www.runoob.com"

运行脚本,结果如下:

/bin/sh: NAME: This variable is read only.

​​​​​​​2.5 删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

实例:

test4.sh

#!/bin/sh 

myUrl="http://www.runoob.com" 

unset myUrl

echo $myUrl

以上实例执行将没有任何输出。

​​​​​​​3、环境变量

环境变量:当shell程序启动时,都自动设置一组变量,shell中的所有命令都可以使用这些变量。环境变量可以在/etc/profile中设置,环境变量的名字习惯上使用大写字母

​​​​​​​3.1 常见的环境变量

可以使用env命令查看所有的系统环境变量

[root@node1 shell]# env

XDG_SESSION_ID=2

HOSTNAME=node1

SELINUX_ROLE_REQUESTED=

TERM=xterm

SHELL=/bin/bash

HISTSIZE=1000

SSH_CLIENT=192.168.88.5 8047 22

CONDA_SHLVL=0

SELINUX_USE_CURRENT_RANGE=

SSH_TTY=/dev/pts/0

USER=root

常见的环境变量:

PATH 决定了shell将到哪些目录中寻找命令或程序 

HOME 当前用户主目录 

HISTSIZE 历史记录数 

LOGNAME 当前用户的登录名 

HOSTNAME 指主机的名称 

SHELL 当前用户Shell类型 

LANGUGE  语言相关的环境变量,多语言可以修改此环境变量 

MAIL 当前用户的邮件存放目录 

PS1 基本提示符,对于root用户是#,对于普通用户是$

​​​​​​​3.2 自定义环境变量

1) vi /etc/profile ,在文件末尾加上要定义的环境变量,语法如下:

export 变量名=变量值

export SERVICE_HOST=www.geeker.cn

2) wq 退出

3) source /etc/profile

4) 输入 env 查看环境变量,是否有自己定义的环境变量

5) 使用环境变量

 环境变量的使用方式和普通变量是一样的:$环境变量名

[root@node1 shell]# echo $SERVICE_HOST

www.geeker.cn

​​​​​​​4、特殊变量

我们可以在执行 Shell 脚本时,向脚本传递参数,这时候可以使用特殊变量来获取参数,Shell常用的特殊变量如下:

变量

解释

$#

命令行参数的个数

$n

$1表示第一个参数,$2表示第二个参数,以此类推

$0

当前程序的名称

$?

前一个命令或许或函数的返回码

$*

“参数1 参数2 。。。”形式保存所有参数

$@

“参数1”“参数2”。。。形式保存所有参数

$$

本程序的(进程ID号)PID

$!

上一个命令的PID

实例:

以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:

test5.sh

#!/bin/bash 

echo "Shell 传递参数实例!"; 

echo "执行的文件名:$0"; 

echo "第一个参数为:$1"; 

echo "第二个参数为:$2"; 

echo "第三个参数为:$3"; 

echo "参数个数为:$#"; 

echo "传递的参数作为一个字符串显示*:$*"; 

执行脚本:

[root@node1 shell]# chmod +x test5.sh

[root@node1 shell]# ./test5.sh aaa bbb ccc

Shell 传递参数实例!

执行的文件名:./demo4.sh

第一个参数为:aaa

第二个参数为:bbb

第三个参数为:ccc

参数个数为:3

传递的参数作为一个字符串显示*:aaa bbb ccc

$* 与 $@ 区别:

相同点:都是引用所有参数。

不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " $* " 等价于 "1 2 3"(传递了一个参数),而 "$@" 等价于 "1" "2" "3"(传递了三个参数)

【下一章​​​​​​​】

四、shell - 字符串

【往期回顾】

一、shell编程简介
二、shell编程快速入门

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

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

相关文章

030 - STM32学习笔记 - ADC(四) 独立模式多通道DMA采集

030 - STM32学习笔记 - ADC(四) 独立模式多通道DMA采集 中断模式和DMA模式进行单通道模拟量采集,这节继续学习独立模式多通道DMA采集,使用到的引脚有之前使用的PC3(电位器),PA4(光敏…

【刷题笔记】串联所有单词的子串||暴力通过||滑动窗口

串联所有单词的子串 1 题目描述 https://leetcode.cn/problems/substring-with-concatenation-of-all-words/ 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 …

arXiv学术速递笔记11.29

文章目录 一、自动驾驶/目标检测Improving Lane Detection Generalization: A Novel Framework using HD Maps for Boosting DiversityTowards Full-scene Domain Generalization in Multi-agent Collaborative Birds Eye View Segmentation for Connected and Autonomous Driv…

Linux 磁盘管理详细指南

目录 前言 显示文件系统的磁盘空间 显示文件或目录的磁盘空间 lsblk 列出块设备信息 fdisk 磁盘分区 mkfs 格式化分区 Swap mount 挂载 前言 可以使用图形界面工具来进行分盘、挂载等操作,这会更直观和易于操作。 显示文件系统的磁盘空间 "df"命…

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示整数、小数应用

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示整数、小数应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍IIC通信简单介绍…

【每日一题】1657. 确定两个字符串是否接近-2023.11.30

题目: 1657. 确定两个字符串是否接近 如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 : 操作 1:交换任意两个 现有 字符。 例如,abcde -> aecdb操作 2:将一个 现有 字符的…

RSA实现中弱密钥漏洞分析(Analyzing Weak Key Vulnerabilities in RSA Implementation)

点我完整下载:《RSA实现中弱密钥漏洞分析》本科毕业论文一万字.doc RSA实现中弱密钥漏洞分析 "Analyzing Weak Key Vulnerabilities in RSA Implementation" 目录 目录 2 摘要 3 关键词 4 第一章 引言 4 1.1 研究背景 4 1.2 研究目的 5 1.3 研究意义 6 第…

【随笔】个人面试纪录

面试被问了几个问题。 1.mount怎么用 没答上来&#xff0c;说的 --help 可以看 mount --help | less mount [ --source ] <source> | [ --target ] <target> 2.ansible怎么用&#xff0c;有哪些常用的模块 ansible <hosts|all> -m <module> 常用的模块…

vue运用el-table常见问题及案例代码

前言 el-table 是 Element UI 的一个组件,用于在 Vue.js 应用程序中创建数据表格。下面是一些常见的 el-table 问题以及相应的案例代码。 如何动态加载数据?你可以通过使用 v-model 指令和 el-table-column 组件来动态加载数据。以下是一个示例: <template> <el…

解决plot画图中文乱码问题(macbook上 family ‘sans-serif‘ not found)

一、matplotlib画图中文乱码问题 使用matplotlib.pyplot画图&#xff0c;有中文字体会显示乱码问题&#xff0c;这时需要添加如下代码&#xff1a; import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] ["SimHei"]二、macbook没有SimHei的…

分布式仿真SNN的思考

我之前实现的仿真完全基于如下图设计的 将整体的网络构成见一个邻接表&#xff0c;突触和神经元作为类分别存储&#xff0c;所以当一个神经元发射脉冲时&#xff0c;很容易的将脉冲传输到突触指向的后神经元。但是在分布式方丈中&#xff0c;由多个进程仿真整体的网络&#xff…

WPS导出的PDF比较糊,和原始的不太一样,将带有SVG的文档输出为PDF

一、在WPS的PPT中 你直接输出PDF可能会导致一些问题&#xff08;比如照片比原来糊&#xff09;/ 或者你复制PPT中的图片到AI中类似的操作&#xff0c;得到的照片比原来糊&#xff0c;所以应该选择打印-->高级打印 然后再另存为PDF 最后再使用AI打开PDF文件再复制到你想用…

【驱动】SPI驱动分析(七)-SPI驱动常用调试方法

用户态 用户应用层使用spidev驱动的步骤如下&#xff1a; 打开SPI设备文件&#xff1a;用户可以通过打开/dev/spidevX.Y文件来访问SPI设备&#xff0c;其中X是SPI控制器的编号&#xff0c;Y是SPI设备的编号。配置SPI参数&#xff1a;用户可以使用ioctl命令SPI_IOC_WR_MODE、S…

trait 特征

trait&#xff08;特征&#xff09;RUST用来以一种抽象的方式来定义共享行为&#xff0c;还可以使用trait约束用来将泛型参数指定为实现了某些特征行为的类型。通过trait将特定方法签名组合起来&#xff0c;用来实现某种目的所必须的行为集合。 pub trait Summary {fn summari…

中国技协城市主产业职业技能(上海)联赛暨全 国网络与信息安全管理员职工职业技能竞赛—线上赛初赛a

目录 一、理论题 二、CTF 1.赛前测试:f12_me 2.WEB:VersionControl 3.MISC:SecretDocume 4.Reverse:pyc

基于单片机的排队叫号系统设计

1&#xff0e;设计任务 利用AT89C51单片机为核心控制元件,设计一个节日彩灯门&#xff0c;设计的系统实用性强、操作简单&#xff0c;实现了智能化、数字化。 基本要求&#xff1a;利用单片机AT89C51设计排队叫号机&#xff0c;能实现叫号功能。 创新&#xff1a;能显示叫号…

猫头虎分享ubuntu20.04下VSCode无法输入中文解决方法

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

qt 5.15.2 的编译部署quazip-0.7.3项目过程

qt 5.15.2 的编译部署quazip-0.7.3项目过程 &#xff08;一&#xff09;先下载quazip-0.7.3项目源代码 下载地址&#xff1a;https://sourceforge.net/projects/quazip/ 更新版本参考地址下载&#xff1a;https://github.com/stachenov/quazip (二) 用qt creater打开下载的q…

【网络控制】

网络控制 “网络控制”&#xff08;Network Control&#xff09;通常指的是通过网络对远程设备、系统或服务进行管理和监控的过程。这可以包括远程设备的配置、监测、故障排除、升级等操作。网络控制的目的是在分布式环境中实现对各种网络设备和资源的远程管理。 网络控制的关…

【EasyExcel】导出excel并支持自定义设置数据行背景颜色等

需求背景&#xff1a; 根据查询条件将列表数据导出&#xff0c;并筛选出满足某个条件的数据&#xff0c;将满足条件的数据的背景颜色设置成黄色。 &#xff08;本文例子如&#xff1a;name出现的次数大于等于2&#xff0c;将相关数据背景颜色都设置为黄色&#xff09; …