在Shell编程的世界里,理论是基础,但实践才是掌握技能的关键。本章将带你踏入Shell脚本编写的实战领域,通过一系列基础但实用的示例,让你从零开始,逐步构建起编写Shell脚本的能力。我们将从最简单的脚本开始,逐步增加复杂度,涵盖变量使用、条件判断、循环控制、函数定义等核心概念,确保你在完成本章后,能够独立完成基本的Shell脚本编写任务。
1.1 脚本的创建与执行
Shell脚本本质上是一个包含一系列Shell命令的文本文件。创建脚本的第一步是使用文本编辑器(如vim、nano或gedit)创建一个新文件,并赋予其.sh
扩展名,比如hello.sh
。接下来,你需要编写脚本内容,并以#!/bin/bash
(或你系统默认的Shell路径)作为脚本的第一行,这被称为shebang,它告诉系统用哪个解释器来执行脚本。
#!/bin/bash
# hello.sh
echo "Hello, World!"
要执行该脚本,你需要给予其执行权限,这可以通过chmod
命令完成:
chmod +x hello.sh
然后,你可以通过以下方式之一来运行脚本:
./hello.sh
# 或者
bash hello.sh
1.2 脚本中的注释
在Shell脚本中,以#
开头的行被视为注释,这些行不会被执行。注释对于提高脚本的可读性和维护性至关重要。
2.1 变量的定义与使用
Shell脚本中的变量不需要事先声明其类型,你可以直接赋值给它们。变量名与等号之间不能有空格,访问变量时,需在变量名前加$
符号。
#!/bin/bash
# var.sh
name="John Doe"
echo "Hello, $name!"
2.2 脚本参数
Shell脚本可以接受来自命令行的参数,这些参数被存储在特殊变量$1
、$2
…中,$0
通常表示脚本名称本身。
#!/bin/bash
# greet.sh
echo "Hello, $1!"
运行./greet.sh Alice
将输出Hello, Alice!
。
3.1 if语句
Shell脚本中的if
语句用于根据条件执行不同的代码块。条件表达式通常放在[ ]
中,注意[
与条件表达式之间必须有空格。
#!/bin/bash
# if_example.sh
num=10
if [ $num -gt 5 ]; then
echo "$num is greater than 5"
else
echo "$num is not greater than 5"
fi
3.2 case语句
对于多分支的条件判断,case
语句更为适合。
#!/bin/bash
# case_example.sh
read -p "Enter a number (1-3): " num
case $num in
1) echo "You entered 1" ;;
2) echo "You entered 2" ;;
3) echo "You entered 3" ;;
*) echo "Invalid input" ;;
esac
4.1 for循环
for
循环用于遍历一系列的值。
#!/bin/bash
# for_example.sh
for i in 1 2 3 4 5
do
echo "Number $i"
done
或者,使用C语言风格的for循环:
#!/bin/bash
# for_c_style.sh
for (( i=1; i<=5; i++ ))
do
echo "Number $i"
done
4.2 while循环
while
循环会在条件为真时重复执行一段代码。
#!/bin/bash
# while_example.sh
count=1
while [ $count -le 5 ]
do
echo "Number $count"
((count++))
done
4.3 until循环
与while
相反,until
循环会在条件为假时重复执行代码块。
#!/bin/bash
# until_example.sh
count=1
until [ $count -gt 5 ]
do
echo "Number $count"
((count++))
done
在Shell脚本中,函数允许你将一段代码封装起来,以便在需要时重复调用。
#!/bin/bash
# function_example.sh
greet() {
echo "Hello, $1!"
}
greet "Alice"
greet "Bob"
函数定义时,不需要指定返回类型,函数默认以最后一个命令的退出状态作为返回值。
现在,让我们将所学知识综合运用到一个实际场景中——编写一个Shell脚本来管理用户账户。这个脚本将能够添加新用户、删除用户,并检查用户是否存在。
#!/bin/bash
# user_management.sh
# 函数:添加用户
add_user() {
if [ -z "$1" ]; then
echo "Usage: add_user <username>"
return 1
fi
if id "$1" &>/dev/null; then
echo "User $1 already exists."
return 1
else
useradd "$1"
if [ $? -eq 0 ]; then
echo "User $1 created successfully."
else
echo "Failed to create user $1."
fi
fi
}
# 函数:删除用户
delete_user() {
if [ -z "$1" ]; then
echo "Usage: delete_user <username>"
return 1
fi
if ! id "$1" &>/dev/null; then
echo "User $1 does not exist."
return 1
else
userdel -r "$1"
if [ $? -eq 0 ]; then
echo "User $1 deleted successfully."
else
echo "Failed to delete user $1."
fi
fi
}
# 函数:检查用户是否存在
check_user() {
if [ -z "$1" ]; then
echo "Usage: check_user <username>"
return 1
fi
if id "$1" &>/dev/null; then
echo "User $1 exists."
else
echo "User $1 does not exist."
fi
}
# 主逻辑
case "$1" in
add)
shift
add_user "$@"
;;
delete)
shift
delete_user "$@"
;;
check)
shift
check_user "$@"
;;
*)
echo "Usage: $0 {add|delete|check} <username>"
;;
esac
这个脚本定义了三个函数:add_user
、delete_user
和check_user
,分别用于添加、删除和检查用户。通过case
语句,脚本根据传入的第一个参数决定执行哪个函数。
至此,你已经掌握了编写基本Shell脚本所需的核心技能。通过不断的实践和探索,你将能够编写出更加复杂和功能丰富的Shell脚本,为日常的系统管理和自动化任务提供有力支持。