bash 的字符串和数组

回顾下自己接触过的编程语言,字符串数组真是基础中的基础。也因此,在接触一门新的语言的时候,非常有必要去熟悉该语言的字符串数组

字符串

声明和赋值

name='jero' # 单引号
hellojero="hello, $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@}

同上

${var:-DEFAULT} vs ${var:=DEFAULT}

这两个真的非常像,那么它们的区别是什么呢?

foo1=${bar1:-'abc'}
echo $foo1; # abc
echo $bar1; # 空

foo2=${bar2:='abc'}
echo $foo2; # abc
echo $bar2; # abc

# 区别很明显了,bar1 没有赋值, bar2 被赋值了

操作

长度

echo ${#name} #4

# 有些资料上会有如下方式:
echo `expr length "$name"`
# 在 mac(10.11.4) 上,会 `syntax error`
# 这是因为 GUN 的 expr 和 BSD 的 expr 有很大的不同,用的时候一定要慎重
# 具体可参考 https://discussions.apple.com/thread/923299

# 可做如下尝试:
echo `expr "$name" : '.*'` # 4

拼接

拼接就比较灵活了,但不外乎如下几种方式。

hei="hei, $name" # 利用双引号
family='jiang'
echo "$hei $family" # hei, jero jiang
echo $hei $family # 当然也可以不用双引号,但是可读性降低了

子字符串

表达式

含义

${#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 可以是正则。

下面来个实例。

long='123456789abcdefg123456789abcdefg123456789'
echo ${#long} # 41,长度
echo ${long:3} # 456789abcdefg123456789abcdefg123456789,从第三位开始截取
echo ${long:3:6} # 456789,从第三位开始截取长度为 6 的子串
echo ${long#*a} # bcdefg123456789abcdefg123456789,从头删除最短匹配
echo ${long##*a} # bcdefg123456789,从头删除最长匹配
echo ${long%a*} # 123456789abcdefg123456789,从尾开始删除最短匹配
echo ${long%%a*} # 123456789,从尾开始删除最长匹配
echo ${long/abc/ABC} # 123456789ABCdefg123456789abcdefg123456789,替换首次出现的子字符串
echo ${long//abc/ABC} # 123456789ABCdefg123456789ABCdefg123456789,全局替换
echo ${long/#123/ABC} # ABC456789abcdefg123456789abcdefg123456789,字符串的前面数位和 123 匹配,替换之
echo ${long/%789/ABC} # 123456789abcdefg123456789abcdefg123456ABC,字符串的后面数位和 789 匹配,替换之

数组

bash 支持一维数组,下标从 0 开始。

declare -a array_name # 声明一个数组,但并没人这么用

arr1=(value0 value1 value2 value3 value)
# 或者
arr1=(
    value0
    value1
    value2
    value3
    value4
) # !!!元素之间没有逗号


# 数组元素不用连续
arr2[0]=v0,
arr2[100]=v100

# 取数组元素,必须用大括号模式
echo ${arr1[3]} # value2
echo ${arr2[100]} # v100

# 使用 `@` 或 `*` 可以获取数组中的所有元素
echo ${arr1[*]} # value0 value1 value2 value3 value4
echo ${arr2[@]} # v1 v100

# 获取数组的长度
echo ${#arr1[*]} # 5
echo ${#arr2[@]} # 2

参考文章

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏任浩强的运维生涯

mongodb高级应用

一、  高级查询 查询操作符 条件操作符:db.collection.find({“field”:{$gt/$lt/$gte/$lte/$eq/$ne:valu...

33710
来自专栏三木的博客

Linux shell 程序设计5——shell中一些特殊符号的用法总结

1、{} 大括号: eg: ls my_{finger,toe}s 这条命令相当于如下两个命令的组合: ls my_fingers ; ls my_toes e...

1656
来自专栏有趣的Python

2018.2最新-Scrapy+elasticSearch+Django打造搜索引擎直至部署上线(三)爬虫基础知识

最终项目上线演示地址: http://search.mtianyan.cn 第三节:本节我们先得了解点你做爬虫做搜索引擎的居家必备知识基础。 Github地址:...

2784
来自专栏郑科的专栏

PHP7 新特性简介(一)

PHP7是PHP编程语言全新的一个版本,在性能方面获得了极大的提升。官方的文档显示,PHP7可以达到PHP5.x版本两倍的性能。同时还提供了很多其他语言流行的语...

4350
来自专栏架构之路

离线Tarjan算法-最近公共祖先问题

转载自Tarjan算法 LCA问题(Least Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通...

2875
来自专栏WindCoder

JSON中关于对双向关联的支持

本文原文:Bidirectional Relationship Support in JSON

772
来自专栏闻道于事

Oracle数据库 拾漏补缺

select语句的基本使用 可以查询需要的列,行,可以进行多表链接,连接查询。 ? select e.*,e.sal/30 from p_emp e selec...

3188
来自专栏数据之美

Python FAQ(常见问题解答)(1)

声明:转载需署名出处,严禁用于商业用途! 1、python的帮助: help(str) 可以查看str字符类的帮助信息。 2、python没有括号来表明...

1788
来自专栏企鹅号快讯

编写高效简洁代码的那些招式1

高效的代码,每期都会给大家介绍一下编码的技巧,让我们代码更整洁更高效。我们会从python 语言切入,讲一讲如何写的代码更pythonic 。Pythonic ...

1656
来自专栏代码世界

Python之面向对象四

面向对象进阶 一、关于面向对象的两个内置函数 isinstance   判断类与对象的关系    isinstance(obj,cls)检查obj是否是类 cl...

36213

扫码关注云+社区