Shell 编程快速入门 之 数学计算和函数基础

这篇具有很好参考价值的文章主要介绍了Shell 编程快速入门 之 数学计算和函数基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Shell 编程快速入门 之 数学计算和函数基础,Linux,linux

1. 求两数之和

整数之和

shell程序的数字类型只有整数类型一种,并不支持浮点数。如:

hann@HannYang:~$ cat sum.sh
#!/bin/bash

# 读取第一个数
echo "请输入第一个数:"
read a

# 读取第二个数
echo "请输入第二个数:"
read b

# 计算两个数的和
sum=$(( a + b ))

# 输出结果
echo "这两个数的和为:$sum"
hann@HannYang:~$ bash sum.sh
请输入第一个数:
5
请输入第二个数:
3
这两个数的和为:8
hann@HannYang:~$

浮点数之和 

在shell编程中,浮点数只能被用作字符串来操作,脚本语法本身不提供浮点数的操作方法,但可以调用bc, awk等外部命令来计算并返回结果。如:

hann@HannYang:~$ cat sum2.sh
#!/bin/bash

num1=3.14
num2=2.72

# 计算和
sum=$(echo "$num1 + $num2" | bc)
echo "$num1 + $num2 = $sum"

sum=$(echo $num1 $num2 | awk '{print $1+$2}')
echo "$num1 + $num2 = $sum"
hann@HannYang:~$ bash sum2.sh
3.14 + 2.72 = 5.86
3.14 + 2.72 = 5.86

两个或多个数的运算只有列出算式计算就行了;但要处理的数据比较多,或者数量预先不可知就要循环来处理重复的操作。

2. 计算1-100的和

用1~100累和的例子,示例循环结构的各种语句的写法:

C风格for循环

hann@HannYang:~$ sum=0;for ((i=1; i<=100; i++));do let sum+=i;done;echo $sum

for...in

hann@HannYang:~$ sum=0;for i in {1..100};do let sum+=i;done;echo $sum

while...do

sum=0  # 初始化变量sum为0
i=1  # 初始化计数器i为1
while [ $i -le 100 ]; do  # 当计数器i小于等于100时执行循环体
    let sum+=i  # 将当前整数累加到sum中
    i=$((i+1))  # 计数器自增1
done  # 结束循环
echo $sum  # 打印出变量sum的值

until...do

sum=0  # 初始化变量sum为0
i=1  # 初始化计数器i为1
until [ $i -gt 100 ]; do  # 当计数器i大于100时执行循环体
    let sum+=i  # 将当前整数累加到sum中
    i=$((i+1))  # 计数器自增1
done  # 结束循环
echo $sum  # 打印出变量sum的值

while和until的区别

while循环是当条件测试为真时执行,为假时退出循环
until循环是当条件测试为假时执行,为真时退出循环

while A; do 等价于 until not A; do
until A; do 等价于 while not A; do

while [ ! $i -gt 100 ]; do  <==> until [ $i -gt 100 ]; do
until [ ! $i -le 100 ]; do  <==> while [ $i -le 100 ]; do

break与continue的区别 

break语句用于退出本层循环,当执行到break会立即跳出当前循环,执行后续代码。
在多层嵌套循环中,break只会跳出最近的一层循环。

continue语句用于结束本次循环,跳过本次循环中剩余的代码,直接进入下一次循环。
在多层嵌套循环中,continue只会跳过最近的一层循环。

两种语句的基本用法与其它语言的基本一样,不另举例说明。

关系运算符

-eq    equal 即 ==,检测两个数是否相等,相等返回 true。
-ne    not equal 即 !=,检测两个数是否不相等,不相等返回 true。
-gt    great than 即 >,检测左边的数是否大于右边的,如果是,则返回 true。
-lt     less than 即 <,检测左边的数是否小于右边的,如果是,则返回 true。
-ge    great equal 即>=,检测左边的数是否大于等于右边的,如果是,则返回 true。
-le    less equal,即<=,检测左边的数是否小于等于右边的,如果是,则返回 true。


3. 九九乘法表

用九九乘法表的例子,展示双重循环的写法:

C风格for双重循环 

上面单循环已讲过,双重循环也就那样与C的风格基本一样:

#!/bin/bash
for ((i=1;i<=9;i++)); do
	for ((j=1;j<=i;j++)); do
		echo -n "$j*$i=$((i*j)) "
	done
	echo
done

输出:

1*1=1 
1*2=2 2*2=4 
1*3=3 2*3=6 3*3=9 
1*4=4 2*4=8 3*4=12 4*4=16 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 

上面2~3数字没对准,这是echo的缺点,可以用if条件语句分2种情况来校正。

换一个方法,使用printf命令可以指定输出格式:

#!/bin/bash
for ((i=1;i<=9;i++)); do
	for ((j=1;j<=i;j++)); do
		printf "$j*$i=%2d " $((i*j))
 	done
	echo
done

输出: 

1*1= 1 
1*2= 2 2*2= 4 
1*3= 3 2*3= 6 3*3= 9 
1*4= 4 2*4= 8 3*4=12 4*4=16 
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25 
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

printf "$j*$i=%2d " $((i*j)) 还能写成 printf "%d*%d=%2d " $j $i $((i*j))

printf集合也和C语言的输出函数printf()比较类似的;第一列结果还是多了空格,暂时不改了

for...in 双重循环

当j>i时,continue:
#!/bin/bash
for i in {1..9}; do
	for j in {1..9}; do
		if [ $j -gt $i ];then continue;fi
		printf "$j*$i=%2d " $[i*j]
	done
	echo
done
用eval命令实现 {1..$i
#!/bin/bash
for i in {1..9}; do
	for j in `eval echo {1..$i}`; do
		printf "$j*$i=%2d " $[i*j]
	done
	echo
done

eval 用``反引号字符串,也可以用: $(eval echo {1..$i}),等价的。

用外部命令seq实现
#!/bin/bash
for i in `seq 9`; do
	for j in `seq $i`; do
		printf "$j*$i=%2d " $[i*j]
	done
	echo
done

seq的用法:产生一个数字序列,可认定是个等差数列:

hann@HannYang:~$ which seq
/usr/bin/seq
hann@HannYang:~$ seq --help
Usage: seq [OPTION]... LAST
  or:  seq [OPTION]... FIRST LAST
  or:  seq [OPTION]... FIRST INCREMENT LAST
Print numbers from FIRST to LAST, in steps of INCREMENT.

Mandatory arguments to long options are mandatory for short options too.
  -f, --format=FORMAT      use printf style floating-point FORMAT
  -s, --separator=STRING   use STRING to separate numbers (default: \n)
  -w, --equal-width        equalize width by padding with leading zeroes
      --help     display this help and exit
      --version  output version information and exit

If FIRST or INCREMENT is omitted, it defaults to 1.  That is, an
omitted INCREMENT defaults to 1 even when LAST is smaller than FIRST.
The sequence of numbers ends when the sum of the current number and
INCREMENT would become greater than LAST.
FIRST, INCREMENT, and LAST are interpreted as floating point values.
INCREMENT is usually positive if FIRST is smaller than LAST, and
INCREMENT is usually negative if FIRST is greater than LAST.
INCREMENT must not be 0; none of FIRST, INCREMENT and LAST may be NaN.
FORMAT must be suitable for printing one argument of type 'double';
it defaults to %.PRECf if FIRST, INCREMENT, and LAST are all fixed point
decimal numbers with maximum precision PREC, and to %g otherwise.
......

示例:

hann@HannYang:~$ seq 5
1
2
3
4
5
hann@HannYang:~$ seq 0 3
0
1
2
3
hann@HannYang:~$ seq 1 2 7
1
3
5
7
hann@HannYang:~$ seq 0 2 7
0
2
4
6
hann@HannYang:~$ seq -w 8 12
08
09
10
11
12
hann@HannYang:~$ seq 0.5 0.25 2.1
0.50
0.75
1.00
1.25
1.50
1.75
2.00

支持“步长”step,放在起始数字中间的,格式:seq start step end,三个参数还可以是浮点数。


文章来源地址https://www.toymoban.com/news/detail-666169.html

到了这里,关于Shell 编程快速入门 之 数学计算和函数基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux shell快速入门

    一安装linux的虚拟环境 查看是否具备执行权限 新增执行权限 执行hello.sh文件 hello world

    2024年02月12日
    浏览(39)
  • 【Linux系统基础快速入门详解】根据计算机硬件特性优化企业网站集群性能方案

    鱼弦:CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 优化企业网站集群性能是一个复杂的任务,不仅涉及硬件特性的优化,还需要考虑网络架构、负载均衡、缓存策略等多个方面。下面是

    2024年02月07日
    浏览(102)
  • Linux Shell 编程入门

            从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着

    2024年02月14日
    浏览(46)
  • 【Linux命令行与Shell脚本编程】第十六章 Shell函数

    脚本函数基础 函数返回值 在函数中使用变量 数组变量和函数 函数递归 创建库 在命令行中使用函数 可以将shell脚本代码放入函数中封装起来,这样就能在脚本的任意位置多次使用. 函数是一个脚本代码块,可以并在脚本中的任何位置重用它。当需要在脚本中使用该代码块时

    2024年02月14日
    浏览(55)
  • Linux shell编程学习笔记24:函数定义和使用

    *20231113 补充了实例使用for循环来简化代码的内容 为了实现模块化设计和代码重用,很多编程语言支持函数或过程,Linux shell也支持函数定义和调用。 Linux shell中的函数与其它编程语言很多有相似之处,也有自己独特之处。 其中: function是 Shell 中的,专门用来定义函数

    2024年02月05日
    浏览(61)
  • Linux 系统shell脚本编程笔记——脚本入门

    目录 1、创建shell脚本文件  2、显示消息 3、 环境变量 4、用户变量 5、命令替换 ​编辑  6、重定向输入与输出 6.1、输出重定向  6.2、输入重定向 ​编辑 7、执行数学运算 7.1、expr命令 7.2、bc的基本用法  8、退出脚本 完整笔记请前往此处获取:https://download.csdn.net/download/qq

    2024年02月06日
    浏览(69)
  • Linux编程基础:第4章Shell编程 课后习题

    《Linux编程基础》黑马程序员/编著 清华大学出版社 目录 一、填空题 二、判断题 三、单选题 四、简答题 1、分析以下脚本代码: 2、写出shell脚本中while循环与until循环的基本格式,并简述这两种循环结构的区别。 五、编程题 1、编写shell脚本实现如下菜单界面: 2、编写she

    2024年02月07日
    浏览(39)
  • 【Linux】shell编程4(break语句、continue、exit、shell的函数、返回值return)

    break语句用于从for、while、until或select循环中退出、停止循环的执行。 语法: n代表嵌套循环的层级,如果指定了n,break将退出n级嵌套循环。 如果没有指定n或n小于 1,则退出状态码为0,否则退出状态码为n。 一句话总结:跳出当前循环 continue语句用于跳过循环体中剩余的命令

    2024年02月04日
    浏览(46)
  • 算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理

    互质就是两个数的最大公因数只有1,体现到代码里面就是 a和b互质,则b mod a = 1 mod a (目前我不是很理解,但是可以这样理解:a和b的最大公因数是1,即1作为除数和b作为除数时,对于被除数a来说余数是一样的,即1/a的余数和b/a是一样的,即 b mod a = 1 mod a ) 欧拉函数的作用是

    2024年02月09日
    浏览(45)
  • Linux实验4 shell脚本编程基础

    1.假设在/tmp下有以当前用户的帐号命名的目录,请在命令行中临时修改环境变量PATH的值,要求该目录的路径附加到该变量的最后。 2.请在命令行中临时设置命令输入提示行格式为:“当前系统时间-用户#”。 3.在命令行定义一个字符串变量str,并且赋值为“test for shell”,然

    2024年04月17日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包