三、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 中所有字符串以任意顺序排列连接起来的子串。 …

基于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:将一个 现有 字符的…

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

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

分布式仿真SNN的思考

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

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

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

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

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

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

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

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

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

算法通关村第一关—链表高频面试题(白银)

链表高频面试题 一、五种方法解决两个链表的第一个公共子节点的问题 面试 02.07.链表相交1.首先想到的是暴力解,将第一个链表中的每一个结点依次与第二个链表的进行比较,当出现相等的结点指针时,即为相交结点。虽然简单,但是时间…

常见智力题汇总

常见智力题汇总 扔瓶子问题扑克牌问题出队问题烧绳子问题赛马问题求出前三名求出前五名 接水问题种树问题硬币问题宝石问题核酸检测问题 笔者最近面试遇到了好几道智力题,这些题目特点就是如果没有见过,很难第一时间思考得到答案,因此笔者面试…

VUE2+THREE.JS项目搭建

THREE项目搭建 简介学习文档推荐搭建1.下载three.js2.新建3DWorkShop.vue文件3.创建utils/three/tool.js4.创建components/three/draw.vue[重点]4.1 引入文件4.2 初始化场景4.3 初始化渲染器4.4 初始化光源4.5 初始化相机(人眼模式)4.6 初始化控制器4.7 初始化动画4.8 添加全局…

功率信号源简介及其应用有哪些内容

功率信号源是一种能够提供稳定输出功率信号的设备或电路。它在许多领域中都有广泛的应用。以下是一些关于功率信号源的内容: 功率信号源简介:功率信号源是一种电子设备或电路,它能够提供稳定的输出功率信号。功率信号源通常由放大器、稳压器、…

rest_framework_django学习笔记一(序列化器)

rest_framework_django学习笔记一(序列化器) 一、引入Django Rest Framework 1、安装 pip install djangorestframework2、引入 INSTALLED_APPS [...rest_framework, ]3、原始RESTful接口写法 models.py from django.db import models 测试数据 仅供参考 INSERT INTO de…

力扣:1419. 数青蛙

题目&#xff1a; 代码&#xff1a; class Solution { public:int minNumberOfFrogs(string croakOfFrogs){string s "croak";int ns.size();//首先创建一个哈希表来标明每个元素出现的次数&#xff01;vector<int>hash(n); //不用真的创建一个hash表用一个数…

如何使用高防CDN防护HTTPS 攻击?有什么优势?

随着互联网的普及&#xff0c;网络安全问题也日益凸显。其中&#xff0c;HTTPS 攻击是一种常见的网络安全威胁&#xff0c;它通过篡改网站数据、窃取用户信息等方式&#xff0c;给网站带来巨大的风险。为了有效防御 HTTPS 攻击&#xff0c;高防 CDN 成为了一个重要的工具。下面…

(项目已开源)社区求助 哪位大佬能不能帮我 将box1 audio 和 box2 slider滑块 和 box3 歌词滚动区域 进行联动

(项目已开源)社区求助 哪位大佬能不能帮我 将box1 audio 和 box2 slider滑块 和 box3 歌词滚动区域 进行联动 链接&#xff1a;https://pan.baidu.com/s/16lpEW6L5jrHfhsG7EXocLw?pwdkryy 提取码&#xff1a;kryy <!--社区求助 哪位大佬能不能帮我 将box1 audio 和 box2 s…

Nginx实现(动静分离)

动静分离应该是听的次数较多的性能优化方案&#xff0c;那先思考一个问题&#xff1a;「「为什么需要做动静分离呢&#xff1f;它带来的好处是什么&#xff1f;」」 其实这个问题也并不难回答&#xff0c;当你搞懂了网站的本质后&#xff0c;自然就理解了动静分离的重要性。先来…

通过C#获取Windows设置的夏令时开关

C#获取Windows夏令时开关 // 获取所有的时区信息 var allTimeZones TimeZoneInfo.GetSystemTimeZones().ToList();通过接口可以看到, 字段SupportsDaylightSavingTime代表是否支持配置夏令时 // 获取当前Window设置的时区 var tmpLocal TimeZoneInfo.Local;但是取Local 信息…