UNIX/Linux系统管理技术手册(3)----bash 数组和算术运算
复杂的数据结构和计算不是 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 数组和算术运算的更多相关文章
- UNIX/Linux系统管理技术手册(2)----bash脚本编程
1. 一个简单的例子: $ vim readname.sh #file:readname.sh#!/bin/bash echo -n "Enter your name: " rea ...
- Unix/Linux系统管理技术手册学习笔记——shell
创建日期:2016/02/29 更新日期:2016/02/29 shell变量赋值时不能在等号两边留空白,否则shell会把变量名误认为是命令名 双引号括起来的变量可以进行替换(用*和?这样的文件名匹 ...
- UNIX/Linux系统管理技术手册(1)----脚本和shell
1. 管道和重定向 (i) 要让第二条命令只有在第一条命令成功完成之后才执行,可以用一个 && 符号把两条命令隔开.例如: $ > /dev/null && cd ...
- Linux系统管理技术手册——第6章 添加新用户
6.1/etc/passwd文件 用户登录时Linux识别用户的文件/etc/passwd /etc/passwd包括7个字段: 登录名(不超过32位,使用NIS系统后不超过8位) 经过加密的口令或口 ...
- Unix&Linux技术文章目录(2015-12-22更新)
Unix & Linux 方面的博客整理.归纳分类,要坚持不懈的学习Unix &Linux,加油!技术需要累积和沉淀.更需要锲而不舍的精神.持之以恒的毅力!借此下面名句勉励自己! 书上 ...
- Manual | BSD手册| Linux手册 | 数据库手册 | 编程开发手册 | WEB开发手册 | 软件应用手册 | 网络技术手册 | GNU手册
豆豆手册 □ BSD手册 □ Linux手册 □ 数据库手册 □ 编程开发手册 □ WEB开发手册 □ 软件应用手册 □ 网络技术手册 □ GNU手册 在线手册 首 页 BSD手册 ·FreeBS ...
- 【程序员技术练级】熟悉Unix/Linux Shell和常见的命令行(一)文件系统结构和基本操作
作为程序猿,熟悉一些unix/linux命令行是非常必要的,因为部署服务的服务器现在基本上用的都是unix/linux系统,很少在windows上部署服务的. 今天我们就介绍一些在linux上的文件系 ...
- Linux系统管理常用命令
Linux系统管理常用命令 分类: Linux2011-01-10 18:26 1538人阅读 评论(0) 收藏 举报 linuxcommandservicenginxuserunix 目录(?)[+ ...
- UNIX/Linux C 程序员需要掌握的七种武器
我是一名普通的软件工程师,不是什么技术大牛.这篇文章所提到的"七种武器"只是我这些年工作经验的一点体会和感悟,如果有错误的地方,还请大家指正. (一)C语言 作为一名C程序员,熟练 ...
随机推荐
- 干掉Vivado幺蛾子(2)-- 快速替换debug probes
目录 1. 什么是ECO 2. 操作步骤 参考文献: 我们做项目,进入找bug阶段时,需要用ILA捕获相关的信号.之前我做项目,每改动一次探针(debug probes),都要重新综合.实现,通常要花 ...
- StringBuffer与StringBuilder的区别比较
关于AbstractStringBuilder 首先通过查看源码发现,StringBuffer与StringBuilder都继承自AbstractStringBuilder抽象类.而AbstractS ...
- 获取LAMP与LNMP的编译参数
1.查看nginx的编译参数[root@LNMP ~]# /application/nginx/sbin/nginx -Vnginx version: nginx/1.6.3built by gcc ...
- JS实现跨域请求数据--CORS
https://www.cnblogs.com/cjw-ryh/p/7674038.html?utm_source=debugrun&utm_medium=referral
- sql 性能优化相关--总结别人的总结,未做验证,先归纳
sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索引,索引不合理 没有 ...
- python any和all
摘自<流畅的Python> all 和 any 也是内置的归约函数. all(iterable) 如果 iterable 的每个元素都是真值,返回 True:all([]) 返回 True ...
- fastclick源码分析
https://www.cnblogs.com/diver-blogs/p/5657323.html 地址 fastclick.js源码解读分析 阅读优秀的js插件和库源码,可以加深我们对web开发 ...
- c++ 网络编程(六)LINUX下 socket编程 多播与广播 实现一次发送所有组客户端都能接收到
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614288.html 一.多播 锲子:有这么一种情况,网络电台可能需要同时向成千上万的用户传输 ...
- unity优化
1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式,但他们都兼容ETC格式, 2. 对于透明贴图,我们只能选择RGBA 16 ...
- 在ubuntu10.10下安装Google谷歌拼音输入法
安装步骤如下:1.下载文件:sudo wget http://malu.googlecode.com/files/scim-googlepinyin.tar.gz(经测试,这个链接已经失效了,幸好有前 ...