zoukankan      html  css  js  c++  java
  • Shell 字符串

    字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似,输出语句echo和PHP也挺像。

    单引号

    str='this is a string'
    

    单引号字符串的限制:

    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

    双引号

    your_name='qinjx'
    str="Hello, I know your are "$your_name"! 
    "
    

    双引号的优点:

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

    反引号

     反引号用于将系统命令的输出到变量

    字符串的值

    表达式 含义
    ${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开头进行声明的变量

    拼接字符串

    your_name="abc"
    greeting="hello, "$your_name" !"
    greeting_1="hello, ${your_name} !"
    echo $greeting $greeting_1
    

    获取字符串长度

    string="abcd"
    echo ${#string} #输出 4
    

    查找子字符串

    查找字符 "is" 的位置:

    string="runoob is a great company"
    echo `expr index "$string" is`  # 输出 8    "`" 是反引号,而不是单引号 "'"
    

    字符串截取

    假设有变量 var=http://blog.csdn.net/Liveor_Die

    1. # 号截取,删除左边字符,保留右边字符。

    echo ${var#*//}
    

    其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符

    即删除 http://

    结果是 :blog.csdn.net/Liveor_Die

    2. ## 号截取,删除左边字符,保留右边字符。

    echo ${var##*/}  #  #、## 表示从左边开始删除。一个 # 表示从左边删除到第一个指定的字符;两个 # 表示从左边删除到从右边第一个/及左边的所有字符。
    

    ##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符

    即删除http://blog.csdn.net/

    结果是Liveor_Die

    3. %号截取,删除右边字符,保留左边字符

    echo ${var%/*}
    

    %/* 表示从右边开始,删除第一个 / 号及右边的字符

    结果是:http://blog.csdn.net

    4. %% 号截取,删除右边字符,保留左边字符

    echo ${var%%/*}
    

    %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符

    结果是:http:

    5. 从左边第几个字符开始,及字符的个数

    echo ${var:0:5}
    

    其中的 0 表示左边第一个字符开始,5 表示字符的总个数。

    结果是:http:

    6. 从左边第几个字符开始,一直到结束。

    echo ${var:7}
    

    其中的 7 表示左边第8个字符开始,一直到结束。

    结果是 :blog.csdn.net/Liveor_Die

    7. 从右边第几个字符开始,及字符的个数

    echo ${var:0-7:3}
    

    其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。

    结果是:ero

    8. 从右边第几个字符开始,一直到结束。

    echo ${var:0-7}
    

    表示从右边第七个字符开始,一直到结束。

    结果是:eor_Die

    注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

    字符串替换

    用replace替换字符串中的子串substring

    格式:${str/substring/replace}或者${str//substring/replace}

    替换字符串中第一个abc

    echo ${str/abc/TEST}  echo ${str/abc/TEST}  
    

    替换字符串中所有的abc

    echo ${str//abc/TEST}  
    

    从str开头匹配,用TEST替换最长的a*c

    echo ${str/#a*c/TEST}
    

    从str结尾匹配,用TEST替换最长的b*l

    echo ${str/%b*l/TEST}
    

    expr操作字符串

    对于上面的一些操作,如果改用expr执行,能简化一些。

    str='hello world!'  
    #求字符串长度  
    length=`expr length $str`  
    echo $length  
    
    #截取字符串  
    substr=`expr substr $str 1 4`  
    echo $substr  
    
    
    #求字符串中元素的下标索引,如果元素不存在输出0(因为此时索引从1开始)  
    index=`expr index $str "l"`  
    echo $index  
    
  • 相关阅读:
    [Go] 解决空接口 interface{} cannot use (type []string) as type []interface {}
    [Linux] 脚本中的set -e有什么作用
    [Go] 解决go test 时 testing: warning: no tests to run
    [Go] go for range循环map是无序的 变成有序
    [Linux] ubuntu 32位 i686 安装docker
    [Git] git checkout 恢复未add的修改文件
    [MySQL] in 子查询出现DEPENDENT SUBQUERY问题
    [MySQL] group by 聚合函数的原理和聚合限制原因SELECT list is not in GROUP BY clause and contains nonaggregated column
    [MySQL]mysql的ANY_VALUE()函数 解决 ONLY_FULL_GROUP_BY 模式
    [Go] GODEBUG=inittrace=1 查看所有执行的init函数
  • 原文地址:https://www.cnblogs.com/yangliguo/p/8001247.html
Copyright © 2011-2022 走看看