Shell中字符串与数组操作实例

前言

本篇主要介绍了介绍在Shell脚本中对于字符串的处理,数据变量的定义与使用。

字符串截取及切割

子串截取的三种用法:${var:起始位置:长度}

expr substr "$var" 起始位置 长度

echo $var | cut -b 起始位置-结束位置

字符串的截取,只是单纯将字符串截取出来,对原来的变量并不会进行修改。

${var:起始位置:长度}SCHOOL="This is string."echo ${#SCHOOL}    //确定变量的长度echo ${SCHOOL:0:6}使用${}方式截取字符串时,起始位置是从0开始的(和数组下标编号类似)。

expr substr "$var" 起始位置 长度

expr substr "$var" 起始位置 长度expr substr "$SCHOOL" 1 6使用expr substr截取字符串时,起始编号从1开始,这个要注意与${}相区分。

注意:因为SCHOOL变量的值里含有空格,所以应该加双引号进行调用,否则是会报错的

echo $var | cut -b 起始位置-结束位置

选项 -b 表示按字节截取字符,其中起始位置、结束位置都可以省略。当省略起始位置时,视为从第1个字符开始(编号也是从1开始,与expr类似),当省略结束位置时,视为截取到最后。echo $SCHOOL | cut -b 1-6

路径分割:取目录位置:dirname "字符串"

取文档的基本名称:basename "字符串"

字符串的替换

子串替换的两种用法:

只替换第一个匹配结果:${var/old/new}echo  ${SCHOOL/r/RRRR}

替换全部匹配结果:${var//old/new}echo  ${SCHOOL//r/RRRR}

字符串掐头去尾:

从左向右,最短匹配删除:${变量名#*关键词}echo ${MAIL#*oo}echo ${MAIL#*/}

从左向右,最长匹配删除:${变量名##*关键词}echo ${MAIL##*oo}echo ${MAIL##*/}

从右向左,最短匹配删除:${变量名%关键词*}echo ${MAIL%oo*}echo ${MAIL%/*}

从右向左,最长匹配删除:${变量名%%关键词*}echo ${MAIL%%oo*}echo ${MAIL%%/*}

要适应不同扩展名文件的修改,并能够反向还原。

修改前的扩展名、修改后的扩展名通过位置变量 $1、$2提供。vim ../renfilex.sh#!/bin/bashfor FILE in "$1"do

mv $FILE ${FILE%$1}"$2"done

字符串初值的处理

只取值,${var:-word}

若变量var已存在且非Null,则返回 $var 的值;否则返回字串“word”,原变量var的值不受影响。

取值+赋值,${var:=word}

若变量var已存在且非Null,则返回 $var 的值,原变量值不变;否则返回字串“word”,并将此字串赋值给变量 var。

数据的定义和使用

建立数组的方法:格式1,整体赋值:数组名=(值1 值2 .. .. 值n)

格式2,单个元素赋值:数组名[下标]=值

查看数组元素的方法:获取单个数组元素:${数组名[下标]}

获取所有数组元素:${数组名[@]}

获取数组元素个数:${#数组名[@]}

获取连续的多个数组元素:${数组名[@]:起始下标:元素个数}

获取某个数组元素的长度:${#数组名[下标]}

截取数组元素值的一部分:${#数组名[下标]:起始下标:字符数}

declare命令的使用

在Shell环境中,变量默认均作为字符串处理,当参与expr、$[]数学运算时自动作为整数处理。比如,使用“1+2”、“X+2”、“$X+2”表达式是无法将运算结果直接作为整数赋值给指定的变量的:[root@service99 ~]# X=24[root@service99 ~]# A=1+2[root@service99 ~]# echo $A1+2                                  //赋值结果为字符串[root@service99 ~]# A=X+2[root@service99 ~]# echo $AX+2                                  //赋值结果为字符串[root@service99 ~]# A=$X+2[root@service99 ~]# echo $A24+2

若要将一个变量强制设置为整数,可以使用declare命令声明(-i选项):[root@service99 ~]# declare -i A          //先将A声明为整数变量

[root@service99 ~]# A=1+2                  //然后赋值

[root@service99 ~]# echo $A                  //确认结果

3

[root@service99 ~]# declare -i B=$X+2      //也可以在声明的同时进行赋值

[root@service99 ~]# echo $B

26

declare命令结合-x选项,可以将局部变量设置为全局变量,这个与export命令的作用差不多:[root@service99 ~]# declare -x NM="Tarena"      //新建全局变量NM

如果要取消变量的全局属性,可以使用“+x”选项:[root@service99 ~]# declare +x NM              //将NM恢复为局部变量

declare命令结合-r选项,可以为变量设置“只读”属性,只读变量的值不允许再被修改,通常可用来保存一些固定的参数,避免无意中被修改:[root@service99 ~]# echo $NM

Tarena

[root@service99 ~]# declare -r NM                  //将变量NM设置为只读

[root@service99 ~]# NM="Tarena IT Group."          //重新赋值失败-bash: NM: readonly variable

只读变量除了不能修改值以外,也无法被unset清除(若要清除只读变量,需要退出当前Shell程序):[root@service99 ~]# unset NM-bash: unset: NM: cannot unset: readonly variable

使用declare命令,结合-a选项可声明一个数组(这个操作一般可不做),比如:[root@service99 ~]# declare -a SVRS

直接执行declare -a,即不指定数组名参数时,会列出当前Shell环境中已定义的所有数组设置:[root@service99 ~]# declare -a                  //查看已定义的数组

若要定义数组的成员,可以在declare声明时定义,也可以直接整体定义。整体赋值的格式为“数组名=(值1 值2 值3 .. ..)”,比如:[root@service99 ~]# MY_SVRS=(www ftp mail club)

[root@service99 ~]# set | grep "MY_"              //查看数组定义结果

Shell中的语法要求是比较松散的,所以我们也可以直接为单个数组元素赋值,格式为“数组名[下标]=值”,每个数组元素的编号(即下标)从0开始。比如,以下操作会产生一个包括3个元素的数组:[root@service99 ~]# WEB_SVRS[0]="www.tarena.com"          //为第1个元素赋值

[root@service99 ~]# WEB_SVRS[1]="mail.tarena.com"          //为第2个元素赋值

[root@service99 ~]# WEB_SVRS[2]="club.tarena.com"          //为第3个元素赋值

为数组元素赋值时,并不要求每个成员都需要指定,下标也可以不连续。比如,可跳过下标3,直接为下标为4的元素赋值:

3)查看数组、查看数组元素

输出整个数组的内容:[root@service99 ~]# echo ${MY_SVRS[@]}

查看第1个(下标为0的)数组元素:[root@service99 ~]# echo ${MY_SVRS[0]}

输出数组中下标从1开始的2个元素:[root@service99 ~]# echo ${MY_SVRS[@]:1:2}

查看数组的元素个数:[root@service99 ~]# echo ${#MY_SVRS[@]}

当数组元素的内容较多时,直接输出 ${数组名[@]} 可能不方便查看,这种情况下可以利用循环遍历数组元素,通过连续取值的操作(或者 % 取模运算)限定每行只显示多少个IP地址(比如4个) 。

作者:海渊_haiyuan

链接:https://www.jianshu.com/p/a048de3843e8

linux中如何分割字符串数组中,Linux教程——Shell中字符串与数组操作实例相关推荐

  1. linux中split分割文件打开方式,Linux使用split对文件进行切分和合并的方法

    linux下文件分割可以通过split命令来实现,可以将一个大文件拆分成指定大小的多个文件,并且拆分速度非常的快,可以指定按行数分割和安大小分割两种模式.Linux下文件合并可以通过cat命令来实现, ...

  2. shell 分割字符串_谈一谈Shell中的贪婪匹配和非贪婪匹配

    Shell中的贪婪匹配和非贪婪匹配 非贪婪匹配,即匹配符合通配符的最短结果. 贪婪匹配,即匹配符合通配符的最长结果. 下面案例为例: 1.${VALUE%.*}或${VALUE%%.*}: 删除VAL ...

  3. linux类似的vlookup函数,VLOOKUP函数的使用方法介绍 VLOOKUP函数的操作实例

    VLOOKUP函数的使用方法说难也不难说简单也不简单,如果你还在表格中获取关键数据的信息,不如看看下文中的函数代码应用实例,以便让用户快速学习使用VLOOKUP函数和理解该函数的应用,具体操作如下. ...

  4. python123判断字符串结尾_Python学习教程:在字符串的开头和结尾处做文本匹配

    原标题:Python学习教程:在字符串的开头和结尾处做文本匹配 Python学习教程:在字符串的开头和结尾处做文本匹配 我们需要在字符串的开头和结尾处按照指定的文本模式做检查,例如检查文件的扩展名.U ...

  5. linux中split分割文件打开方式,Linux系统下使用split命令分割大文件 (转载)

    [小蜗牛闲情之作 ] 我想给一个朋友传一个大视频,有几百M,尝试多种传输办法失败后,最后想到的是把视频切开一片片"邮递"过去给他,让它自己组装起来吧. [root@pps publ ...

  6. python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...

    python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...

  7. 【SQL数据库】数据库的创建、查询、插入等操作使用方法(结合黑皮书教材网站(db-book中的例子)在MySQL Workbench和shell中实现查询操作

    SQL 数据库的创建.查询.插入等操作使用方法(结合黑皮书教材网站中的例子) 注:数据来源: https://www.db-book.com/university-lab-dir/sample_tab ...

  8. python中谷中文视频教学_python入门教程_中谷教育python中文视频教程(全38集)

    Python编程简单直接,难度低于java,更适合初学编程者,让初学者专注于编程逻辑,而不是困惑于晦涩的语法细节上. 该视频共有38集,视频讲解由浅至深,视频由入门到精通,视频内容丰富,讲解深入,是很 ...

  9. linux中的变量前加__user,linux中的环境变量,别名,变量传递和函数块

    一,概述 变量的定义 变量即在程序运行过程中它的值是允许改变的量 变量是用一串固定的字符来标示不固定的值的一种方法 变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储 Script 运 ...

  10. linux中l没有ll命令,manjaro linux没有ll等命令的解决办法

    Hive使用技巧 hive默认查询不会显示列名, 当一个表字段比较多的时候,往往看不出值与列之间的对应关系,对日常查错及定位问题带来不便,像下面这样. hive> >select * fr ...

最新文章

  1. #iOS问题记录#WKWebView 闪退异常
  2. C++中类成员函数的重载、覆盖和隐藏的区别,超清楚!
  3. 解析中间人攻击(1/4)---ARP缓存中毒
  4. ACM竞赛学习整理--矩阵运算
  5. 惠普服务器查询ilo信息,Hp服务器iLO IML硬件日志收集与远程巡检
  6. require,include,require_once和include_once之间的区别?
  7. Errors running builder #39;DeploymentBuilder#39; on project #39;工程名#39;
  8. 使用CucumberJS,让JavaScript与行为驱动开发结合
  9. 牛B装备 XSS 漏洞利用工具[使用教程]
  10. Java中的拦截器和过滤器有什么区别
  11. redis java 视频教程_Redis基础与提升视频教程
  12. 81章 老子1章到_三曜道长解读道德经: 信言不美 第81章
  13. (83)--用代码实现超越函数
  14. excel查找在哪里_HR:对不起,我们公司不招25岁还用不好Excel的人
  15. 孟岩亮相TokenSky,首谈通证的多维、多阶、多态体系
  16. 七大IT业界顶尖认证证书
  17. npm install报错:4048
  18. 分布式调度框架Elastic-Job和xxl-job区别
  19. element-ui时间组件使用
  20. 网吧软件限制的小技巧

热门文章

  1. 连接mysql失败怎么办_数据库连接失败有什么原因?怎么解决?
  2. H5游戏开发-Egret引擎
  3. matlab空间计量AIC准则,空间计量经分析课件.ppt
  4. 艺工交叉——达芬奇只会画画吗?
  5. 爬虫抓图全网最新方法,这一次终于是4k高清美图,只因为我不下载JPG图片!
  6. 计算机组成原理cpi是什么意思,计算机组成原理课程CPI教学方法探索
  7. 【Debug系列】ImportError: No module named ‘_tkinter‘
  8. 第八章——ICellStyle单元格样式操作
  9. 计算机台式内存条,台式电脑怎么装内存条_台式电脑加装内存条方法-win7之家
  10. python变成灰色_Python怎么把彩色图像转换成灰色图像?