热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LinuxShell编程(3)Shell运算

一、declare命令shell变量是弱类型,且默认都是字符串型declare命令可以给变量设定或取消类型1.语法declare[-+][选项][变量名]2.选项-:给变量设定类型

一、declare 命令

shell 变量是弱类型,且默认都是字符串型

declare 命令可以给变量设定或取消类型

1. 语法

declare [-/+][选项] [变量名]

2. 选项

-:给变量设定类型属性

+:取消变量的类型属性

-a:将变量声明为数组类型(array)
-i:将变量声明为整数类型(integer)

-x:将变量声明为环境变量
-r:将变量声明为证只读变量

-p:显示指定变量的被声明的类型

3. 把变量声明为数值型

declare -i [变量名]

[root~]# a=1
[root~]# b=2
[root~]# declare -i c=$a+$b
[root~]# echo $c
3
[root~]# declare -p c
declare -i c="3"

4. 声明数组变量

定义数组

数组名[n]=值
declare -a 数组名[n]=值
注意,n只能是数字

查看数组

  • ${数组名}:查看数组第一个元素,即array[0]的值
  • ${数组名[n]}:n为数字,查看数组指定下标的值
  • ${数组名[*]}:查看数组中所有的值

删除数组

  • 删除数组指定下标的值

unset 数组名[n]

  • 删除整个数组

unset 数组名

实例

  • 定义数组下标[2]和下标[3],没有定义下标[0]

[root~]# array[2]=2
[root~]# declare -a array[3]=3

  • 查看数组第一个元素,即array[0]的值,因为没有,所以输出为空

[root~]# echo ${array}

  • 查看数组下标[3]的值

[root~]# echo ${array[3]}
3

  • 查看数组中所有的值

[root~]# echo ${array[*]}
2 3

  • 定义数组下标[0]的值,并输出

[root~]# array[0]=0
[root~]# echo ${array}
0
[root~]# echo ${array[*]}
0 2 3

  • 删除数组下标[3]

[root~]# unset array[3]
[root~]# echo ${array[*]}
0 2

  • 删除整个数组

[root~]# unset array
[root~]# echo ${array[*]}

5. 声明环境变量

export 变量名=变量值
declare -x 变量名=变量值

6. 声明变量只读属性

具有只读属性的变量不能修改,不能删除,甚至不能取消只读属性!

实例

  • 声明变量只读属性

[root~]# declare -r var="I am a readonly variable"

  • 不能修改

[root~]# var=change
-bash: var: readonly variable

  • 不能删除

[root~]# unset var
-bash: unset: var: cannot unset: readonly variable

  • 不能取消只读属性

[root~]# declare +r var
-bash: declare: var: readonly variable

7. 查询变量的属性

查询所有变量的属性

declare -p

查询指定变量的属性

declare -p [变量名]

实例

[root~]# declare -p
declare -- BASH="/bin/bash"
...省略...
declare -ir UID="0"
declare -x USER="root"
declare -x USERNAME="root"
[root~]# declare -p BASH
declare -- BASH="/bin/bash"
[root~]# declare -p PATH
declare -x PATH="/sbin:/bin:/usr/sbin:/usr/bin"

二、数值运算的方法

1. declare -i sum=$num1+$num2

[root~]# num1=1
[root~]# num2=2
[root~]# declare -i sum=$num1+$num2
[root~]# echo $sum
3

2. expr

expr 用法

sum=$(expr $num1 + $num2)

[root~]# num1=1
[root~]# num2=2
[root~]# sum=$(expr $num1 + $num2)
[root~]# echo $sum
3

  • expr 运算符中间必须有空格,否则:

[root~]# sum=$(expr $num1+$num2)
[root~]# echo $sum
1+2

3. let

let 用法

let [变量名]=[运算式]

[root~]# let sum=$num1+$num2
[root~]# echo $sum
3
[root~]# let num=(1+2)*3/4+5
[root~]# echo $num
7

4. $((运算式))$[运算式] (常用)

$((运算式))

[root~]# a=1
[root~]# b=2
[root~]# c=$(($a+$b))
[root~]# echo $c
3

  • 运算符中间也可以加空格

[root~]# c=$(( $a + $b ))
[root~]# echo $c
3

$[运算式]

[root~]# c=$[$a+$b]
[root~]# echo $c
3

  • 运算符中间也可以加空格

[root~]# c=$[ $a + $b ]
[root~]# echo $c
3

5. 运算符优先级

运算符优先级从高到低排序

运算符说明
- , +单目负,单目正
! , ~逻辑非,按位取反或补码
* , /, %乘,除,取余
+ , -加,减
<< , >>按位左移,按位右移
< , > , <= , >=小于,大于,小于等于,大于等于
== , !=等于,不等于
&按位与
^按位异或
|按位或
&&逻辑与
||逻辑或
= , += , -= , *= , /= , %= ,
&= , ^= , |= , <<= , >>=
赋值、运算且赋值

优先级相同的,从左到右运算。

有小括号的,先算小括号里面的。

实例

  • 加。减、乘、除、取余、小括号

[root~]# a=$(( 4 + 5 * 3 / 2 ))
[root~]# echo $a
11
[root~]# b=$(( (4 + 5) * 3 / 2 ))
[root~]# echo $b
13
[root~]# c=$(( (4 + 5) * 3 % 5 ))
[root~]# echo $c
2
[root~]# d=$(( (4 + 5) * 3 / (2 + 1) ))
[root~]# echo $d
9

  • 按位与

[root~]# e=$(( 1 & 0 ))
[root~]# echo $e
0

  • 按位或

[root~]# f=$(( 1 | 0 ))
[root~]# echo $f
1

  • 按位异或

[root~]# g=$(( 1 ^ 2 ))
[root~]# echo $g
3

三、变量测试

变量测试一般在脚本优化时使用。

格式复杂多样,语法简单。

1. 变量测试表

《Linux Shell编程(3) - Shell 运算》

2. 实例

以变量测试表第一行 {x=${y-n}} 为例

  • 变量y没有设置时,x=n

[root~]# unset y
[root~]# x=${y-1}
[root~]# echo $x
1

  • 变量y为空值时,x=空值

[root~]# y=''
[root~]# x=${y-1}
[root~]# echo $x

  • 变量y有值时,x=$y

[root~]# y=2
[root~]# x=${y-1}
[root~]# echo $x
2

推荐阅读
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • STM32与FPGA的对比及学习建议
    本文对比了野火STM32F103指南针板和Xilinx的PYNQ-Z2板(ZYNQ-7020),介绍了野火STM32F103指南针板的学习资料和讲解视频的详细程度,建议初学者学习野火的资料。同时,介绍了STM32开发所用的Keil程序和C指针的重要性。对于ZYNQ-7020的开发,提到了其自带的Linux、Ubuntu18.4系统以及使用SD卡烧入镜像的方法。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
author-avatar
烟台中海地产有限公司往
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有