从零开始学习Shell脚本编程
掌握自动化任务的基础技能
Shell脚本是一种为Shell编写的脚本程序,它可以将一系列Shell命令组合在一个文件中,实现自动化执行。Shell脚本通常用于:
批量处理文件、定期备份、系统监控等重复性工作。
用户管理、软件安装、服务配置等系统管理任务。
构建流程、测试自动化、部署脚本等开发相关任务。
Shell脚本是Linux/Unix系统管理员和开发者的核心技能。掌握Shell脚本可以大大提高工作效率,实现复杂任务的自动化处理。
让我们从经典的"Hello World"开始,创建并运行你的第一个Shell脚本。
使用文本编辑器创建一个新文件,命名为 hello.sh。
# 使用nano创建文件
nano hello.sh
# 或使用vim
vim hello.sh
# 或使用其他文本编辑器
在文件中输入以下内容:
#!/bin/bash
# 这是我的第一个Shell脚本
echo "Hello, World!"
#!/bin/bash - 指定使用Bash解释器执行此脚本# 这是我的第一个Shell脚本 - 注释,以#开头,不会被执行echo "Hello, World!" - 输出文本到终端在运行脚本之前,需要先赋予它执行权限。
chmod +x hello.sh
chmod +x 命令为文件添加执行权限。在Linux/Unix系统中,只有具有执行权限的文件才能作为程序运行。
现在可以运行你的第一个Shell脚本了!
# 方法1:使用相对路径
./hello.sh
# 方法2:使用绝对路径
/home/username/hello.sh
# 方法3:使用bash命令(不需要执行权限)
bash hello.sh
如果一切正常,你将在终端看到输出:Hello, World!。你已经成功创建并运行了第一个Shell脚本!
掌握Shell脚本的基本语法元素,为编写更复杂的脚本打下基础。
在Shell脚本中,变量用于存储数据。变量名区分大小写,通常使用大写字母。
#!/bin/bash
# 定义变量(注意:等号两边不能有空格)
NAME="Alice"
AGE=25
# 使用变量(使用$符号引用变量)
echo "My name is $NAME"
echo "I am $AGE years old"
# 另一种引用变量的方式
echo "My name is ${NAME}"
# 只读变量(不能被修改)
readonly COUNTRY="China"
echo "I am from $COUNTRY"
# 删除变量(不能删除只读变量)
unset AGE
Shell脚本可以接收用户输入,使脚本更加交互式。
#!/bin/bash
# 使用read命令获取用户输入
echo "What is your name?"
read NAME
echo "How old are you?"
read AGE
echo "Hello $NAME, you are $AGE years old!"
# 在一行中获取多个输入
echo "Enter your full name:"
read FIRST_NAME LAST_NAME
echo "Your first name is $FIRST_NAME"
echo "Your last name is $LAST_NAME"
# 静默输入(用于密码)
echo "Enter your password:"
read -s PASSWORD
echo "Password accepted!"
# 带提示的输入
read -p "Enter your email: " EMAIL
echo "Your email is $EMAIL"
使用条件语句可以根据不同情况执行不同的代码。
#!/bin/bash
# 基本的if语句
echo "Enter a number:"
read NUM
if [ $NUM -gt 10 ]; then
echo "The number is greater than 10"
fi
# if-else语句
if [ $NUM -eq 10 ]; then
echo "The number is equal to 10"
else
echo "The number is not equal to 10"
fi
# if-elif-else语句
if [ $NUM -lt 10 ]; then
echo "The number is less than 10"
elif [ $NUM -eq 10 ]; then
echo "The number is equal to 10"
else
echo "The number is greater than 10"
fi
# 字符串比较
echo "Enter your name:"
read NAME
if [ "$NAME" = "Alice" ]; then
echo "Hello, Alice!"
elif [ "$NAME" = "Bob" ]; then
echo "Hello, Bob!"
else
echo "Hello, stranger!"
fi
循环允许你重复执行一段代码多次。
#!/bin/bash
# for循环
echo "Counting from 1 to 5:"
for i in 1 2 3 4 5; do
echo "Number: $i"
done
# for循环使用序列
echo "Counting from 1 to 5 using sequence:"
for i in {1..5}; do
echo "Number: $i"
done
# while循环
echo "Counting from 1 to 5 using while loop:"
COUNT=1
while [ $COUNT -le 5 ]; do
echo "Number: $COUNT"
COUNT=$((COUNT + 1))
done
# 无限循环(按Ctrl+C退出)
# while true; do
# echo "This will run forever"
# sleep 1
# done
# 循环处理文件
echo "Listing all .txt files:"
for FILE in *.txt; do
echo "Found file: $FILE"
done
通过实际例子加深对Shell脚本的理解和应用。
一个显示系统基本信息的实用脚本。
#!/bin/bash
# 系统信息脚本
echo "===== 系统信息 ====="
echo "主机名: $(hostname)"
echo "操作系统: $(uname -s)"
echo "内核版本: $(uname -r)"
echo "系统架构: $(uname -m)"
echo -e "\n===== 用户信息 ====="
echo "当前用户: $(whoami)"
echo "用户家目录: $HOME"
echo -e "\n===== 磁盘使用情况 ====="
df -h | grep -v tmpfs
echo -e "\n===== 内存使用情况 ====="
free -h
echo -e "\n===== 当前时间 ====="
date
一个简单的文件备份脚本,可以备份指定目录。
#!/bin/bash
# 文件备份脚本
# 设置备份目录和源目录
BACKUP_DIR="/home/$(whoami)/backups"
SOURCE_DIR="/home/$(whoami)/documents"
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# 生成备份文件名(包含日期时间)
BACKUP_FILE="backup_$(date +%Y%m%d_%H%M%S).tar.gz"
echo "开始备份..."
echo "源目录: $SOURCE_DIR"
echo "备份文件: $BACKUP_DIR/$BACKUP_FILE"
# 创建备份
tar -czf $BACKUP_DIR/$BACKUP_FILE $SOURCE_DIR
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "备份成功完成!"
echo "备份文件大小: $(du -h $BACKUP_DIR/$BACKUP_FILE | cut -f1)"
else
echo "备份失败!"
exit 1
fi
一个简单的用户管理脚本,可以添加、删除和列出用户。
#!/bin/bash
# 用户管理脚本
# 检查是否以root权限运行
if [ "$(id -u)" != "0" ]; then
echo "此脚本需要root权限。请使用sudo运行。"
exit 1
fi
# 显示菜单
echo "用户管理脚本"
echo "1. 添加用户"
echo "2. 删除用户"
echo "3. 列出用户"
echo "4. 退出"
# 获取用户选择
read -p "请选择操作 [1-4]: " CHOICE
case $CHOICE in
1)
# 添加用户
read -p "输入用户名: " USERNAME
read -s -p "输入密码: " PASSWORD
echo
useradd -m $USERNAME
echo "$USERNAME:$PASSWORD" | chpasswd
echo "用户 $USERNAME 已添加"
;;
2)
# 删除用户
read -p "输入要删除的用户名: " USERNAME
userdel -r $USERNAME
echo "用户 $USERNAME 已删除"
;;
3)
# 列出用户
echo "系统用户:"
cut -d: -f1 /etc/passwd | sort
;;
4)
# 退出
echo "再见!"
exit 0
;;
*)
echo "无效选择!"
exit 1
;;
esac
用户管理脚本需要root权限才能运行。在生产环境中使用此类脚本时要格外小心。