概念

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号声明字符串

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号声明字符串

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

示例:

#单引号和双引号使用变量的区别
root@master:~$ name='huangSir'
root@master:~$ echo '$name'
$name
root@master:~$ echo "$name"
huangSir #单引号中嵌套单引号
root@master:~$ echo ''hello world''
hello world
#双引号中嵌套单引号
root@master:~$ echo "'hello world'"
'hello world' #单引号和双引号使用转义字符的区别
root@master:~$ echo '\"hello world\"'
\"hello world\"
root@master:~$ echo "\"hello world\""
"hello world"

字符串的各种操作

在 Shell 脚本中,字符串是常见的数据类型,可以通过多种方式对字符串进行处理,包括拼接、截取、替换、比较等操作。

字符串拼接

字符串拼接可以直接拼接,中间无需任何特殊字符

root@master:~$ str1="hello"
root@master:~$ str2="world"
root@master:~$ str3="$str1 $str2"
root@master:~$ echo $str3
hello world
root@master:~$ str3="${str1} like ${str2}"
root@master:~$ echo $str3
hello like world

获取字符串长度 ${#str}

统计字符长度(变量中有多少个字符)

#空格也算字符
root@master:~$ str="I Like Shell"
root@master:~$ echo ${#str}
12

截取字符串 ${str:index:index}

root@master:~$ str="hello world"
# 从索引下标为5开始,向后截取,索引下标为5的舍弃
root@master:~$ echo ${str:5}
world
# 从索引下标为2开始,向后截取5个字符
root@master:~$ echo ${str:2:5}
llo w
# 从索引下标为2开始,截取到倒数第6个字符
root@master:~$ echo ${str:2:-6}
llo
从索引下标为2开始,截取到倒数第7个字符
root@master:~$ echo ${str:2:-7}
ll

字符串替换

${str/newStr/oldStr}

newStr替换为oldStr,仅替换第一个遇到的oldStr

root@master:~$ str="hello world"
root@master:~$ echo ${str/l/o}
heolo world

${str//newStr/oldStr}

newStr替换为oldStr,替换所有的oldStr

root@master:~$ str="hello world"
root@master:~$ echo ${str//l/o}
heooo worod

字符串大小写转换

需要bash4+的版本

大写转换:${str^^}

root@master:~$ str="hello world"
root@master:~$ echo ${str^^}
HELLO WORLD

小写转换:${str,,}

root@master:~$ str="HELLO WORLD"
root@master:~$ echo ${str,,}
hello world

字符串分割为数组

root@master:~$ str="apple:banana:orange"
#按照:分割
root@master:~$ IFS=':' read -ra arr <<< "$str"
root@master:~$ echo ${arr[0]}
apple
root@master:~$ echo ${arr[1]}
banana

删除前缀或后缀

  • ${str#word}:从变量左边开始删除,按照最短匹配删除
  • ${str##word}:从变量左边开始删除,按照最长匹配删除
  • ${str%word}:从变量右边开始删除,按照最短匹配删除
  • ${str%%word}:从变量右边开始删除,按照最长匹配删除

    示例:
root@master:~$ str="file.txt.tar.gz"
root@master:~$ echo ${str#*.}
txt.tar.gz
root@master:~$ echo ${str##*.}
gz
root@master:~$ echo ${str%.*}
file.txt.tar
root@master:~$ echo ${str%%.*}
file

判断是否包含子串

if [[ $str == *World* ]]; then
echo "包含World"
fi
# 或使用正则表达式
if [[ $str =~ .*World.* ]]; then
echo "匹配成功"
fi

判断字符串是否为空

[[ -z "$str" ]]:为空返回真

[[ -n "$str" ]]:非空返回真

root@master:~$ name=
root@master:~$ [[ -z "$name" ]] && echo true || echo false
true
root@master:~$ [[ -n "$name" ]] && echo true || echo false
false

判断两个字符串是否相等

[[ $str1 == $str2 ]]:相等判断

[[ $str1 != $str2 ]]: 不等判断

root@master:~$ [[ "hello" == "hello" ]] && echo true || echo false
true
root@master:~$ [[ "hello" != "hello" ]] && echo true || echo false
false

shell处理字符串的更多相关文章

  1. Linux Shell 截取字符串

    Linux Shell 截取字符串 shell中截取字符串的方法很多 ${var#*/} ${var##*/} ${var%/*} ${var%%/*} ${var:start:len} ${var: ...

  2. shell截取字符串的方法

    参考文献: linux中shell截取字符串方法总结 [Linux]如何在Shell脚本中计算字符串长度? 截取字符串的方法一共有八种,主要为以下方法 shell中截取字符串的方法有很多中, ${ex ...

  3. shell 判断字符串是否为数字

    本篇文章主要介绍了"shell 判断字符串是否为数字",主要涉及到shell 判断字符串是否为数字方面的内容,对于shell 判断字符串是否为数字感兴趣的同学可以参考一下. #!/ ...

  4. shell基础——字符串处理(转载)

    Shell的字符串处理   1 得到长度   %x="abcd"  #方法一      %expr length $x      4  # 方法二      %echo ${#x} ...

  5. shell 分割字符串存至数组

    shell 分割字符串存至数组 shell编程中,经常需要将由特定分割符分割的字符串分割成数组,多数情况下我们首先会想到使用awk但是实际上用shell自带的分割数组功能会更方便.假如a=”one,t ...

  6. Linux shell去除字符串中所有空格

    Linux shell去除字符串中所有空格 echo $VAR | sed 's/ //g'

  7. shell切分字符串到数组

    shell切分字符串到数组 问题: 对于’aa,bb,cc,dd,ee’这样的字符串输出采用,分隔开的aa bb cc dd ee aa:bb is ok:/home/work按照":&qu ...

  8. 用Shell判断字符串包含关系的方法小结

     这篇文章主要给大家介绍了关于用Shell判断字符串包含关系的几种方法,其中包括利用grep查找.利用字符串运算符.利用通配符.利用case in 语句以及利用替换等方法,每个方法都给出了详细的示例代 ...

  9. Linux shell 获得字符串所在行数及位置

    shell 获得字符串所在行数及位置 01 获取字符串所在的行数 方式一:用grep -n [root@root]# cat test apple bit create delect exe flow ...

  10. 【shell比较字符串】

    if [ 'AAA' = 'ABC' ]; then echo "the same" else echo "not the same" fi shell比较字符 ...

随机推荐

  1. CentOS7离线安装Nginx及配置

    下载离线包: 用浏览器打开地址,选择您要下载的版本:http://nginx.org/packages/centos/7/x86_64/RPMS/ 如图,我下载的1.16.1版. 执行安装: 将下载的 ...

  2. React中的数据流管理

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霜序 前言 为什么数据流管理重要? React 的核心思想 ...

  3. 取消浏览器中记住密码自动填充时弹出Windows安全中心的验证

    1.问题描述 我们在使用谷歌浏览器的过程中,经常会将一些账号和密码记住在浏览器中,方便下次通过浏览器自动填充. 此方式虽然方便,但是有时候会遇到一种情况,那就是每次在浏览器中使用自动填充的时候,需会弹 ...

  4. 在 PyTorch 中理解词向量,将单词转换为有用的向量表示

    你要是想构建一个大型语言模型,首先得掌握词向量的概念.幸运的是,这个概念很简单,也是本系列文章的一个完美起点. 那么,假设你有一堆单词,它可以只是一个简单的字符串数组. animals = [&quo ...

  5. Flink同步kafka到iceberg数据延迟,两个checkpoint后才可查询

    一.问题描述 用户配置了高级参数很多,观察kafka增量数据不多,flink负载不高情况下两个checkpoint后才可查询到数据.   排查时hdfs有数据文件产生,但是mainfast文件中最新快 ...

  6. Spark异常总结

    1.Spark读写同一张表报错问题Cannot overwrite a path that is also being read from 问题描述:Spark SQL在执行ORC和Parquet格式 ...

  7. 什么是A型或者B型剩余电流保护器?

    我国的剩余电流保护装置(RCD)指导性标准GB/Z 6829-2008(IEC/TR 60755:2008,MOD)<剩余电流动作保护器的一般要求> 从产品的基本结构.剩余电流类型.脱扣方 ...

  8. android studio真机调试华为手机

    背景 近来开发一个视频通话App,需要在华为手机上调试,按网上一顿操作,开启了USB调试之后,发现手机连上电脑后,android studio没反应,在此记录下解决方法.调试的手机型号是华为 nova ...

  9. 海康SDK报错Structure.getFieldOrder()

    就是你调用的这个结构体以及其引用的其他结构体,可能没有getFieldOrder()的方法,你只要按照顺序把他填上去就好了.比如 public static class NET_DVR_TIME ex ...

  10. manim边学边做--相机Camera简介

    在Manim中,Camera是实现动画效果的重要工具之一. 它就像我们观察动画的 眼睛,通过控制相机的位置.角度和视野,可以创造出丰富多样的视觉效果. Manim社区版本中提供了多种Camera类型, ...