37.第六章 Shell脚本编程高级进阶(二)
2021/11/8 7:11:52
本文主要是介绍37.第六章 Shell脚本编程高级进阶(二),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
4.2.12 select 循环与菜单
格式:
select NAME [in WORDS ... ;] do COMMANDS; done select variable in list ;do 循环体命令 done
说明:
- select 循环主要用于创建菜单,按数字顺序排列的菜单项显示在标准错误上,并显示 PS3 提示符,等待用户输入
- 用户输入菜单列表中的某个数字,执行相应的命令
- 用户输入被保存在内置变量 REPLY 中
- select 是个无限循环,因此要用 break 命令退出循环,或用 exit 命令终止脚本。也可以按 ctrl+c退出循环
- select 经常和 case 联合使用
- 与 for 循环类似,可以省略 in list,此时使用位置参量
范例:
[root@rocky8 ~]# type select select is a shell keyword [root@rocky8 ~]# help select select: select NAME [in WORDS ... ;] do COMMANDS; done Select words from a list and execute commands. The WORDS are expanded, generating a list of words. The set of expanded words is printed on the standard error, each preceded by a number. If `in WORDS' is not present, `in "$@"' is assumed. The PS3 prompt is then displayed and a line read from the standard input. If the line consists of the number corresponding to one of the displayed words, then NAME is set to that word. If the line is empty, WORDS and the prompt are redisplayed. If EOF is read, the command completes. Any other value read causes NAME to be set to null. The line read is saved in the variable REPLY. COMMANDS are executed after each selection until a break command is executed. Exit Status: Returns the status of the last command executed. [root@rocky8 ~]# select menu in backup upgrade downgrade clean ;do true ;done 1) backup 2) upgrade 3) downgrade 4) clean #? 1 #? ^C [root@rocky8 ~]# PS3="请选择相关序号: " [root@rocky8 ~]# select menu in backup upgrade downgrade clean ;do true ;done 1) backup 2) upgrade 3) downgrade 4) clean 请选择相关序号: 1 请选择相关序号: ^C
范例:
[root@rocky8 ~]# vim select.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-20 #FileName: select3.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* PS3="请选择相关序号: " select menu in backup upgrade downgrade clean; do case $menu in backup) echo backup ;; upgrade) echo upgrade ;; *) echo other ;; esac done [root@rocky8 ~]# bash select.sh 1) backup 2) upgrade 3) downgrade 4) clean 请选择相关序号: 1 backup 请选择相关序号: 2 upgrade 请选择相关序号: 3 other 请选择相关序号: 4 other 请选择相关序号: ^C [root@rocky8 ~]# vim select.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-20 #FileName: select.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* PS3="请选择相关序号" select menu in backup upgrade downgrade clean exit; do case $REPLY in 1) echo backup ;; 2) echo upgrade ;; 3) echo downgrade ;; 4) echo clean ;; 5) exit ;; *) echo input flase ;; esac done [root@rocky8 ~]# bash select2.sh 1) backup 2) upgrade 3) downgrade 4) clean 5) exit 请选择相关序号1 backup 请选择相关序号5
范例:
[root@rocky8 ~]# vim select3.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-20 #FileName: select2.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* # sum=0 PS3="请点菜(1-6): " select MENU in 北京烤鸭 佛跳墙 小龙虾 羊蝎子 火锅 点菜结束;do case $REPLY in 1) echo $MENU 价格是 100 let sum+=100 ;; 2) echo $MENU 价格是 88 let sum+=88 ;; 3) echo $MENU价格是 66 let sum+=66 ;; 4) echo $MENU 价格是 166 let sum+=166 ;; 5) echo $MENU 价格是 200 let sum+=200 ;; 6) echo "点菜结束,退出" break ;; *) echo "点菜错误,重新选择" ;; esac done echo "总价格是: $sum" [root@rocky8 ~]# bash select3.sh 1) 北京烤鸭 2) 佛跳墙 3) 小龙虾 4) 羊蝎子 5) 火锅 6) 点菜结束 请点菜(1-6): 1 北京烤鸭 价格是 100 请点菜(1-6): 8 点菜错误,重新选择 请点菜(1-6): 5 火锅 价格是 200 请点菜(1-6): 6 点菜结束,退出 总价格是: 300
5.1 管理函数
函数由两部分组成:函数名和函数体
帮助参看:help function
#语法一: func_name (){ ...函数体... } #语法二: function func_name { ...函数体... } #语法三: function func_name () { ...函数体... }
范例:
[root@rocky8 ~]# type function function is a shell keyword [root@rocky8 ~]# help function function: function name { COMMANDS ; } or name () { COMMANDS ; } Define shell function. Create a shell function named NAME. When invoked as a simple command, NAME runs COMMANDs in the calling shell's context. When NAME is invoked, the arguments are passed to the function as $1...$n, and the function's name is in $FUNCNAME. Exit Status: Returns success unless NAME is readonly. [root@rocky8 ~]# cd /etc/init.d/ [root@rocky8 init.d]# ls functions README [root@rocky8 init.d]# less functions
5.1.2 查看函数
#查看当前已定义的函数名 declare -F #查看当前已定义的函数定义 declare -f #查看指定当前已定义的函数名 declare -f func_name #查看当前已定义的函数名定义 declare -F func_name
范例:
[root@rocky8 init.d]# hello () { echo "hello,function"; } [root@rocky8 init.d]# declare -f hello #-f 显示函数内容 hello () { echo "hello,function" } [root@rocky8 init.d]# declare -F hello #-F 显示函数名称 hello [root@rocky8 init.d]# declare -F declare -f gawklibpath_append declare -f gawklibpath_default declare -f gawklibpath_prepend declare -f gawkpath_append declare -f gawkpath_default declare -f gawkpath_prepend declare -f hello [root@rocky8 init.d]# hello hello,function
5.1.3 删除函数
格式:
unset func_name
范例:
[root@rocky8 init.d]# unset hello [root@rocky8 init.d]# hello -bash: hello: command not found
5.2 函数调用
函数的调用方式
- 可在交互式环境下定义函数
- 可将函数放在脚本文件中作为它的一部分
- 可放在只包含函数的单独文件中
调用:函数只有被调用才会执行,通过给定函数名调用函数,函数名出现的地方,会被自动替换为函数代码
函数的生命周期:被调用时创建,返回时终止
5.2.1 交互式环境调用函数
交互式环境下定义和使用函数
范例:
[root@rocky8 ~]# dir() { > ls -l > } [root@rocky8 ~]# dir total 116 -rw-------. 1 root root 1318 Oct 6 19:20 anaconda-ks.cfg
范例:实现判断CentOS的主版本
[root@rocky8 init.d]# centos_version() { > sed -rn 's#^.* +([0-9]+)\..*#\1#p' /etc/redhat-release > } [root@rocky8 init.d]# centos_version 8 root@ubuntu1804:~# ubuntu_version(){ > sed -rn '2s/^.*="([0-9]+)\..*/\1/p' /etc/os-release > } root@ubuntu1804:~# ubuntu_version 18
5.2.2 在脚本中定义及使用函数
函数在使用前必须定义,因此应将函数定义放在脚本开始部分,直至shell首次发现它后才能使用,调用函数仅使用其函数名即可
范例:
[root@rocky8 ~]# vim test1.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test1.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* func1(){ echo func1 is runing } func1 [root@rocky8 ~]# bash test1.sh func1 is runing [root@rocky8 ~]# vim test1.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test1.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* func1 func1(){ echo func1 is runing } [root@rocky8 ~]# bash test1.sh test1.sh: line 12: func1: command not found #函数要先定义,再执行 [root@rocky8 ~]# vim test1.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test1.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* func1 func1(){ echo func1 is runing } func1 [root@rocky8 ~]# bash test1.sh test1.sh: line 12: func1: command not found func1 is runing
5.2.3 使用函数文件
可以将经常使用的函数存入一个单独的函数文件,然后将函数文件载入shell,再进行调用函数
文件名可任意选取,但最好与相关任务有某种联系,例如:functions
一旦函数文件载入shell,就可以在命令行或脚本中调用函数。可以使用delcare -f 或set 命令查看所有定义的函数,其输出列表包括已经载入shell的所有函数
若要改动函数,首先用unset命令从shell中删除函数。改动完毕后,再重新载入此文件
实现函数文件的过程:
- 创建函数文件,只存放函数的定义
- 在shell脚本或交互式shell中调用函数文件,格式如下
. filename 或 source filename
范例:
[root@rocky8 ~]# vim test2.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test2.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* func1(){ echo func1 is runing } func1 [root@rocky8 ~]# bash test2.sh func1 is runing [root@rocky8 ~]# vim functions func1 (){ echo func1 is running } func2 (){ echo func2 is running } [root@rocky8 ~]# vim test1.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test1.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions declare -F func1 [root@rocky8 ~]# bash test1.sh declare -f func1 declare -f func2 func1 is running [root@rocky8 ~]# exit logout [root@rocky8 ~]# declare -F declare -f gawklibpath_append declare -f gawklibpath_default declare -f gawklibpath_prepend declare -f gawkpath_append declare -f gawkpath_default declare -f gawkpath_prepend
5.3 函数变量
变量作用域:
- 普通变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程;因此,本地变量的作用范围是当前shell脚本程序文件,包括脚本中的函数
- 环境变量:当前shell和子shell有效
- 本地变量:函数的生命周期;函数结束时变量被自动销毁
注意:
- 如果函数中定义了普通变量,且名称和局部变量相同,则使用本地变量
- 由于普通变量和局部变量会冲突,建议在函数中只使用本地变量
在函数中定义本地变量的方法
local NAME=VALUE
范例:
[root@rocky8 ~]# vim functions func1 (){ name=raymond echo func1 is running echo "func1:name=$name" } func2 (){ echo func2 is running } [root@rocky8 ~]# vim test1.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test1.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions declare -F func1 echo $name [root@rocky8 ~]# bash test1.sh declare -f func1 declare -f func2 func1 is running func1:name=raymond raymond [root@rocky8 ~]# vim test1.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test1.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions declare -F name=tom func1 echo $name [root@rocky8 ~]# bash test1.sh declare -f func1 declare -f func2 func1 is running func1:name=raymond raymond [root@rocky8 ~]# bash -x test1.sh + . functions + declare -F declare -f func1 declare -f func2 + name=tom + func1 + name=raymond + echo func1 is running func1 is running + echo func1:name=raymond func1:name=raymond + echo raymond raymond [root@rocky8 ~]# vim test1.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test1.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions declare -F func1 name=tom echo $name [root@rocky8 ~]# bash test1.sh declare -f func1 declare -f func2 func1 is running func1:name=raymond tom [root@rocky8 ~]# vim functions func1 (){ local name=raymond echo func1 is running echo "func1:name=$name" } func2 (){ echo func2 is running } #local 定义的变量只能在函数体内工作 [root@rocky8 ~]# vim test1.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test1.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions declare -F name=tom func1 echo $name [root@rocky8 ~]# bash test1.sh declare -f func1 declare -f func2 func1 is running func1:name=raymond tom [root@rocky8 ~]# vim test1.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test1.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions declare -F name=tom echo $name func1 echo $name [root@rocky8 ~]# bash test1.sh declare -f func1 declare -f func2 tom func1 is running func1:name=raymond tom [root@rocky8 ~]# vim test1.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test1.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions declare -F name=raymond echo before function:name=$name func1 echo agter function:name=$name [root@rocky8 ~]# bash test1.sh declare -f func1 declare -f func2 before function:name=raymond func1 is running func1:name=raymond agter function:name=raymond
5.4 函数返回值
函数的执行结果返回值:
- 使用echo等命令进行输出
- 函数体中调用命令的输出结果
函数的退出状态码:
- 默认取决于函数中执行的最后一条命令的退出状态码
- 自定义退出状态码,其格式为:
return 从函数中返回,用最后状态命令决定返回值
return 0 无错误返回
return 1-255 有错误返回
范例:
[root@rocky8 ~]# type return return is a shell builtin [root@rocky8 ~]# help return return: return [n] Return from a shell function. Causes a function or sourced script to exit with the return value specified by N. If N is omitted, the return status is that of the last command executed within the function or script. Exit Status: Returns N, or failure if the shell is not executing a function or script. [root@rocky8 ~]# return 10 -bash: return: can only `return' from a function or sourced script [root@rocky8 ~]# vim test2.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test2.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions func2 echo $? [root@rocky8 ~]# bash test2.sh func2 is running 0 [root@rocky8 ~]# vim functions func1 (){ local name=raymond echo func1 is running echo "func1:name=$name" } func2 (){ echo func2 is running exit 123 } [root@rocky8 ~]# bash test2.sh func2 is running [root@rocky8 ~]# bash -x test2.sh + . functions + func2 + echo func2 is running func2 is running + exit 123 [root@rocky8 ~]# vim functions func1 (){ local name=raymond echo func1 is running echo "func1:name=$name" } func2 (){ echo func2 is running return 123 } [root@rocky8 ~]# bash test2.sh func2 is running 123
5.5 函数参数
函数可以接受参数:
传递参数给函数:在函数名后面以空白分隔给定参数列表即可,如:testfunc arg1 arg2 …
在函数体中当中,可使用$1, 2 , . . . 调 用 这 些 参 数 ; 还 可 以 使 用 2, ...调用这些参数;还可以使用 2,...调用这些参数;还可以使用@, $*, $#等特殊变量
范例:
[root@rocky8 ~]# vim test3.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test3.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions add 2 3 [root@rocky8 ~]# vim functions func1 (){ local name=raymond echo func1 is running echo "func1:name=$name" } func2 (){ echo func2 is running return 123 } add(){ local i=$1 local j=$2 echo $[i+j] } [root@rocky8 ~]# bash test3.sh 5 [root@rocky8 ~]# vim test3.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test3.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions add $1 $2 [root@rocky8 ~]# bash test3.sh 5 6 11 [root@rocky8 ~]# vim functions func1 (){ local name=raymond echo func1 is running echo "func1:name=$name" } func2 (){ echo func2 is running return 123 } add(){ local i=$1 local j=$2 echo $[i+j] } sub(){ local i=$1 local j=$2 echo $[i-j] } [root@rocky8 ~]# vim test3.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: test3.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* . functions case $1 in add) add $2 $3 ;; sub) sub $2 $3 ;; *) echo input false ;; esac [root@rocky8 ~]# bash test3.sh 5 6 input false [root@rocky8 ~]# bash test3.sh add 5 6 11 [root@rocky8 ~]# bash test3.sh sub 7 6 1
范例:实现进度条功能
[root@rocky8 ~]# vim progress_chart.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: progress_chart.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* function print_chars(){ # 传入的第一个参数指定要打印的字符串 local char="$1" # 传入的第二个参数指定要打印多少次指定的字符串 local number="$2" local c for ((c = 0; c < number; ++c)); do printf "$char" done } COLOR=32 declare -i end=50 for ((i = 1; i <= end; ++i)); do printf "\e[1;${COLOR}m\e[80D[" print_chars "#" $i print_chars " " $((end - i)) printf "] %3d%%\e[0m" $((i * 2)) sleep 0.1s done echo [root@rocky8 ~]# bash progress_chart.sh [##################################################] 100%
5.6 函数递归
函数递归:函数直接或间接调用自身,注意递归层数,可能会陷入死循环
递归特点:
- 函数内部自已调用自已
- 必须有结束函数的出口语句
范例: 无出口的递归函数调用
[root@rocky8 ~]# func () { let i++;echo $i;echo "func is running..,"; func; } [root@rocky8 ~]# func
递归示例:
阶乘是基斯顿·卡曼于 1808 年发明的运算符号,是数学术语,一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0和1的阶乘为1,自然数n的阶乘写作n!
n!=1×2×3×…×n
阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n
n!=n(n-1)(n-2)…1
n(n-1)! = n(n-1)(n-2)!
范例:fact.sh
[root@rocky8 ~]# vim fact.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: fact.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* fact(){ if [ $1 -eq 1 ];then echo 1 else echo $[$1*$(fact $[$1-1])] fi } fact $1 [root@rocky8 ~]# bash fact.sh 5 120 [root@rocky8 ~]# vim fact2.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: fact2.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* fact(){ local num=$1 if [[ $num -eq 0 ]];then fac=1 else dec=$((num-1)) fact $dec fac=$((num*fac)) fi } fact $1 echo "$1的阶乘是:$fac" [root@rocky8 ~]# bash fact2.sh 5 5的阶乘是:120
fork 炸弹是一种恶意程序,它的内部是一个不断在 fork 进程的无限循环,实质是一个简单的递归程序。由于程序是递归的,如果没有任何限制,这会导致这个简单的程序迅速耗尽系统里面的所有资源
参考:https://en.wikipedia.org/wiki/Fork_bomb
函数
:(){ :|:& };: bomb() { bomb | bomb & }; bomb
脚本实现
[root@rocky8 ~]# :(){ :|:& };: [1] 8722 [root@rocky8 ~]# vim Bomb.sh #!/bin/bash # #********************************************************************************************** #Author: Raymond #QQ: 88563128 #Date: 2021-10-21 #FileName: Bomb.sh #URL: raymond.blog.csdn.net #Description: The test script #Copyright (C): 2021 All rights reserved #********************************************************************************************* ./$0|./$0&
5.7 练习
- 编写函数,实现OS的版本判断
- 编写函数,实现取出当前系统eth0的IP地址
- 编写函数,实现打印绿色OK和红色FAILED
- 编写函数,实现判断是否无位置参数,如无参数,提示错误
- 编写函数,实现两个数字做为参数,返回最大值
- 编写服务脚本/root/bin/testsrv.sh,完成如下要求
(1) 脚本可接受参数:start, stop, restart, status
(2) 如果参数非此四者之一,提示使用格式后报错退出
(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
考虑:如果事先已经启动过一次,该如何处理?
(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
考虑:如果事先已然停止过了,该如何处理?
(5) 如是restart,则先stop, 再start
考虑:如果本来没有start,如何处理?
(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAME is running…”,如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped…”
(7)在所有模式下禁止启动该服务,可用chkconfig 和 service命令管理
说明:SCRIPT_NAME为当前脚本名 - 编写脚本/root/bin/copycmd.sh
(1) 提示用户输入一个可执行命令名称
(2) 获取此命令所依赖到的所有库文件列表
(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
如:/bin/bash ==> /mnt/sysroot/bin/bash
/usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd
(4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下: 如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能;直到用户输入quit退出 - 斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2),利用函数,求n阶斐波那契数列
- 汉诺塔(又称河内塔)问题是源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,利用函数,实现N片盘的汉诺塔的移动步骤
这篇关于37.第六章 Shell脚本编程高级进阶(二)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南