当前位置:  首页>> 技术小册>> Shell编程入门与实战

第十一章:实战一:编写基本Shell脚本

在Shell编程的世界里,理论是基础,但实践才是掌握技能的关键。本章将带你踏入Shell脚本编写的实战领域,通过一系列基础但实用的示例,让你从零开始,逐步构建起编写Shell脚本的能力。我们将从最简单的脚本开始,逐步增加复杂度,涵盖变量使用、条件判断、循环控制、函数定义等核心概念,确保你在完成本章后,能够独立完成基本的Shell脚本编写任务。

1. 脚本基础与Hello World

1.1 脚本的创建与执行

Shell脚本本质上是一个包含一系列Shell命令的文本文件。创建脚本的第一步是使用文本编辑器(如vim、nano或gedit)创建一个新文件,并赋予其.sh扩展名,比如hello.sh。接下来,你需要编写脚本内容,并以#!/bin/bash(或你系统默认的Shell路径)作为脚本的第一行,这被称为shebang,它告诉系统用哪个解释器来执行脚本。

  1. #!/bin/bash
  2. # hello.sh
  3. echo "Hello, World!"

要执行该脚本,你需要给予其执行权限,这可以通过chmod命令完成:

  1. chmod +x hello.sh

然后,你可以通过以下方式之一来运行脚本:

  1. ./hello.sh
  2. # 或者
  3. bash hello.sh

1.2 脚本中的注释

在Shell脚本中,以#开头的行被视为注释,这些行不会被执行。注释对于提高脚本的可读性和维护性至关重要。

2. 变量与参数

2.1 变量的定义与使用

Shell脚本中的变量不需要事先声明其类型,你可以直接赋值给它们。变量名与等号之间不能有空格,访问变量时,需在变量名前加$符号。

  1. #!/bin/bash
  2. # var.sh
  3. name="John Doe"
  4. echo "Hello, $name!"

2.2 脚本参数

Shell脚本可以接受来自命令行的参数,这些参数被存储在特殊变量$1$2…中,$0通常表示脚本名称本身。

  1. #!/bin/bash
  2. # greet.sh
  3. echo "Hello, $1!"

运行./greet.sh Alice将输出Hello, Alice!

3. 条件判断

3.1 if语句

Shell脚本中的if语句用于根据条件执行不同的代码块。条件表达式通常放在[ ]中,注意[与条件表达式之间必须有空格。

  1. #!/bin/bash
  2. # if_example.sh
  3. num=10
  4. if [ $num -gt 5 ]; then
  5. echo "$num is greater than 5"
  6. else
  7. echo "$num is not greater than 5"
  8. fi

3.2 case语句

对于多分支的条件判断,case语句更为适合。

  1. #!/bin/bash
  2. # case_example.sh
  3. read -p "Enter a number (1-3): " num
  4. case $num in
  5. 1) echo "You entered 1" ;;
  6. 2) echo "You entered 2" ;;
  7. 3) echo "You entered 3" ;;
  8. *) echo "Invalid input" ;;
  9. esac

4. 循环控制

4.1 for循环

for循环用于遍历一系列的值。

  1. #!/bin/bash
  2. # for_example.sh
  3. for i in 1 2 3 4 5
  4. do
  5. echo "Number $i"
  6. done

或者,使用C语言风格的for循环:

  1. #!/bin/bash
  2. # for_c_style.sh
  3. for (( i=1; i<=5; i++ ))
  4. do
  5. echo "Number $i"
  6. done

4.2 while循环

while循环会在条件为真时重复执行一段代码。

  1. #!/bin/bash
  2. # while_example.sh
  3. count=1
  4. while [ $count -le 5 ]
  5. do
  6. echo "Number $count"
  7. ((count++))
  8. done

4.3 until循环

while相反,until循环会在条件为假时重复执行代码块。

  1. #!/bin/bash
  2. # until_example.sh
  3. count=1
  4. until [ $count -gt 5 ]
  5. do
  6. echo "Number $count"
  7. ((count++))
  8. done

5. 函数

在Shell脚本中,函数允许你将一段代码封装起来,以便在需要时重复调用。

  1. #!/bin/bash
  2. # function_example.sh
  3. greet() {
  4. echo "Hello, $1!"
  5. }
  6. greet "Alice"
  7. greet "Bob"

函数定义时,不需要指定返回类型,函数默认以最后一个命令的退出状态作为返回值。

6. 实战演练:管理用户账户

现在,让我们将所学知识综合运用到一个实际场景中——编写一个Shell脚本来管理用户账户。这个脚本将能够添加新用户、删除用户,并检查用户是否存在。

  1. #!/bin/bash
  2. # user_management.sh
  3. # 函数:添加用户
  4. add_user() {
  5. if [ -z "$1" ]; then
  6. echo "Usage: add_user <username>"
  7. return 1
  8. fi
  9. if id "$1" &>/dev/null; then
  10. echo "User $1 already exists."
  11. return 1
  12. else
  13. useradd "$1"
  14. if [ $? -eq 0 ]; then
  15. echo "User $1 created successfully."
  16. else
  17. echo "Failed to create user $1."
  18. fi
  19. fi
  20. }
  21. # 函数:删除用户
  22. delete_user() {
  23. if [ -z "$1" ]; then
  24. echo "Usage: delete_user <username>"
  25. return 1
  26. fi
  27. if ! id "$1" &>/dev/null; then
  28. echo "User $1 does not exist."
  29. return 1
  30. else
  31. userdel -r "$1"
  32. if [ $? -eq 0 ]; then
  33. echo "User $1 deleted successfully."
  34. else
  35. echo "Failed to delete user $1."
  36. fi
  37. fi
  38. }
  39. # 函数:检查用户是否存在
  40. check_user() {
  41. if [ -z "$1" ]; then
  42. echo "Usage: check_user <username>"
  43. return 1
  44. fi
  45. if id "$1" &>/dev/null; then
  46. echo "User $1 exists."
  47. else
  48. echo "User $1 does not exist."
  49. fi
  50. }
  51. # 主逻辑
  52. case "$1" in
  53. add)
  54. shift
  55. add_user "$@"
  56. ;;
  57. delete)
  58. shift
  59. delete_user "$@"
  60. ;;
  61. check)
  62. shift
  63. check_user "$@"
  64. ;;
  65. *)
  66. echo "Usage: $0 {add|delete|check} <username>"
  67. ;;
  68. esac

这个脚本定义了三个函数:add_userdelete_usercheck_user,分别用于添加、删除和检查用户。通过case语句,脚本根据传入的第一个参数决定执行哪个函数。

至此,你已经掌握了编写基本Shell脚本所需的核心技能。通过不断的实践和探索,你将能够编写出更加复杂和功能丰富的Shell脚本,为日常的系统管理和自动化任务提供有力支持。


该分类下的相关小册推荐: