翼度科技»论坛 云主机 LINUX 查看内容

shell简明教程3函数

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
3 函数

在本章中,您将了解为什么以及何时需要使用函数。 你将学习如何创建函数以及如何使用函数。 我们将讨论变量及其作用域。 学习如何使用参数访问传递给函数的参数。 最后,您还将学习如何使用函数处理退出状态和返回代码。
计算机编程和应用程序开发中有一个概念叫做 DRY。 DRY 是 "不要重复"(Don't Repeat Yourself)的缩写。 通过函数,您只需编写一次代码块,即可多次使用。每次需要执行特定任务或功能时,只需调用包含该代码的函数,而无需重复几行代码。这有助于缩短脚本的长度,还能让您在一个地方对给定任务进行更改、测试、故障排除和记录。所有这些都使脚本更易于维护。
每当您需要在脚本中多次执行同一操作时,这就表明您可能应该为该操作编写函数。 函数只是可重复使用的代码块,它执行操作并返回退出状态或返回代码。 函数在调用前必须先定义。 调用函数时,可以向函数传递数据。 您可以在函数中以参数的形式访问这些数据。
3.1 创建函数

创建函数有两种方法。 第一种方法是明确使用关键字function,然后在关键字后面加上函数名称和括号。 然后使用开头的大括号。 当函数被调用时,后面的代码或命令将被执行。要结束函数,请使用结尾大括号。
  1. function function-name() {
  2.     # Code goes here.
  3. }
复制代码
声明函数的第二种方法与第一种完全相同,只是在声明中不使用关键字 unction。 其他一切保持不变。
  1. function-name() {
  2.     # Code goes here.
  3. }
复制代码
3.2 调用函数

要调用函数,只需在脚本中列出函数名称即可。 调用函数时,不要使用括号。 你可能在其他编程语言中见过这种语法和样式,但在shell脚本中不起作用。 只需将函数名称放在一行中,它就会执行该函数。
运行此脚本时,屏幕上会显示 "Hello!"。
  1. #!/bin/bash
  2. function hello() {
  3.     echo "Hello!"
  4. }
  5. hello
复制代码
执行:
  1. $ ./functions-01.sh
  2. Hello!
复制代码
函数可以调用其他函数:
  1. #!/bin/bash
  2. function hello() {
  3.     echo "Hello!"
  4.     now
  5. }
  6. function now() {
  7.     echo "It's $(date +%r)"
  8. }
  9. hello
复制代码
执行:
  1. Hello!
  2. It's 下午 08时42分21秒
复制代码
函数必须在使用前声明,不要这样做:
  1. #!/bin/bash
  2. function hello() {
  3.     echo "Hello!"
  4.     now
  5. }
  6. # This will cause an error as the "now()" function is not yet defined.
  7. hello
  8. function now() {
  9.     echo "It's $(date +%r)"
  10. }
复制代码
执行:
  1. $ ./functions-03.sh
  2. Hello!
  3. ./functions-03.sh: line 5: now: command not found
复制代码
脚本语言不是预编译的。 在某些语言中,你可以在任何地方定义函数,编译器会检查所有源代码,然后将它们拼凑在一起,最终执行程序。 在脚本中,命令和组件会在运行时从上到下读取。最好将所有函数放在脚本的顶部。 这样可以确保在使用前定义好所有函数。
3.3 位置参数

使用$1、2等参数访问这些传入参数的值。 唯一不同的是,$0仍然是脚本本身的名称。您不能使用 $0 访问函数的名称,但好消息是,无论如何您都不会真的想这样做。
要向函数发送数据,请在函数名称后输入数据。 在本例中,hello 函数的调用只有一个参数,即 Jason 。 这意味着 hello 函数中 $1 的内容是 "Jason"。 正如你所猜测的,这个脚本的输出就是 "Hello Jason"。
  1. #!/bin/bash
  2. function hello() {
  3.     echo "Hello $1"
  4. }
  5. hello Jason
复制代码
执行:
  1. $ ./functions-04.sh
  2. Hello Jason
复制代码
下面脚本将循环处理传递给hello函数的每个参数:
  1. #!/bin/bash
  2. function hello() {
  3.     for NAME in $@
  4.     do
  5.         echo "Hello $NAME"
  6.     done
  7. }
  8. hello Jason Dan Ryan
复制代码
执行:
  1. $ ./functions-05.sh
  2. Hello Jason
  3. Hello Dan
  4. Hello Ryan
复制代码
参考资料

3.4 变量作用域

默认情况下,所有变量都是全局变量。 这意味着变量及其值可以在脚本的任何地方访问,包括在任何函数中。在使用变量之前,必须先定义变量。
  1. #!/bin/bash
  2. my_function() {
  3.     echo "$GLOBAL_VAR"
  4. }
  5. GLOBAL_VAR=1
  6. # The value of GLOBAL_VAR is available to my_function
  7. my_function
复制代码
执行:
  1. $ ./functions-06.sh
  2. 1
复制代码
如果在函数中定义了全局变量,那么在函数被调用和执行之前,它在函数之外是不可用的。
  1. #!/bin/bash
  2. my_function() {
  3.     echo "$GLOBAL_VAR"
  4. }
  5. # The value of GLOBAL_VAR is NOT available to my_function since GLOBAL_VAR was defined after my_function was called.
  6. my_function
  7. GLOBAL_VAR=1
复制代码
执行:
  1. ./functions-07.sh
复制代码
  1. #!/bin/bash
  2. my_function() {
  3.     GLOBAL_VAR=1
  4. }
  5. # GLOBAL_VAR not available yet.
  6. echo "GLOBAL_VAR value BEFORE my_function called: $GLOBAL_VAR"
  7. my_function
  8. # GLOBAL_VAR is NOW available
  9. echo "GLOBAL_VAR value AFTER my_function called: $GLOBAL_VAR"
复制代码
执行:
  1. $ ./functions-08.sh
  2. GLOBAL_VAR value BEFORE my_function called:
  3. GLOBAL_VAR value AFTER my_function called: 1
复制代码
3.5 局部变量

局部变量是指只能在声明它的函数中访问的变量。 在变量名前使用local关键字。 只有在首次使用局部变量时才使用local关键字。最佳做法是在函数内部使用局部变量。
  1. #!/bin/bash
  2. my_function() {
  3.     local LOCAL_VAR=1
  4.     echo "LOCAL_VAR can be accessed inside of the function: $LOCAL_VAR"
  5. }
  6. my_function
  7. # LOCAL_VAR is not available outside of the function.
  8. echo "LOCAL_VAR can NOT be accessed outside of the function: $LOCAL_VAR"
复制代码
执行:
  1. ./functions-09.sh
  2. LOCAL_VAR can be accessed inside of the function: 1
  3. LOCAL_VAR can NOT be accessed outside of the function:
复制代码

3.6 退出状态和返回代码

函数也有退出状态,有时也称为返回代码。 可以通过使用return语句明确设置退出状态,并在后面加上希望返回的状态。 如果不使用返回语句,函数的退出状态就是函数中最后执行的命令的退出状态。
返回语句只接受数字。 只有介于0和255之间的整数才能用作退出状态。 退出状态为0表示命令或函数成功完成。非0的退出状态表示某种类型的错误。要访问函数的退出状态,请在调用函数后立即使用$?。
在本代码段中,$?的值将是 my_function 函数的退出状态。
  1. my_function
  2. echo $?
复制代码
实例:backup_file函数将创建文件的备份,并将其放入/var/tmp目录。
  1. #!/bin/bash
  2. function backup_file () {
  3.   # This function creates a backup of a file.
  4.   # Make sure the file exists.
  5.   if [ -f "$1" ]
  6.   then
  7.     # Make the BACKUP_FILE variable local to this function.
  8.     local BACKUP_FILE="/tmp/$(basename ${1}).$(date +%F).$$"
  9.     echo "Backing up $1 to ${BACKUP_FILE}"
  10.     # The exit status of the function will be the exit status of the cp command.
  11.     cp $1 $BACKUP_FILE
  12.   else
  13.     # The file does not exist, so return an non-zero exit status.
  14.     return 1
  15.   fi
  16. }
  17. # Call the function
  18. backup_file /etc/hosts
  19. # Make a decision based on the exit status of the function.
  20. # Note this is for demonstration purposes.  You could have
  21. # put this functionality inside of the backup_file function.
  22. if [ $? -eq "0" ]
  23. then
  24.   echo "Backup succeeded!"
  25. else
  26.   echo "Backup failed!"
  27.   # Abort the script and return a non-zero exit status.
  28.   exit 1
  29. fi
复制代码
执行:
  1. $ ./functions-10.sh
  2. Backing up /etc/hosts to /tmp/hosts.2023-08-26.11232
  3. Backup succeeded!
复制代码
来源:https://www.cnblogs.com/testing-/p/17659382.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具