Shell 编程快速入门 之 字符串

news2025/1/24 18:03:05

8c24851c4f9c4f6dbe0de1a3181800f5.png

目录

字符串 String

字符串定义

单引号字符串

双引号字符串

反引号字符串

字符串拼接

字符串长度

字符串比较

==与-eq的区别

子字符串

字符串切片

“切片步长”

遍历字符串

翻转字符串

用反向遍历来实现

调用外部命令rev实现

替换与删除字符

替换字符

删除字符

调用外部命令sed实现

删除空格

遍历字符串数组

c风格for循环

for...in循环

while循环


字符串 String

在计算机编程中,字符串(String)是一种基本的数据类型,它表示文本或字符序列。在各种编程语言中,字符串都扮演着重要的角色,而在shell脚本中也不例外。在Shell脚本中,字符串的使用非常广泛,可以用于处理文本、文件名、命令参数等等。

字符串定义

在shell中,字符串可以用单引号、双引号或反引号来定义。

单引号字符串

单引号字符串中的内容将原样输出,不会进行任何变量替换。例如:

#!/bin/bash
str='abcd'
echo '$str'
DATE=$(date)
echo '$DATE'

输出:

$str
$DATE

双引号字符串

双引号字符串中的内容将进行变量替换。例如:

#!/bin/bash
str='abcd'
echo "$str"
DATE=$(date)
echo "$DATE"

输出:

abcd
Thu 24 Aug 2023 12:24:27 AM UTC

【注意】据说有的shell环境两者还区别于它们转义字符的解析,但至少我用的版本没有差别:

#!/bin/bash
echo 'Hello\n World!'
echo "Hello\n World!"

echo -e 'Hello\n World!'
echo -e "Hello\n World!"

输出:

Hello\n World!
Hello\n World!
Hello
 World!
Hello
 World!

反引号字符串

反引号(``,数字1左边的键)字符串用于执行命令并将其输出作为字符串。例如:

#!/bin/bash  
  
# 获取当前日期并存储到变量中  
current_date=`date`  
echo "当前日期是:$current_date"

result=`ls -l | wc`  
echo "命令序列的输出是:$result"

输出:

当前日期是:Thu 24 Aug 2023 10:28:54 AM UTC
命令序列的输出是:      3      20     118

字符串拼接

1. 字符串自然的首尾相接在一起
2. 使用字符串拼接运算符: +=

#!/bin/bash  

str1="Hello"
str2="world!"
str3="${str1},${str2}"
echo $str3

str+=$str1
echo $str
str+=$str2
echo $str

输出:

Hello,world!
Hello
Helloworld!

字符串长度

要获取字符串的长度,可以使用${#string}。例如:

#!/bin/bash  
  
str='Hello\nWorld'
echo "$str的长度为:"${#str}

str="Hello\nWorld"
echo "$str的长度为:"${#str}

current_date=`date`  
echo "date命令返回的字串长度为:${#current_date}"

输出:

Hello\nWorld的长度为:12
Hello\nWorld的长度为:12
date命令返回的字串长度为:31
 

注:同时也印证了我用的linux环境下单、双引号字符串在转义解析方面无区别。

字符串比较

字符串没有大小之分,只能比较是否相等 == 、不相等 !=。

#!/bin/bash
str1='Hello'  
str2='World'  
if [ "$str1" == "$str2" ]; then  
    echo "Strings are equal"  
else  
    echo "Strings are not equal"  
fi

输出:

Strings are not equal

==与-eq的区别

字符串对比通常用 ==,可转数字的字符串也能用 -eq,但不能转数字的用-eq比较会报错的。

#!/bin/bash
num1="123"
num2="0123"

if [ "$num1" -eq "$num2" ]; then  
    echo "Numbers are equal"  
else  
    echo "Numbers are not equal"  
fi

if [ "$num1" == "$num2" ]; then  
    echo "Numbers are equal"  
else  
    echo "Numbers are not equal"  
fi

输出:

Numbers are equal
Numbers are not equal

子字符串

字符串的比较支持通配符 “?”"*",分别表示可以代替一个和多个字符。

例如,[[$string == *"$substring"*]] 可以判断后者是否为前者的子字符串。

示例:

#!/bin/bash
string="Hello World"  
substring="Hello"  
if [[ $string == *"$substring"* ]]; then  
    echo "Substring found"  
else  
    echo "Substring not found"  
fi

if [[ $string == "$substring"* ]]; then  
    echo "String starts with Substring"  
elif  [[ $string == *"$substring" ]]; then  
    echo "String ends with Substring"
elif  [[ $string == *"$substring"* ]]; then  
    echo "Substring is in the middle of String"
else  
    echo "Substring not found"  
fi

输出:

Substring found
String starts with Substring

字符串切片

格式: ${string: start,length切片长度}

start:切片起始索引位置,索引从0开始。可以理解为切掉字符串前部的字符数。
length:正数为切片长度,即留下的字符个数;如为负数表示切掉字符串尾部的字符数

#!/bin/bash  
  
str="Hello,world!"
echo ${str:0:5}   # 输出 "Hello"
echo ${str::5}    # 输出 "Hello"
echo ${str:1:5}   # 输出 "ello,"
echo ${str:8:5}   # 输出 "rld!"
echo ${str::-1}    # 输出 "Hello,world"
echo ${str::-5}    # 输出 "Hello,w"
echo ${str:3:-3}   # 输出 "lo,wor"

输出:

Hello
Hello
ello,
rld!
Hello,world
Hello,w
lo,wor

“切片步长”

shell没有切片步长step的概念,但可以用循环实现,如输出字串奇偶位数的“切片”:

#!/bin/bash  
  
string="Hello,world!"
result=""
index=0
step=2
while [ $index -lt ${#string} ]; do
    char=${string:$index:1}
    index=$((index+step))
	result+=$char
done
echo $result

result=""
index=1
while [ $index -lt ${#string} ]; do  
    char=${string:$index:1}
    index=$((index+step))
	result+=$char
done
echo $result

result=""
for ((i=1; i<${#string}; i=i+step)); do  
    char=${string:$i:1}
	result+=$char
done
echo $result

输出:

Hlowrd
el,ol!
el,ol!

遍历字符串

使用单个字符的切片 ${str:$i:1} 循环读取所有字符,例如:

#!/bin/bash
str="hello,world"

echo $str
for (( i=0; i<${#str}; i++ )); do
    echo -n ${str:$i:1}" "
done

输出:

hello,world
h e l l o , w o r l d  

翻转字符串

用反向遍历来实现

#!/bin/bash
str="hello,world"

echo $str
# 反向遍历
for (( i=${#str}-1; i>=0; i-- )); do
    echo -n ${str:$i:1}" "
done
echo

str2=""
# 反向拼接
for (( i=${#str}-1; i>=0; i-- )); do
    str2+=${str:$i:1}
done
echo $str2

输出:

hello,world
d l r o w , o l l e h 
dlrow,olleh

调用外部命令rev实现

hann@HannYang:~$ str="hello,world"
hann@HannYang:~$ echo $str
hello,world
hann@HannYang:~$ echo $str|rev
dlrow,olleh
hann@HannYang:~$ echo $str
hello,world
hann@HannYang:~$ str=`echo $str`
hann@HannYang:~$ echo $str
hello,world
hann@HannYang:~$ str=`echo $str|rev`
hann@HannYang:~$ echo $str
dlrow,olleh

替换与删除字符

替换字符

格式:${string//pattern/replacement} 

#!/bin/bash
str="hello,world"
echo $str
echo ${str//world/shell}

输出:

hello,world
hello,shell 

删除字符

格式:${string//pattern/} 替换内容replacement为空即删除。

#!/bin/bash
str="hello,world"
echo $str
echo ${str//world/}

输出:

hello,world
hello,

【注意】替换和删除操作都不是原地操作,要改变原字符串,请操作后赋值:

#!/bin/bash
str="hello,world"
echo $str
echo ${str//world/shell}
echo ${str//world/}
echo

echo $str
str=${str//world/}
echo $str

输出: 

hello,world
hello,shell
hello,

hello,world
hello,

调用外部命令sed实现

比如,调用 sed 命令来实现替换或删除:

#!/bin/bash
str="hello,world"

new_string=$(echo $str | sed 's/world/Shell/g')
echo $new_string

#直接用反引号字符串表示:
echo `echo $str | sed 's/world//g'`

输出:

hello,Shell
hello,

删除空格

#!/bin/bash
str=" hello world 1 2 3 4 5 "
no_space_str=${str//[[:space:]]/}
echo $no_space_str

输出:

helloworld12345 

POSIX 标准定义的字符类

除了[[:space:]]表示匹配空格(包括空格、制表符、换页符等),还有以下特殊格式可用:

[[:alnum:]]:匹配字母和数字。
[[:alpha:]]:匹配字母。
[[:digit:]]:匹配数字。
[[:graph:]]:匹配可见字符(非空格和非控制字符)。
[[:lower:]]:匹配小写字母。
[[:upper:]]:匹配大写字母。
[[:punct:]]:匹配标点符号。
[[:print:]]:匹配可打印字符(非控制字符)。
[[:cntrl:]]:匹配控制字符(0x01 到 0x1F 和 0x7F)。

示例:

#!/bin/bash
str=" Hello123World 1 2 , 3 4 5"
str1=${str//[[:digit:]]/}
echo [$str1]
str2=${str//[[:upper:]]/}
echo [$str2]
str3=${str//[[:alnum:]]/}
echo [$str3]
str4=${str//[[:alpha:]]/}
echo [$str4]
str5=${str//[[:punct:]]/}
echo [$str5]

输出:

[ HelloWorld , ]
[ ello123orld 1 2 , 3 4 5]
[ , ]
[ 123 1 2 , 3 4 5]
[ Hello123World 1 2 3 4 5]

遍历字符串数组

c风格for循环

#!/bin/bash
array=("apple" "banana" "cherry")  

for ((i=0; i<${#array[@]}; i++))  
do  
    echo "${array[i]}"  
done

输出:

apple
banana
cherry

for...in循环

#!/bin/bash
array=("apple" "banana" "cherry")  

for item in "${array[@]}"  
do  
    echo "$item"  
done

输出:

apple
banana
cherry

while循环

#!/bin/bash
array=("apple" "banana" "cherry")  

while [ ${#array[@]} -gt 0 ]  
do  
    echo "${array[0]}"  
    array=("${array[@]:1}")  
done
echo "此时数组为空【${array[@]}】"

输出:

apple
banana
cherry
此时数组为空【】


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

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

相关文章

Vue2向Vue3过度核心技术快速入门

目录 1 为什么要学习Vue2 什么是Vue1.1 什么是构建用户界面1.2 什么是渐进式1.3 什么是框架总结&#xff1a;什么是Vue&#xff1f; 3 创建Vue实例4 插值表达式 {{}}4.1 作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中4.2 语法4.3 错误用法4.4 总结 5 响应式特性…

Kali Linux 2023.3 发布

Offective Security 发布了 Kali Linux 2023.3&#xff0c;这是其渗透测试和数字取证平台的最新版本。 Kali Linux 2023.3 中的新工具 除了对当前工具的更新之外&#xff0c;新版本的 Kali 通常还会引入新的工具。 这次&#xff0c;他们是&#xff1a; Calico – 云原生网络…

【CSS 画个梯形】

使用clip-path: polygon画梯形 clip-path: polygon使用方式如下&#xff1a; 效果实现 clip-path: polygon 是CSS的属性之一&#xff0c;用于裁剪元素的形状。它可以通过定义一个具有多边形顶点坐标的值来创建一个多边形的裁剪区域&#xff0c;从而实现元素的非矩形裁剪效果。…

安卓系列机型永久去除data分区加密 详细步骤解析

安卓机型玩机搞机刷写第三方twrp存储出现乱码 存储不显示等情况都是没有解密data分区的原因。用户需要在twrp里格式化data分区重启后存储显示正常。那么这个操作后你的数据分区就会呗彻底清除。 今天主要解析下如何操作可以永久解密data分区。其实data分区加密原则上也是厂商为…

Git基础——基本的 Git本地操作

本文涵盖了你在使用Git的绝大多数时间里会用到的所有基础命令。学完之后&#xff0c;你应该能够配置并初始化Git仓库、开始或停止跟踪文件、暂存或者提交更改。我们也会讲授如何让Git忽略某些文件和文件模式&#xff0c;如何简单快速地撤销错误操作&#xff0c;如何浏览项目版本…

系统学习Linux-keepalived

目录 keepalived双机热备 keepalivedlvs&#xff08;DR&#xff09; 1.实验环境 先配置主调度器 web节点配置 keepalived双机热备 web服务器安装nginx和keepalived 配置好这些可以进行漂移了 复制keepalived.conf 进行修改web1为主web2为从优先级设置好 #we…

WPF网格拖动自动布局效果

WPF网格拖动自动布局效果 使用Canvas和鼠标相关事件实现如下的效果: XAML代码: <Window x:Class="CanvasTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:

WebGL 缓冲区对象介绍,创建并使用缓冲区,使用缓冲区对象向顶点着色器传入多个顶点数据的所有步骤

目录 使用缓冲区对象 使用缓冲区对象向顶点着色器传入多个顶点的数据&#xff0c;需要遵循以下五个步骤。 创建缓冲区对象&#xff08;gl.createBuffer&#xff08;&#xff09;&#xff09; gl.createBuffer&#xff08;&#xff09;的函数规范 gl.deleteBuffer &#…

[管理与领导-46]:IT基层管理者 - 8项核心技能 - 1 - 目标管理

目录 前言&#xff1a; 一、什么是目标管理 二、管理目标的维度 2.1 个人目标维度 2.2 绩效评估的维度 三、目标的分解 四、目标制定的SMART原则 五、目标管理的误解 六、目标管理的注意事项 七、目标无法实现的因素 前言&#xff1a; 管理者存在的价值就是制定目标…

React Diff算法

文章目录 React Diff算法一、它的作用是什么&#xff1f;二、React的Diff算法1.了解一下什么是调和&#xff1f;2.react的diff算法3.React Diff的三大策略4.tree diff&#xff1a;1、如果DOM节点出现了跨层级操作&#xff0c;Diff会怎么办? 5. component diff&#xff1a;6. e…

maven工程的目录结构

https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html maven工程的目录结构&#xff1a; 在maven工程的根目录下面&#xff0c;是pom.xml文件。此外&#xff0c;还有README.txt、LICENSE.txt等文本文件&#xff0c;便于用户能够…

Jenkins 详细安装流程及填坑记录「图文」

目录 一、前言 二、环境准备 三、安装步骤 1、安装jdk 2、安装jenkins 3、配置修改 4、jenkins启动 四、登录jenkins 一、前言 省流&#xff1a;本文仅记录Jenkins详细安装过程&#xff0c;以及安装过程中经常遇到的问题。 二、环境准备 Linux系统&#xff1a;CentOS…

spdlog输出日志等级控制由set_level运行时和#define SPDLOG_ACTIVE_LEVEL编译时共同控制

spdlog输出日志等级控制由set_level运行时和#define SPDLOG_ACTIVE_LEVEL编译时共同控制 common.h中 spdlog.h中 控制log活跃级别是INFO

网络安全工具和资源推荐: 介绍网络安全领域中常用的工具、框架、资源和学习资料

章节1: 前言 随着数字化时代的不断深入&#xff0c;网络安全的重要性愈发凸显。在这个信息爆炸的时代&#xff0c;我们必须保护个人隐私、敏感数据以及网络基础设施免受各种威胁。本文将为您介绍一些网络安全领域中常用的工具、框架、资源和学习资料&#xff0c;帮助您更好地入…

CSS中的vertical-align属性

vertical-align 1.CSS属性 - vertical-align 2.深入理解vertical-align – line boxes This property affects the vertical positioning inside a line box of the boxes generated by an inline-levelelement. 官方文档的翻译&#xff1a;vertical-align会影响 行内块级元素…

VSCode 如何解决 scanf 的输入问题——Code is already running!

文章如何使用 VSCode 软件运行C代码中已经介绍了如何在 VSCode 软件中运行C代码&#xff0c;但最近在使用 scanf 想从键盘输入时&#xff0c;运行代码后显示“Code is already running!”&#xff0c;如下图所示&#xff0c;在输出窗口是无法通过键盘输入的。 解决办法如下&am…

vue若依导出word文件,简单的实现

首先前端导包,注意exportDocx的导包位置要修改成你自己的 import {exportDocx} from /utils/docUtil/docutil.js; import {addDays} from date-fns; import {listGongyi} from "/api/system/detail";然后新建一个测试按钮 <el-col :span"1.5"><…

C++中<iostream> 的cin >> str 和<string>的getline(cin, str) 用来读取用户输入的两种不同方式的不同点

C中<iostream> 的cin >> str 和<string>的getline(cin, str) 用来读取用户输入的两种不同方式的不同点 getline()函数语法如下【https://cplusplus.com/reference/string/string/getline/】&#xff1a; istream& getline (istream& is, string&am…

LLaMA中ROPE位置编码实现源码解析

1、Attention中q&#xff0c;经下式&#xff0c;生成新的q。m为句长length&#xff0c;d为embedding_dim/head θ i 1 1000 0 2 i d \theta_i\frac{1}{10000^\frac{2i}{d}} θi​10000d2i​1​ 2、LLaMA中RoPE源码 import torchdef precompute_freqs_cis(dim: int, end: i…

自动化测试之Selenium

自动化测试Selenium介绍环境搭建如何操作浏览器定位元素css类选择器定位元素xpath定位元素css选择语法xpath选择语法 常用操作添加等待打印信息浏览器更多操作键盘事件鼠标事件特殊场景只选复选框iframe标签下拉框处理弹窗显示上传文件 关闭浏览器切换窗口截图 自动化测试 自动…