复杂的数据结构和计算不是 bash 的特长。但它的确至少提供了数组和算术运算。

1.算术运算

  所有的 bash 变量的值都是字符串,所以 bash 在赋值的时候并不区分数字 1 和 字符串 "1" 。不同之处在于如何使用变量。下面几行代码展示出了其中的差异:

#!/bin/bash

a=
b=$(())
c=$a+$b
d=$(($a+$b)) echo "$a + $b = $c \t(plus sign as string literal)"
echo "$a + $b = $d \t(plus sign as arithmetic addition)"

运行结果:

root@javis:~/Documents/bash$ ./array.sh
+ = + \t(plus sign as string literal)
+ = \t(plus sign as arithmetic addition)

  注意给$c 赋值的语句,其中的加号(+) 连字符串的连接运算符都不是。它仅仅就是一个字符而已。那行代码等价于:

c="$a+$b"

  为了强制进行数值计算,要把这个表达式放在 $((...))里面,就像上面给 $d 赋值一样。但即便如此,也不会让 $d 获得一个数值;它的值让然保存为字符串 "3" 。

2.数组运算

  数组用括号括起来,数组元素之间用空白隔开。数组元素中的空白要用引号引起来。

example=(aa  'bb cc'  dd)

  单个数组元素用 ${array_name[subscript]}来访问。下标从 0 开始。下标 * 和 @ 指整个数组,${#array_name[*]}和${#array_name[@]}这两种特殊形式表示数组里元素的个数。不要把它们和似乎更合乎逻辑的${#array_name}搞混了;后者实际上是数组第一个元素的长度(等价于${#array_name[0]})。

  $array_name[1] 容易让人以为是指数组的第二个元素,这一点无可争议,但 bash 对这个字符串的分析结果却是:$array_name 加上一个字符串 [1]。在访问数组变量的时候,一定要带花括号----这一点无一例外。

  下面是一个快速脚本,它演示了 bash 中数组管理的一些功能和缺陷:

#!/bin/bash
example=(aa 'bb cc' dd)
example[]=ee
echo "example[@] = ${example[@]}"
echo "example array contains ${#example[@]} elements"
for elt in "${example[@]}"; do
echo "Element = $elt"
done

运行结果:

root@javis:~/Documents/bash$ sh array1.sh
example[@] = aa bb cc dd ee
example array contains elements
Element = aa
Element = bb cc
Element = dd
Element = ee

如果用下面这一句代码替换 for 语句那一行代码:

for elt in ${example[@]} ; do

这也可以执行,但它却不是输出4个数组元素,而是5个: aa 、bb、cc、dd 和 ee。

  这个问题的背后,是因为所有的 bash 变量实质上仍是字符串,所以数组的表象充其量还是不确定的。字符串什么时候分割成数字元素,怎样分割成数组元素,都有很细微的变化。可以使用 Perl 或者 Python 来研究这些细微的差别。

UNIX/Linux系统管理技术手册(3)----bash 数组和算术运算的更多相关文章

  1. UNIX/Linux系统管理技术手册(2)----bash脚本编程

    1. 一个简单的例子: $ vim readname.sh #file:readname.sh#!/bin/bash echo -n "Enter your name: " rea ...

  2. Unix/Linux系统管理技术手册学习笔记——shell

    创建日期:2016/02/29 更新日期:2016/02/29 shell变量赋值时不能在等号两边留空白,否则shell会把变量名误认为是命令名 双引号括起来的变量可以进行替换(用*和?这样的文件名匹 ...

  3. UNIX/Linux系统管理技术手册(1)----脚本和shell

    1. 管道和重定向 (i) 要让第二条命令只有在第一条命令成功完成之后才执行,可以用一个 && 符号把两条命令隔开.例如: $ > /dev/null && cd ...

  4. Linux系统管理技术手册——第6章 添加新用户

    6.1/etc/passwd文件 用户登录时Linux识别用户的文件/etc/passwd /etc/passwd包括7个字段: 登录名(不超过32位,使用NIS系统后不超过8位) 经过加密的口令或口 ...

  5. Unix&Linux技术文章目录(2015-12-22更新)

    Unix & Linux 方面的博客整理.归纳分类,要坚持不懈的学习Unix &Linux,加油!技术需要累积和沉淀.更需要锲而不舍的精神.持之以恒的毅力!借此下面名句勉励自己! 书上 ...

  6. Manual | BSD手册| Linux手册 | 数据库手册 | 编程开发手册 | WEB开发手册 | 软件应用手册 | 网络技术手册 | GNU手册

    豆豆手册 □ BSD手册 □ Linux手册 □ 数据库手册 □ 编程开发手册 □ WEB开发手册 □ 软件应用手册 □ 网络技术手册 □ GNU手册 在线手册 首 页 BSD手册   ·FreeBS ...

  7. 【程序员技术练级】熟悉Unix/Linux Shell和常见的命令行(一)文件系统结构和基本操作

    作为程序猿,熟悉一些unix/linux命令行是非常必要的,因为部署服务的服务器现在基本上用的都是unix/linux系统,很少在windows上部署服务的. 今天我们就介绍一些在linux上的文件系 ...

  8. Linux系统管理常用命令

    Linux系统管理常用命令 分类: Linux2011-01-10 18:26 1538人阅读 评论(0) 收藏 举报 linuxcommandservicenginxuserunix 目录(?)[+ ...

  9. UNIX/Linux C 程序员需要掌握的七种武器

    我是一名普通的软件工程师,不是什么技术大牛.这篇文章所提到的"七种武器"只是我这些年工作经验的一点体会和感悟,如果有错误的地方,还请大家指正. (一)C语言 作为一名C程序员,熟练 ...

随机推荐

  1. CentOS虚拟机断电或强制关机,再开机出现问题:Entering emergency mode. Exit the shell to continue.

    解决问题: 输入命令:xfs_repair -v -L /dev/dm-0

  2. (转载)一位资深程序员大牛给予Java初学者的学习建议

    这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议? 今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要 ...

  3. Tomcat部署项目的三种方式

    目录 1.下载 Tomcat 服务器 2.启动并部署 Tomcat 服务器 3.Tomcat 的目录结构 4.部署项目的第一种方法(项目直接放入 webapps 目录中) 5.部署项目的第二种方法(修 ...

  4. pandas中数据框的一些常见用法

    1.创建数据框或读取外部csv文件 创建数据框数据 """ 设计数据 """ import pandas as pd data = {&qu ...

  5. Jquery ajax, Axios, Fetch区别

    1.   Jquery ajax, Axios, Fetch区别之我见 2.   ajax.axios.fetch之间的详细区别以及优缺点

  6. 【DB2】普通用户最小查询权限分配

    1. 通过实例用户或者有dbadm权限的用户连接数据库 db2 connect to <db-name> 2. 分配普通用户连接权限db2 "grant connect on d ...

  7. MySQL 的数据库、表基本操作

    1.链接数据库 mysql -u root -ppassword 2创建数据库 create database mr_book; 3选择数据库 use mr_book; 4 创建表 create ta ...

  8. HTTP 状态代码之汇总+理解

    这里有百度百科的介绍,还挺全的. 下面是在开发过程中遇到过的各种码,自己的问题自己的原因,同码不同错,贱笑贱笑. HTTP 406 Not Acceptable 这个错误的原因,是由于框架使用了`Sp ...

  9. <数据挖掘导论>读书笔记5关联分析的基本概念和算法

    关联规则的强度可以用support度和confidence(置信)度来度量 关联规则发现  给定事务的集合T,关联规则发现是指找出支持度大于等于minsup并且置信度大于等于minconf的所有规则, ...

  10. 利用Map解决复杂业务

    遍历出题库表的题库名称和题库id,根据题目id即questionBankId获取 分组,即该题库题目总数,该题库题目正确数,该题库已回答题目数. <sqltemplate id="co ...