如何巧妙运用Shell变量:掌握脚本编程的核心技巧

news2024/9/28 10:58:58

目录

  • 前言
  • 一、Shell变量——变量类型
    • 1、用户自定义变量
    • 2、环境变量
        • 用./ 启动脚本文件记得加权限哦
  • 二、Shell变量——变量赋值和访问
    • (一)变量定义
    • (二)变量的使用
    • (三)删除变量
    • (四)添加环境变量
    • (五)内部变量
    • (六)变量值输出
    • (七)变量值读取
    • (八)变量替换
  • 总结

前言

在现代计算中,Shell脚本作为一种强大的自动化工具,广泛应用于系统管理、数据处理及各种开发任务。理解Shell变量的使用和管理是编写高效脚本的基础。通过掌握用户自定义变量、环境变量及其赋值、访问和删除等操作,用户能够更灵活地控制脚本的执行流程,从而提高工作效率。本教程旨在深入探讨Shell变量的各个方面,为用户提供实用的操作示例和深入的理解。

一、Shell变量——变量类型

1、用户自定义变量

在编写Shell脚本时定义,可以在Shell程序内任意使用和修改。可以将它看作局部变量,仅在当前Shell实例中有效。
①创建一个脚本文件
vim zh.sh

②打开脚本文件后,将以下内容复制进去,然后输入 :wq 进行保存退出。
#!/bin/bash
name="John Doe"
age=30
echo "Hello, my name is $name and I am $age years old."
age=31
echo "Now I am $age years old."
在这里插入图片描述
如图:
在这里插入图片描述

③启动zh.sh 脚本文件
sh zh.sh

在这里插入图片描述

2、环境变量

在 Shell 脚本中,环境变量是系统为进程和程序提供的一种方式。环境变量通常是全局的,在整个系统中都可以访问,可以直接在 Shell 程序中使用这些环境变量,也可以在运行时对它们进行修改。

①创建一个脚本文件
vim zhh.sh

在这里插入图片描述
②打开脚本文件后,将以下内容复制进去,然后输入 :wq 进行保存退出。
#!/bin/bash
echo "脚本开始时的目录是:$(pwd)"
echo "当前用户的主目录是:$HOME"
cd $HOME
echo "当前目录是:$(pwd)"
echo "当前登录的用户名是:$USER"
echo "脚本结束时的目录是:$(pwd)"
在这里插入图片描述

③启动zhh.sh 脚本文件
bash zhh.sh./zhh.sh
在这里插入图片描述

用./ 启动脚本文件记得加权限哦

chmod +x ./zhh.sh
在这里插入图片描述

二、Shell变量——变量赋值和访问

(一)变量定义

  • 变量无须事先声明,给变量赋值也就是定义一个变量的过程

    变量名=值
    注意 = 两边没有空格

  • 变量名的命名应当遵循如下规则:

  • 首个字符必须为字母或下划线:name, _name是合法的,1name是不合法的。

  • 中间不能有空格:full_name是合法的,full name是不合法的。

  • 不能使用标点符号:user_name 是合法的,user-name 是不合法的。

  • 不能使用 Shell 关键字:if, for, whileShell 的关键字,不能作为变量名。

(二)变量的使用

①创建一个脚本文件
vim zhhh.sh
在这里插入图片描述

②打开脚本文件后,将以下内容复制进去,然后输入 :wq 进行保存退出。
#!/bin/bash
username="Alice"
user_age=30
echo "用户名:$username"
echo "年龄:$user_age"
username="Bob"
user_age=35
echo "新的用户名:$username"
ho "新的年龄:$user_age"

在这里插入图片描述

③启动zhhh.sh 脚本文件
bash zhh.sh./zhhh.sh

在这里插入图片描述

(三)删除变量

①打开脚本文件
vim zhh.sh

在这里插入图片描述

②打开脚本文件后,将以下内容复制进去,然后输入 :wq 进行保存退出。
#!/bin/bash
username="Alice"
user_age=30
echo "用户名:$username"
echo "年龄:$user_age"
unset username
unset user_age
echo "用户名:$username"
echo "年龄:$user_age"

在这里插入图片描述

③启动zhhh.sh 脚本文件
bash zhhh.sh./zhhh.sh

在这里插入图片描述

(四)添加环境变量

使用export命令将变量添加到环境中,作为临时的环境变量(一种全局变量)只在当前 Shell 会话中有效,关闭会话后将消失。

export 变量名=变量值

①创建一个脚本文件
vim zhhhh.sh

在这里插入图片描述

②打开脚本文件后,将以下内容复制进去,然后输入 :wq 进行保存退出。
#!/bin/bash
export MY_VAR="Old Value"
echo "原始 MY_VAR 的值是:$MY_VAR"
export MY_VAR="New Value"
echo "修改后的 MY_VAR 的值是:$MY_VAR"

在这里插入图片描述

③启动zhhhh.sh 脚本文件
bash zhhhh.sh./zhhhh.sh

在这里插入图片描述

如果是要使环境变量永久生效,可以将export命令添加到 .bashrc .bash_profile 文件中。 注意:测试前请备份.

(1)以编辑 .bashrc 文件为例
vim ~/.bashrc

(2) 在文件末尾添加
export MY_VAR="Persistent Value"

(3) 保存并退出,执行以下命令使修改生效
source ~/.bashrc

(五)内部变量

在这里插入图片描述
在这里插入图片描述

(六)变量值输出

①echo命令

  • 命令用于在屏幕上打印出指定的字符串,实现在标准输出的文本显示。它不仅可以用于简单的输出,还能实现更复杂的格式控制。
  • 输出控制:使用双引号包围输出内容可以防止 Shell 对大多数特殊字符进行解释。然而,美元符号($)、反引号(`) 和双引号(")在双引号中仍然保持特殊意义。如果需要在输出中显示这些字符,则需使用转义符(反斜杠 \)进行处理。

输入:

echo "显示美元符号:\$";echo "显示反引号:\";echo "显示双引号:\"";

在这里插入图片描述

②printf命令

  • 格式化输出:指定输出格式,如字符串、整数、浮点数等。
  • 控制宽度和对齐
  • 转义字符支持:使用转义字符进行格式化输出。
  • printf命令可以提供格式控制字符串,语法如下:

printf 格式字符串 [参数列表…]

打开脚本文件zhhh.sh后,将以下内容复制进去,然后输入 :wq 进行保存退出。

## 示例 1: 基本用法
printf "Hello, %s!\n" "World"

## 示例 2: 格式化数字
printf "整数:%d\n" 42
printf "浮点数:%.2f\n" 3.14159

## 示例 3: 多个参数
printf "名字: %s, 年龄: %d\n" "Alice" 28

## 示例 4: 控制宽度和对齐
printf "|%-10s|%5d|\n" "Alice" 30
printf "|%-10s|%5d|\n" "Bob" 40

## 示例 5: 使用转义字符
printf "这是第一行\n这是第二行\n"

启动zhhh.sh 脚本文件
bash zhhh.sh./zhhh.sh
在这里插入图片描述

(七)变量值读取

使用read命令可以将变量的值作为字符串从键盘读入

read 变量

在执行read命令时可以不指定变量参数,它会将接收到的数据放置在环境变量$REPLY 中。

①创建一个脚本文件
vim zzh.sh
在这里插入图片描述

②打开脚本文件后,将以下内容复制进去,然后输入 :wq 进行保存退出。
#!/bin/bash
echo "请输入您的名字:"
read name
echo "请输入您的年龄:"
read age
echo "请输入您的城市:"
read # 不指定变量名,输入存储在 $REPLY 中
echo "您的名字是:$name"
echo "您的年龄是:$age"
echo "您的城市是:$REPLY" # 使用 $REPLY

在这里插入图片描述

③启动zzh.sh 脚本文件
bash zzh.sh./zzh.sh
在这里插入图片描述

  • read读入的变量可以有多个,第一个数据给第一个变量,第二个数据给第二个变量,如果输入数据个数过多,则最后所有的值都给最后一个变量
  • 可以使用选项-n对输入的字符进行计数,当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。

①创建一个脚本文件
vim zhanghuan.sh

在这里插入图片描述

在这里插入图片描述

②打开脚本文件后,将以下内容复制进去,然后输入 :wq 进行保存退出。
#!/bin/bash
echo "请输入两个数字(用空格分隔):"
read num1 num2
echo "第一个数字是:$num1"
echo "第二个数字是:$num2"
echo "请输入最多5个字符:"
read -n 5 input
echo -e "\n您输入的字符是:$input"

③启动zhanghuan.sh 脚本文件
bash zhanghuan.sh./zhanghuan.sh
在这里插入图片描述

(八)变量替换

可以使用以下几种变量替换形式。

  • ${var}:替换为变量本来的值。 多个变量则${var1} ${var2}......
  • ${var:?message}:如果变量var 为空或已被删除,则将消息message发送到标准错误输出,可以用来检测变量var是否可以被正常赋值。

①创建一个脚本文件
vim zhovyx.sh

在这里插入图片描述

②打开脚本文件后,将以下内容复制进去,然后输入 :wq 进行保存退出。
#!/bin/bash
# 1. 使用 ${var}
var="Hello"
echo "当前变量的值是:${var}"
# 2. 使用 ${var:?message}
unset var # 删除变量
echo "检测变量是否已设置:${var:?变量未设置}"

在这里插入图片描述

③启动zhhh.sh 脚本文件
bash zhovyx.sh./zhovyx.sh

在这里插入图片描述

可以使用以下几种变量替换形式。

  • ${var:-word}:如果变量var为空或已被删除,则返回word,但不改变var的值。
  • ${var:=word}:如果变量var为空或已被删除,则返回word,并将var的值设置为 word。
  • ${var:+word}:如果变量var 被定义,则返回 word,但不改变 var 的值。

①创建一个脚本文件
vim yoona.sh
在这里插入图片描述

②打开脚本文件后,将以下内容复制进去,然后输入 :wq 进行保存退出。
#!/bin/bash
# 1. 使用 ${var:-word}
unset var
echo "变量未设置时的输出:${var:-hello1}"
echo "变量未设置: ${var}"
# 2. 使用 ${var:=word}
echo "变量设置为word:${var:=hello2}"
echo "当前变量的值是:${var}"
# 3. 使用 ${var:+word}
var="hello3"
echo "变量定义时的输出:${var:+hello4}"
echo "变量已设置: ${var}"
在这里插入图片描述

③启动yoona.sh 脚本文件
bash yoona.sh./yoona.sh

在这里插入图片描述

总结

通过本教程的学习,读者应对Shell变量有了全面的认识,包括如何定义、使用、删除以及转换变量。同时,环境变量的概念也为脚本的灵活性提供了保障。掌握这些基本技能后,用户能够更自信地编写复杂的Shell脚本,提升工作效率和解决问题的能力。未来的学习可以围绕更高级的Shell编程技巧展开,进一步拓宽技能树,增强对Shell脚本的应用能力。

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

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

相关文章

Karmada新版本发布,支持联邦应用跨集群滚动升级

摘要:本次升级支持联邦应用跨集群滚动升级,使用户版本发布流程更加灵活可控;透明同事karmadactl 新增了多项运维能力,提供独特的多集群运维体验。 本文分享自华为云社区 《Karmada v1.11 版本发布!新增应用跨集群滚动升…

cve 漏洞排查流程

1、打开CVE连接 确认漏洞jar包以及版本信息 https://gitee.com/opengauss/security/issues/IASNOA?fromproject-issue 2、通过命令导出对应jar包的依赖树 并导出到目标结果文件中 mvn dependency:tree -Dincludes:gson > gson.result.txt 3、过滤test引用…

Linux之实战命令17:nl应用实例(五十一)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

成都睿明智科技有限公司抖音电商服务靠谱吗?

在这个电商风起云涌的时代,抖音作为短视频直播的超级流量池,正深刻改变着人们的购物习惯。无数商家蜂拥而至,渴望在这片蓝海中找到属于自己的岛屿。而提及抖音电商服务,成都睿明智科技有限公司无疑是一个备受瞩目的名字。那么&…

2024年7月大众点评餐饮比较北上广深成渝

在做一些城市分析、学术研究分析、商业选址、商业布局分析等数据分析挖掘时,大众点评的数据参考价值非常大,截至2024年7月,大众点评美食店铺剔除了暂停营业、停止营业后的最新数据情况分析如下。 分析研究的字段维度包括大众点评数字id、字母…

10分钟读懂,ITIL4为什么它是IT服务管理的未来?

点击进入ITIL资料库 在当今数字化时代,IT服务管理(ITSM)对于企业的重要性不言而喻。而作为ITSM领域最广泛采用的最佳实践框架,ITIL(Information Technology Infrastructure Library)一直在引领着行业的发展。2019年,AXELOS发布了ITIL 4&#…

突发:OpenAI o1颠覆了人类,o1为什么超越了人类,sam万字长文解读

要点速读 2024 年 9 月 12 日,OpenAI 发布了其最新的人工智能模型——o1(Learning to Reason with LLMs[1]),这是一款经过强化学习训练的大型语言模型,能够执行复杂的推理任务。相比于此前的 GPT-4o(GPT-4…

网络资源模板--Android Studio 宿舍管理系统

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--宿舍管理系统 二、项目测试环境 三、项目详情 登录注册页面 ### 功能总结 1. **用户输入**: - 允许用户输入用户名和密码。 2. **登录验证**: - 检查用户名和密码…

开启争对目标检测的100类数据集-信息收集

DataBall 助力快速掌握数据集的信息和使用方式。 目标检测项目数据集样例地址: gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview github: https://github.com/TechLinkX/DataBall-detections-100s 请关注我们的专栏:DataBal…

Linux防火墙-常用命令,零基础入门到精通,收藏这一篇就够了

我们经过上小章节讲了Linux的部分进阶命令,我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主,而云服务器基本上就不会使用系统自带的防火墙,而是使用安全组来代替了防火墙的功能,可以简单理解安全组就是web版的防火墙&…

binkw32dll缺失怎么办?免费的dll修复工具诊断解决(报错修复)

binkw32dll缺失怎么办? 在使用电脑尤其是运行视频游戏时,我们有时会遇到“binkw32.dll缺失”的错误提示。这是一个由RAD Game Tools开发的动态链接库文件,主要关联于视频游戏中的视频播放技术,负责压缩视频回放功能。当这个文件缺…

[大语言模型-论文精读] Diffusion Model技术-通过时间和空间组合扩散模型生成复杂的3D人物动作

​​​​​​Generation of Complex 3D Human Motion by Temporal and Spatial Composition of Diffusion Models L Mandelli, S Berretti - arXiv preprint arXiv:2409.11920, 2024 通过时间和空间组合扩散模型生成复杂的3D人物动作 摘要 本文提出了一种新的方法&#xff0…

Apache POI快速入门

介绍 Apache POl是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下,POI都是用于操作 Excel 文件。 Apache POI的主要组件包括: HS…

【开源免费】基于SpringBoot+Vue.JS服装销售平台(JAVA毕业设计)

博主说明:本文项目编号 T 054 ,文末自助获取源码 \color{red}{T054,文末自助获取源码} T054,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

LeetCode从入门到超凡(四)深入浅出理解贪心算法

引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的LeetCode学习总结文档;本文主要讲解贪心算法。💕💕😊 介绍 贪心算法是一种经典的算法…

代码随想录Day 57|prim算法和kruskal算法精讲,题目:寻宝

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 图论part07**prim算法精讲**题目:53. 寻宝解题思路:Prim算法Kruskal算法总结Prim算法的核心步骤(三部曲):关键数据结构:算法…

Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)

文章目录 esp-rs 简介GithubRust 包仓库Wokwi 电子模拟器开发环境Rust 环境esp-rs 环境创建 ESP32C3 项目项目结构编译项目命令运行模拟器ESP32C3 烧录 esp-rs 简介 esp-rs 是一个专注于为 Espressif 系列芯片(如 ESP32、ESP32-S2、ESP32-C3 等)提供 Ru…

嵌入式边缘计算软硬件开发“1+X”考证建设方案

一、引言 随着物联网、大数据、人工智能等技术的飞速发展,嵌入式边缘计算作为连接物理世界与数字世界的桥梁,其重要性日益凸显。为了适应行业对高技能人才的需求,推动嵌入式边缘计算技术的普及与应用,特制定本“1X”考证建设方案…

本地部署开源在线PPT制作与演示应用PPTist并实现异地远程使用

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统环境本地部署开源在线演示文稿应用PPTist,并结合cpolar内网穿透工具实现随时随地远程访问与使用该项目。 PPTist …

Vue3(五) 组件通信大汇总

文章目录 一、props二、自定义事件三、mitt四、v-model1.v-model的本质2.v-model用在组件标签上3.更换modelValue4.更换modelValue时,可以在组件标签上多次使用v-model 五、$attrs六、$refs,与¥parent1. 回顾标签ref属性修改组件信息2. $refs实现父修改所…