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…

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,然后您的…

如何将现有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…

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

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

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

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

基于Arduino的RGB灯按键控制

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

hive数据查询语法

思维导图 基本查询 基本语法 SELECT [ALL | DISTINCT] 字段名, 字段名, ... FROM 表名 [inner | left outer | right outer | full outer | left semi JOIN 表名 ON 关联条件 ] [WHERE 非聚合条件] [GROUP BY 分组字段名] [HAVING 聚合条件] [ORDER BY 排序字段名 asc | desc…

前端小知识:我居然没学会用 split 方法?!

小伙伴们,你们会用 JavaScript 的 split 方法吗?最近我才发现,原来我多年来一直没真正掌握它,结果在解题时被卡住了。所以今天,我决定好好整理一下这个方法的用法。 在讨论问题之前,先来看一下 split 的两种…

VTK知识学习(2)-环境搭建

1、c方案 1.1下载源码编译 官网获取源码。 利用Cmake进行项目构建。 里面要根据实际使用的情况配置相关的模块哟,这个得你自行研究下了。 CMAKEINSTALLPREFIX--这个选项的值表示VTK的安装路径,默认的路径是C:/Program Files/VTK。该选项的值可不作更…

Halcon 从XML中读取配置参数

1、XML示例 以下是一个XML配置文件的示例,该文件包含了AOI(自动光学检测)算法的环境参数和相机逻辑参数: <AOI><!--AOI算法参数 20241106--><Env><!--环境参数--><Param name="GPUName" value="NVIDIA GeForce RTX 405…

SQL--查询连续三天登录数据详解

问题&#xff1a; 现有用户登录记录表&#xff0c;请查询出用户连续三天登录的所有数据记录 id dt1 2024-04-25 1 2024-04-26 1 2024-04-27 1 2024-04-28 1 2024-04-30 1 2024-05-01 1 2024-05-02 1 2024-05-04 1 2024-05-05 2 20…

结构方程、生物群落、数据统计、绘图分析在生态领域的应用

R语言结构方程模型&#xff08;SEM&#xff09;在生态学领域中的实践应用 结构方程模型&#xff08;Sructural Equation Model&#xff09;是一种建立、估计和检验研究系统中多变量间因果关系的模型方法&#xff0c;它可以替代多元回归、因子分析、协方差分析等方法&#xff0…

vue使用canves把数字转成图片验证码

<canvas id"captchaCanvas" width"100" height"40"></canvas>function drawCaptcha(text) {const canvas document.getElementById(captchaCanvas);const ctx canvas.getContext(2d);// 设置背景颜色ctx.fillStyle #f0f0f0;ctx.f…

双指针算法习题解答

1.移动零 题目链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a;该题要求将数组中为0的元素全部转移到数组的末尾&#xff0c;同时不能改变非零元素的相对位置。 解题思路&#xff1a;我们可以用变量dest和cur将该数组分为三个区域。…