博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNIX/Linux系统管理技术手册(3)----bash 数组和算术运算
阅读量:6981 次
发布时间:2019-06-27

本文共 1614 字,大约阅读时间需要 5 分钟。

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

1.算术运算

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

#!/bin/basha=1b=$((2))c=$a+$bd=$(($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 1 + 2 = 1+2 \t(plus sign as string literal)1 + 2 = 3 \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/bashexample=(aa 'bb cc' dd)example[3]=eeecho "example[@] = ${example[@]}"echo "example array contains ${#example[@]} elements"for elt in "${example[@]}"; do        echo "Element = $elt"done

运行结果:

root@javis:~/Documents/bash$ sh array1.shexample[@] = aa bb cc dd eeexample array contains 4 elementsElement = aaElement = bb ccElement = ddElement = ee

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

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

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

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

 

转载于:https://www.cnblogs.com/dongling/p/5685632.html

你可能感兴趣的文章
Python(十)之GUI编程
查看>>
基于Docker的redis集群搭建
查看>>
文件分割机
查看>>
[Winform]WebKit.Net使用
查看>>
17 HTTP编程入门
查看>>
Eclipse安装Jetty插件(Web容器)
查看>>
js使用defineProperty的一些坑
查看>>
python 识别验证码
查看>>
【转】android IDE——通过DDMS查看app运行时所占内存情况
查看>>
运维常说的 5个9、4个9、3个9 的可靠性,到底是什么???
查看>>
[SQL] 函数整理(T-SQL 版)
查看>>
Java+大数据开发——HDFS详解
查看>>
.NET Core 使用RabbitMQ
查看>>
ArcGIS AO中控制图层中要素可见状态的总结
查看>>
Win10的UWP之标题栏的返回键(一)
查看>>
LINUX中常用操作命令
查看>>
几种常见随机过程
查看>>
【计算机网络】聊一聊那些常见的网络通信的性能指标
查看>>
mysql5.7 启动报发生系统错误2
查看>>
多进程单线程模型与单进程多线程模型之争
查看>>