Shell 脚本中变量和字符串的入门介绍

以下是关于 Shell 脚本中变量和字符串的入门介绍:

变量

  1. 定义变量
    在 Shell 脚本中,定义变量不需要指定类型。变量名一般以字母或下划线开头,不能以数字开头。例如:
name="John"
age=25

这里定义了两个变量 nameagename 的值是字符串 "John"age 的值是数字 25。注意,等号两边不能有空格。

  1. 使用变量
    要使用变量,可以在变量名前加上 $ 符号。例如:
echo "My name is $name and I'm $age years old."

这会输出 My name is John and I'm 25 years old.。也可以用 ${} 的形式来明确变量名的范围,比如当变量名与其他字符连接时:

prefix="pre"
number=123
echo "${prefix}${number}"  # 输出 pre123
  1. 变量的作用域
    • 局部变量:在函数内部定义的变量是局部变量,只能在函数内部使用。例如:
function my_function() {local local_var="local value"echo $local_var
}
my_function
echo $local_var  # 这里会报错,因为 local_var 在函数外部不可见
  • 全局变量:在函数外部定义的变量,在整个脚本中(包括函数内部)都可以使用,除非在函数内部有同名的局部变量。

字符串

  1. 字符串的定义
    • 双引号字符串:可以包含变量和转义字符。例如:
str="Hello, $name"
echo $str  # 输出 Hello, John
  • 单引号字符串:字符串内容会原样输出,不解析变量和转义字符(除了 '\'' 用于在单引号字符串中包含单引号)。例如:
str='Hello, $name'
echo $str  # 输出 Hello, $name
  • 不使用引号:如果字符串中不包含空格等特殊字符,可以不使用引号,但不推荐这种方式,因为容易出现错误。例如:
str=Hello
echo $str  # 输出 Hello
  1. 字符串操作
    • 获取字符串长度:可以使用 ${#string} 的形式。例如:
string="Hello"
echo ${#string}  # 输出 5
  • 字符串拼接:可以直接将两个字符串放在一起。例如:
str1="Hello"
str2="World"
str3=$str1$str2
echo $str3  # 输出 HelloWorld

也可以使用双引号和变量拼接:

name="Alice"
greeting="Hello, $name"
echo $greeting  # 输出 Hello, Alice
  • 字符串截取
    • ${string:start:length}:从 start 位置开始截取 length 个字符。例如:
string="abcdefg"
echo ${string:2:3}  # 输出 cde
 - `${string:start}`:从 `start` 位置开始截取到字符串末尾。例如:
string="abcdefg"
echo ${string:3}  # 输出 defg

Shell脚本中变量的命名规范如下:

  • 字符要求
    • 变量名一般以字母(a - z,A - Z)或下划线(_)开头。例如:var_name_count都是合法的开头方式。
    • 后续字符可以是字母、数字(0 - 9)或下划线。比如my_variable1_system_var2等都是合法的变量名。
  • 大小写敏感
    • Shell 脚本中的变量名是大小写敏感的。这意味着nameName是两个不同的变量。例如:
name="John"
Name="Alice"
echo $name  # 输出 John
echo $Name  # 输出 Alice
  • 避免使用特殊符号
    • 除了下划线之外,尽量避免在变量名中使用其他特殊符号,如标点符号(!、@、#、$、%等),因为这可能会导致语法错误或者意想不到的结果。不过,在某些特定的 Shell 环境中,可能允许一些特殊符号,但这会降低脚本的可读性和可移植性。
  • 语义清晰
  • 变量名应该具有清晰的语义,能够直观地反映出变量所存储内容的含义。例如,user_namevar1更能清楚地表示存储的是用户名相关的信息。这有助于提高脚本的可读性和可维护性,尤其是在大型或复杂的脚本中。

在Shell脚本中,字符串拼接主要有以下几种方式:

1. 直接拼接

  • 当变量与变量拼接或者变量与常量拼接时,可以直接将它们写在一起。这种方式要求变量和字符串之间不能有空格(除非是字符串内容的一部分)。例如:
var1="Hello"
var2="World"
result1=$var1$var2
echo $result1  # 输出 HelloWorldstring="Good"
result2=$string" morning"
echo $result2  # 输出 Good morning

2. 使用双引号拼接

  • 在双引号中,可以包含变量,Shell会自动将变量的值与其他字符串内容拼接起来。这种方式更灵活,尤其是当字符串中包含空格或需要插入变量值时。例如:
name="Alice"
greeting="Hello, $name"
echo $greeting  # 输出 Hello, Alicemessage="This is a "
more_info="complex string"
full_message="$message$more_info with some parts."
echo $full_message  # 输出 This is a complex string with some parts.

3. 使用花括号明确变量边界(可选,但在复杂情况下很有用)

  • 在某些情况下,特别是变量名后紧跟其他字符可能导致混淆时,可以使用花括号 ${} 来明确变量名。例如:
prefix="pre"
number=123
echo "${prefix}${number}"  # 输出 pre123

如果写成 $prefix$number,Shell可能会误解变量名,而使用花括号可以避免这种情况,保证正确的拼接。

4. 使用printf命令(相对复杂但功能强大)

  • printf 命令可以用于格式化输出,也可用于字符串拼接。它可以更精细地控制输出格式。例如:
str1="Hello"
str2="World"
printf "%s %s\n" $str1 $str2  # 输出 Hello World

printf 命令中的格式字符串 %s 表示字符串类型,通过指定多个 %s 并在后面跟上相应的字符串参数,可以实现拼接效果。这里的 \n 是换行符。

在Shell脚本中,可以使用 ${#string} 的方式来获取字符串的长度,以下是具体介绍:

使用方法示例

  • 基本示例
string="Hello"
length=${#string}
echo $length  # 输出 5

在这个例子中,${#string} 计算了字符串 "Hello" 的长度,结果为5。

  • 变量作为字符串
text=$(date)  # 获取当前日期,假设结果为类似 "Fri Nov 8 10:30:00 UTC 2024"
len=${#text}
echo $len

这里先将date命令的输出结果赋值给text变量,然后使用${#text}获取这个日期字符串的长度。

应用场景

  • 条件判断中的应用
password="secret123"
if [ ${#password} -lt 8 ]; thenecho "Password is too short."
elseecho "Password length is acceptable."
fi

在这个密码长度检查的示例中,通过 ${#password} 获取密码字符串的长度,并与8比较,来判断密码是否符合长度要求。

  • 循环中的应用
strings=("apple" "banana" "cherry")
for string in "${strings[@]}"; dolength=${#string}echo "The length of '$string' is $length"
done

这个示例在循环中遍历一个字符串数组,对于每个字符串,使用 ${#string} 计算并输出其长度。

在Shell脚本中,截取字符串有以下几种常见方法:

1. 使用 ${string:offset:length} 格式

  • 从指定位置开始截取指定长度
    这种方式可以从字符串的指定偏移量(offset)位置开始,截取指定长度(length)的子字符串。偏移量从0开始计数。例如:
string="abcdefg"
echo ${string:2:3}  # 输出 cde

这里从字符串 "abcdefg" 的第3个字符(偏移量为2)开始,截取3个字符,得到 "cde"

  • 只指定偏移量,截取到末尾
    如果只指定偏移量,不指定长度,则会从该偏移量位置截取到字符串末尾。例如:
string="abcdefg"
echo ${string:3}  # 输出 defg

此例从第4个字符(偏移量为3)开始截取到字符串 "abcdefg" 的末尾,得到 "defg"

2. 使用expr命令结合substr函数(适用于部分Shell环境)

  • 基本语法
    expr substr "$string" $start $length,其中$string是要截取的字符串,$start是起始位置(从1开始计数),$length是要截取的长度。例如:
string="abcdefg"
result=$(expr substr "$string" 3 3)
echo $result  # 输出 cde

这里使用expr命令的substr函数从字符串 "abcdefg" 的第3个位置(从1开始计数,对应字符 c)开始截取3个字符,得到 "cde"。需要注意的是,在不同的Shell环境中,expr命令的使用可能会有一些差异,而且这种方法相对较复杂,不如使用 ${string:offset:length} 简洁。

3. 使用cut命令(适用于按字符位置截取,有特定格式要求的情况)

  • 基本语法和示例
    echo "$string" | cut -c start-end,用于截取从startend位置的字符。例如:
string="abcdefg"
echo $string | cut -c 2-4
# 输出 bcd

这里通过cut命令从字符串 "abcdefg" 中截取第2到第4个字符,得到 "bcd"。这种方法在处理按字符位置截取且字符串有一定规律的情况时比较方便,尤其是当需要结合其他命令来处理输入字符串时。

4. 使用sedawk(功能强大,适用于更复杂的文本处理场景)

  • 使用sed
    echo "$string" | sed 's/^\(.\{start\}\)\(.\{length\}\).*$/\2/',这里通过正则表达式来实现从指定起始位置截取指定长度的字符串。例如:
string="abcdefg"
echo $string | sed 's/^\(.\{2\}\)\(.\{3\}\).*$/\2/'
# 输出 cde
  • 使用awk
    echo "$string" | awk '{print substr($0,start,length)}'substr函数在awk中的用法与在其他地方略有不同,它从指定的起始位置开始截取指定长度的字符串。例如:
string="abcdefg"
echo $string | awk '{print substr($0,3,3)}'
# 输出 cde

sedawk在处理更复杂的文本处理和字符串操作任务时非常有用,但对于简单的字符串截取,可能会显得有些“大材小用”。

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

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

相关文章

Golang | Leetcode Golang题解之第547题身份数量

题目: 题解: func findCircleNum(isConnected [][]int) (ans int) {n : len(isConnected)parent : make([]int, n)for i : range parent {parent[i] i}var find func(int) intfind func(x int) int {if parent[x] ! x {parent[x] find(parent[x])}re…

Leetcode 778 Swim in a Rising water

题是指什么时候你能从左上角游到右下角。第t分钟的时候,水的高度是t。grid[i][j]是海拔,只有当前水的高度没过海拔,我才能游。你可以往四个方向游泳。求问,最少第几分钟我能从左上角游到右下角(有一条路径)…

Ardusub中添加自定义控制器

1.建议保留原程序 复制ardupilot文件夹到当前目录,命名为ardupilot_ARDC cp -r ardupilot ardupilot_copy2.切换Sub-4.5版本 Sub-4.1版本libraries里没有AC_CustomControl文件夹,我们需要用到这个文件夹所以需要进行切换分支,在当前ardupi…

ReactPress:重塑内容管理的未来

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议,欢迎一起共建,感谢Star。 ReactPress:重塑内容管理的未来 在当今信息爆炸的时代,一个高效、易用的内容管理系统&#xff0…

云集电商:如何通过 OceanBase 实现降本 87.5%|OceanBase案例

云集电商,一家聚焦于社交电商的电商公司,专注于‘精选’理念,致力于为会员提供超高性价比的全品类精选商品,以“批发价”让亿万消费者买到质量可靠的商品。面对近年来外部环境的变化,公司对成本控制提出了更高要求&…

vue3实现一个无缝衔接、滚动平滑的列表自动滚屏效果,支持鼠标移入停止移出滚动

文章目录 前言一、滚动元素相关属性回顾一、实现分析二、代码实现示例:2、继续添加功能,增加鼠标移入停止滚动、移出继续滚动效果2、继续完善 前言 列表自动滚屏效果常见于大屏开发场景中,本文将讲解用vue3实现一个无缝衔接、滚动平滑的列表自…

三周精通FastAPI:36 OpenAPI 回调

官方文档: OpenAPI 回调 您可以创建触发外部 API 请求的路径操作 API,这个外部 API 可以是别人创建的,也可以是由您自己创建的。 API 应用调用外部 API 时的流程叫做回调。因为外部开发者编写的软件发送请求至您的 API,然后您的…

深入解析语音识别中的关键技术:GMM、HMM、DNN和语言模型

目录 一、高斯混合模型(GMM)与期望最大化(EM)算法二、隐马尔可夫模型(HMM)三、深度神经网络(DNN)四、语言模型(LM)五、ASR系统的整体工作流程结论 在现代语音…

如何将现有VUE项目所有包更新到最新稳定版

更新有风险,Enter要谨慎!!! 要将项目中的所有 npm 包更新到最新稳定版,可以使用 npm-check-updates 工具。以下是具体步骤: 步骤一:安装 npm-check-updates 首先,全局安装 npm-check-updates 工具: npm install -g…

如何使用 C# 编写一个修改文件时间属性的小工具?

下面是简鹿办公一个用 C# 编写的简单工具,它可以批量修改文件的创建时间、最后访问时间和最后修改时间。我们将使用 .NET Framework 或 .NET Core 来实现这个功能。 完整示例代码 1. 创建一个新的 C# 控制台应用程序 您可以使用 Visual Studio 或 .NET CLI 创建一个…

使用PyQt5设计一个简易计算器

目录 设计UI图 代码 结果展示 设计UI图 代码 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMessageBox from untitled import Ui_MainWindow import sysclass…

音频模型介绍

在处理音频数据方面,有多种模型表现出色,它们在不同的音频处理任务上有着各自的优势: 自动编码器:包括多通道变分自动编码器、自回归模型和生成对抗网络等,这些模型在音乐生成领域取得了令人印象深刻的成果。 深度生成…

云计算基础:AWS入门指南

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 云计算基础:AWS入门指南 云计算基础:AWS入门指南 云计算基础:AWS入门指南 引言 AWS概述 什么…

动态规划-两个数组的dp问题——712.两个字符串的最小ASCII删除和

1.题目解析 题目来源 712.两个字符串的最小ASCII删除和——力扣 测试用例 2.算法原理 1.状态表示 由于如果直接求本题会发现无从下手,不妨根据正难则反的原理,反向求公共子序列的ASCII码最大值即可,于是就转化为求公共子序列的问题&#x…

elementui中的新增弹窗在新增数据成功后再新增 发现数据无法清除解决方法

elementui中的新增弹窗在新增数据成功后再新增 发现数据无法清除解决方法 试过网上其他方法,发现表单清空数据还是有问题,索性用下面方法解决: // 给弹框里面添加 v-ifvisible测试无问题,暂时先这样解决,如果有其他方法&#x…

python 天气数据可视化

Python爬取天气数据及可视化分析 https://blog.csdn.net/weixin_69423932/article/details/135184643

基于Arduino的RGB灯按键控制

一.简介 通过按键控制RGB灯分别显示7种颜色:红 、绿、 蓝、 黄、 青、 紫、 白。 二.按键控制RGB灯原理 1)RGB全彩LED: LED由三个颜色分别为:红(Red)、绿(Green)、蓝(Blue)的LED…

非关系型数据库(1)---MongoDB

目录 1.MongoDB 1.MongoDB的特点 2.MongoDB的应用场景 3.MongoDB与MySQL的比较 2.数据库操作 1. 创建数据库 2. 切换数据库 3. 查看所有数据库 4. 查看当前数据库 5. 删除数据库 6. 查看数据库统计信息 7. 备份数据库 8. 恢复数据库 9. 创建用户和授权 10. 删除用…

1. pytorch 中冻结模型参数后参数仍会被调整

问题 self.sgf_net.requires_grad_(False)起初设置 requires_grad(False) 优化器也没有添加sgfnet的模型参数。但是在pylightning框架中,每次推理完模型的参数都会被改变,经过仔细排查发现问题 # self.sgf_net.requires_grad_(False)for param in self.s…

大模型-微调与对齐-人类对齐背景与标准

1、目的 确保大模型的行为与人类价值观、人类真实意图和社会伦理相一致 2、大模型有害行为 无法正确遵循指令生成虚假信息产生有害、有误导性、有偏见的表达 3、评估标准 有用性诚实性无害性 4、更细化的对齐标准 行为对齐:要求AI能够做出符合人类期望的行为…