在做shell批处理程序时候,常常会涉及到字符串相关操作。

有非常多命令语句。如:awk,sed都能够做字符串各种操作。 事实上shell内置一系列操作符号。能够达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。

一、推断读取字符串值

表达式 含义
${var} 变量var的值, 与$var同样
   
${var-DEFAULT} 假设var没有被声明, 那么就以$DEFAULT作为其值 *
${var:-DEFAULT} 假设var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
   
${var=DEFAULT} 假设var没有被声明, 那么就以$DEFAULT作为其值 *
${var:=DEFAULT} 假设var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
   
${var+OTHER} 假设var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER} 假设var被设置了, 那么其值就是$OTHER, 否则就为null字符串
   
${var?ERR_MSG} 假设var没被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG} 假设var没被设置, 那么就打印$ERR_MSG *
   
${!varprefix*} 匹配之前全部以varprefix开头进行声明的变量
${!varprefix@} 匹配之前全部以varprefix开头进行声明的变量

增加了“*”  不是意思是: 当然, 假设变量var已经被设置的话, 那么其值就是$var.

[chengmo@localhost ~]$ echo ${abc-'ok'}

ok

[chengmo@localhost ~]$ echo $abc

[chengmo@localhost ~]$ echo ${abc='ok'}

ok

[chengmo@localhost ~]$ echo $abc

ok

假设abc 没有声明“=" 还会给abc赋值。

[chengmo@localhost ~]$ var1=11;var2=12;var3=

[chengmo@localhost ~]$ echo ${!v@}            

var1 var2 var3

[chengmo@localhost ~]$ echo ${!v*}

var1 var2 var3

${!varprefix*}与${!varprefix@}相似,能够通过变量名前缀字符,搜索已经定义的变量,不管是否为空值。

二、字符串操作(长度,读取。替换)

表达式 含义
${#string} $string的长度
   
${string:position} 在$string中, 从位置$position開始提取子串
${string:position:length} 在$string中, 从位置$position開始提取长度为$length的子串
   
${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
   
${string/substring/replacement} 使用$replacement, 来取代第一个匹配的$substring
${string//substring/replacement} 使用$replacement, 取代全部匹配的$substring
${string/#substring/replacement} 假设$string的前缀匹配$substring, 那么就用$replacement来取代匹配到的$substring
${string/%substring/replacement} 假设$string的后缀匹配$substring, 那么就用$replacement来取代匹配到的$substring
   

说明:"* $substring”能够是一个正則表達式.

1.长度

[web97@salewell97 ~]$ test='I love china'

[web97@salewell97 ~]$ echo ${#test}

12

${#变量名}得到字符串长度

2.截取字串

[chengmo@localhost ~]$ test='I love china'

[chengmo@localhost ~]$ echo ${test:5}     

e china

[chengmo@localhost ~]$ echo ${test:5:10} 

e china

${变量名:起始:长度}得到子字符串

3.字符串删除

[chengmo@localhost ~]$ test='c:/windows/boot.ini'

[chengmo@localhost ~]$ echo ${test#/}

c:/windows/boot.ini

[chengmo@localhost ~]$ echo ${test#*/}

windows/boot.ini

[chengmo@localhost ~]$ echo ${test##*/}

boot.ini

[chengmo@localhost ~]$ echo ${test%/*} 

c:/windows

[chengmo@localhost ~]$ echo ${test%%/*}

${变量名#substring正則表達式}从字符串开头開始配备substring,删除匹配上的表达式。

${变量名%substring正則表達式}从字符串结尾開始配备substring,删除匹配上的表达式。

注意:${test##*/},${test%/*} 各自是得到文件名称,或者文件夹地址最简单方法。

4.字符串替换

[chengmo@localhost ~]$ test='c:/windows/boot.ini'

[chengmo@localhost ~]$ echo ${test/\//\\}

c:\windows/boot.ini

[chengmo@localhost ~]$ echo ${test//\//\\}

c:\windows\boot.ini

${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换全部,当查找中出现了:”/”请加转义符”\/”表示。

三、性能比較

在shell中。通过awk,sed,expr 等都能够实现,字符串上述操作。以下我们进行性能比較。

[chengmo@localhost ~]$ test='c:/windows/boot.ini'                       

[chengmo@localhost ~]$ time for i in $(seq 10000);do a=${#test};done;

real    0m0.173s

user    0m0.139s

sys     0m0.004s

[chengmo@localhost ~]$ time for i in $(seq 10000);do a=$(expr length $test);done;

real    0m9.734s

user    0m1.628s

速度相差上百倍,调用外部命令处理,与内置操作符性能相差很大。在shell编程中。尽量用内置操作符或者函数完毕。

使用awk,sed类似会出现这样结果。

Shell脚本中替换字符串等操作的更多相关文章

  1. Shell脚本中执行sql语句操作mysql的5种方法【转】

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

  2. 学习Linux shell脚本中连接字符串的方法

    这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...

  3. shell脚本中给字符串添加颜色

    shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: echo -e "\033[字背景颜色:文字颜色m字符串\033[0m" 例如: ec ...

  4. Shell脚本中执行sql语句操作mysql

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

  5. SHELL脚本中执行SQL语句操作MYSQL的5种方法

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

  6. Shell脚本中计算字符串长度的5种方法

    有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前Shell中获取字符串的长度的多种方法,在这里分享给大家,方法如下: 方法1: 使用wc -L命令wc -L可以获取到当前行 ...

  7. Shell脚本中判断字符串是否被包含在内

    1.字段 grep:案例: str1="abcdefgh"str2="def"result=$(echo $str1 | grep "${str2}& ...

  8. shell脚本中关于日期的操作

    一.计算指定日期的前一天的日期 date -d "yesterday 20150401 " +%Y%m%d 二.如果获取当前日期的前一天        date -d " ...

  9. Shell脚本中判断字符串是否被包含在内并且使用grep 精确匹配

    str1="abcdefgh" str2="def" result=$(echo $str1 | grep "${str2}") if [[ ...

随机推荐

  1. RocketMQ学习笔记(1)----RocketMQ的简介

    1. 什么是RocketMQ? 是一个队列模型的消息中间件,具有高性能.高可靠.高实时.分布式特点. Producer.Consumer.队列都可以分布式.  Producer 吐一些队列轮流収送消息 ...

  2. BZOJ 5104 Fib数列(二次剩余+BSGS)

    斐波那契数列的通项: \[\frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})-(\frac{1-\sqrt{5}}{2}))\] 设T=\(\sqrt{5}*N\),\ ...

  3. [HEOI2012]采花(树状数组+离线)

    听说这题的所发和HH的项链很像. 然而那道题我使用莫队写的... 这是一个套路,pre数组加升维(在线). 记录一个\(pre\)数组,\(pre[i]\)代表上一个和i颜色相同的下标. 我们把询问离 ...

  4. luogu P2252 取石子游戏(威佐夫博弈)

    题意 题解 对于像我这种不知道威佐夫博弈的人来说,拿到题就开始打表了. 然而打完后并没有发现什么. 然后才知道是威佐夫博弈. 结论是当(int)((b-a)*((sqrt(5.0)+1.0)/2.0) ...

  5. [洛谷P1835]素数密度

    题目大意:求区间[l,r]中素数的个数($1\leq l,r\le 2^{31}$,$r-l\leq 10^6$). 解题思路:首先,用筛法筛出$2~\sqrt{r}$内的素数. 然后用这些素数筛l~ ...

  6. (50)与magento集成

    我对接的是 odoo8 和 magento1.9.x 准备工作: l  服务器 装上mangento 组件 : $  pip install magento 装上 requests 组件:$ pip ...

  7. 新手做2D手游该用哪些工具?

    全球手游行业规模将突破250亿美元,越来越多的开发者开始进入手游研发领域,而作为一名菜鸟,很多时候,如果没有其他开发者的建议,会走很多弯路.一开始进入游戏研发领域的时候,你很难知道该选择什么工具.什么 ...

  8. [Python]Use Flask-Admin with PostgreSQL

    This code recipe gives you an idea of how to use Flask-Admin with postgresql database. from flask im ...

  9. CentOS-6.4-minimal版中源代码安装MySQL-5.5.38

    完整版见https://jadyer.github.io/2014/09/29/centos-install-mysql/ /** * CentOS-6.4-minimal版中源代码安装MySQL-5 ...

  10. d堆

    就是d叉堆,是二叉堆的简单推广(http://blog.csdn.net/buleriver/article/details/38469907) 对于一个d堆.也是能够使用数组表示.关键是怎样通过索引 ...