跳转到内容

Shell脚本基础语法

课程介绍

Shell脚本是Linux系统自动化运维的核心工具,通过编写脚本可以将复杂的命令序列封装成可重复执行的程序。本课程将带你从零开始学习Shell脚本的基础语法,包括脚本的创建、执行、注释、变量等核心概念,为后续学习Shell编程打下坚实基础。

1. Shell脚本概述

1.1 什么是Shell脚本

  • 定义:Shell脚本是一种用Shell命令编写的脚本程序,用于自动化执行系统管理任务
  • 特点
    • 解释型语言,无需编译
    • 直接调用系统命令
    • 支持变量、条件判断、循环等编程特性
    • 跨平台兼容性好

1.2 常见的Shell类型

Shell类型特点应用场景
bash最常用,兼容性好Linux系统默认Shell
sh最基础的标准ShellUnix系统通用Shell
zsh功能强大,配置灵活macOS和部分Linux发行版
csh/tcsh类C语言语法历史遗留系统

1.3 查看当前Shell

bash
# 查看当前使用的Shell
echo $SHELL

# 查看系统可用的Shell列表
cat /etc/shells

2. 第一个Shell脚本

2.1 创建脚本文件

使用文本编辑器创建脚本文件,推荐使用VIM或VS Code。

示例:创建第一个脚本

bash
# 创建脚本文件
vim hello.sh

脚本内容

bash
#!/bin/bash
# 这是一个简单的Shell脚本示例

echo "Hello, World!"
echo "Welcome to Shell scripting!"

2.2 脚本结构解析

bash
#!/bin/bash          # Shebang行,指定解释器路径
# 这是注释          # 以#开头的行为注释,不会被执行

echo "Hello, World!"  # 执行命令,输出文本

Shebang行说明

  • 必须位于脚本的第一行
  • #!开头,后面跟随解释器的绝对路径
  • 告诉系统使用哪个程序来执行该脚本

2.3 执行脚本

Shell脚本有多种执行方式,每种方式的特点不同。

方式1:使用bash命令执行

bash
# 直接使用bash命令执行脚本
bash hello.sh

# 或使用sh命令执行
sh hello.sh

方式2:添加执行权限后执行

bash
# 添加执行权限
chmod +x hello.sh

# 执行脚本
./hello.sh

方式3:使用source或.命令执行

bash
# 使用source命令执行(在当前Shell中执行)
source hello.sh

# 或使用.命令执行(与source等价)
. hello.sh

三种执行方式的区别

执行方式子Shell变量传递权限要求
bash script.sh不需要
./script.sh需要+x权限
source script.sh不需要

3. Shell注释

3.1 单行注释

使用#符号添加单行注释。

bash
#!/bin/bash
# 这是一个单行注释

echo "Hello"  # 这也是单行注释

3.2 多行注释

Shell没有专门的多行注释语法,但可以使用以下技巧:

方法1:连续使用#

bash
#!/bin/bash
# 这是多行注释的第一行
# 这是多行注释的第二行
# 这是多行注释的第三行

echo "Hello"

方法2:使用:命令

bash
#!/bin/bash
: '
这是多行注释的第一行
这是多行注释的第二行
这是多行注释的第三行
'

echo "Hello"

方法3:使用Here Document

bash
#!/bin/bash
<<COMMENT
这是多行注释的第一行
这是多行注释的第二行
这是多行注释的第三行
COMMENT

echo "Hello"

4. Shell变量

4.1 变量定义

Shell变量定义不需要指定类型,直接赋值即可。

基本语法

bash
变量名=值

注意事项

  • 变量名和等号之间不能有空格
  • 变量名只能包含字母、数字和下划线
  • 变量名不能以数字开头
  • 变量名区分大小写

示例

bash
#!/bin/bash
# 定义变量
name="张三"
age=25
city="北京"

# 使用变量
echo "姓名:$name"
echo "年龄:$age"
echo "城市:$city"

4.2 变量引用

使用$变量名${变量名}引用变量。

示例

bash
#!/bin/bash
filename="test.txt"

# 使用$变量名
echo $filename

# 使用${变量名}(推荐,更清晰)
echo ${filename}

# 区分变量名和后续字符
echo "${filename}.bak"

4.3 变量类型

字符串变量

bash
#!/bin/bash
# 单引号字符串(不解析变量)
str1='Hello $name'  # 输出:Hello $name

# 双引号字符串(解析变量)
name="张三"
str2="Hello $name"  # 输出:Hello 张三

# 字符串拼接
str3="Hello, ""World!"  # 输出:Hello, World!
str4="Hello, "$name      # 输出:Hello, 张三

数字变量

bash
#!/bin/bash
# 整数
num1=100
num2=200

# 浮点数(需要使用bc命令)
num3=3.14

只读变量

bash
#!/bin/bash
# 定义只读变量
readonly PI=3.14159

# 尝试修改只读变量(会报错)
PI=3.14  # 错误:readonly variable

删除变量

bash
#!/bin/bash
# 定义变量
name="张三"
echo $name  # 输出:张三

# 删除变量
unset name
echo $name  # 输出:(空)

4.4 特殊变量

Shell提供了一些特殊变量,用于获取脚本和命令的参数。

变量说明
$0脚本名称
$1~$9第1~9个参数
$#参数个数
$@所有参数(每个参数独立引用)
$*所有参数(作为整体引用)
$?上一个命令的退出状态
$$当前Shell进程ID
$!后台运行的最后一个进程ID

示例

bash
#!/bin/bash
# 获取脚本名称
echo "脚本名称:$0"

# 获取参数
echo "第一个参数:$1"
echo "第二个参数:$2"

# 获取参数个数
echo "参数个数:$#"

# 获取所有参数
echo "所有参数:$@"
echo "所有参数:$*"

# 获取上一个命令的退出状态
ls /root
echo "上一个命令的退出状态:$?"

# 获取当前进程ID
echo "当前进程ID:$$"

5. 输入输出

5.1 标准输出

使用echo命令输出文本。

基本用法

bash
#!/bin/bash
# 输出文本
echo "Hello, World!"

# 输出变量
name="张三"
echo "姓名:$name"

# 输出空行
echo ""

# 输出转义字符
echo -e "第一行\n第二行\n第三行"

echo选项

选项说明
-n不输出换行符
-e启用转义字符解释
-E禁用转义字符解释(默认)

常用转义字符

转义字符说明
\n换行
\t制表符
\\反斜杠
\"双引号
\$美元符号

5.2 标准输入

使用read命令从标准输入读取数据。

基本用法

bash
#!/bin/bash
# 读取用户输入
echo "请输入你的姓名:"
read name
echo "你好,$name!"

# 一行读取多个变量
echo "请输入姓名和年龄(用空格分隔):"
read name age
echo "姓名:$name,年龄:$age"

# 使用-p参数直接提示
read -p "请输入你的城市:" city
echo "城市:$city"

# 使用-t参数设置超时(秒)
read -t 5 -p "请在5秒内输入你的职业:" job
echo "职业:$job"

# 使用-s参数隐藏输入(适用于密码)
read -s -p "请输入密码:" password
echo ""
echo "密码已输入"

read选项

选项说明
-p直接显示提示信息
-t设置超时时间(秒)
-s隐藏输入内容
-n限制输入字符数

6. 完整示例

示例1:用户信息收集脚本

bash
#!/bin/bash
# 用户信息收集脚本

echo "===== 用户信息收集 ====="

# 读取用户信息
read -p "请输入你的姓名:" name
read -p "请输入你的年龄:" age
read -p "请输入你的城市:" city
read -p "请输入你的职业:" job

# 输出用户信息
echo ""
echo "===== 用户信息 ====="
echo "姓名:$name"
echo "年龄:$age"
echo "城市:$city"
echo "职业:$job"
echo "=================="

示例2:系统信息显示脚本

bash
#!/bin/bash
# 系统信息显示脚本

echo "===== 系统信息 ====="
echo "主机名:$(hostname)"
echo "操作系统:$(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "内核版本:$(uname -r)"
echo "CPU架构:$(uname -m)"
echo "当前用户:$(whoami)"
echo "当前目录:$(pwd)"
echo "=================="

示例3:备份脚本基础框架

bash
#!/bin/bash
# 备份脚本基础框架

# 定义变量
SOURCE_DIR="/home/user/data"
BACKUP_DIR="/home/user/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_${DATE}.tar.gz"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
echo "开始备份..."
tar -czf ${BACKUP_DIR}/${BACKUP_FILE} ${SOURCE_DIR}

# 检查备份是否成功
if [ $? -eq 0 ]; then
    echo "备份成功!"
    echo "备份文件:${BACKUP_DIR}/${BACKUP_FILE}"
else
    echo "备份失败!"
    exit 1
fi

7. 脚本调试技巧

7.1 语法检查

使用bash -n检查脚本语法错误。

bash
# 检查脚本语法
bash -n script.sh

7.2 调试模式

使用bash -x执行脚本,显示每条命令及其执行结果。

bash
# 调试模式执行脚本
bash -x script.sh

7.3 在脚本中启用调试

在脚本中添加set -x启用调试,set +x关闭调试。

bash
#!/bin/bash
set -x  # 启用调试

echo "Hello"
name="张三"
echo "姓名:$name"

set +x  # 关闭调试
echo "调试已关闭"

课程总结

这节课我们学习了Shell脚本的基础语法。

核心内容:

  • Shell脚本概述和常见类型
  • 脚本的创建和执行方式
  • 注释的使用方法
  • 变量的定义和引用
  • 输入输出操作
  • 特殊变量的使用

重要命令:

  • echo:输出文本
  • read:读取输入
  • bash -n:语法检查
  • bash -x:调试执行

Shell脚本是Linux自动化运维的基础,掌握这些基础知识后,我们将在后续课程中学习条件判断、循环、函数等高级特性。

课后练习

练习1(基础)

创建一个Shell脚本,要求:

  1. 输出"Hello, Shell Scripting!"
  2. 定义一个变量name,值为你的名字
  3. 输出"欢迎,$name!"

练习2(进阶)

创建一个交互式脚本,要求:

  1. 提示用户输入姓名、年龄、城市
  2. 输出用户信息,格式如下:
    ===== 用户信息 =====
    姓名:xxx
    年龄:xxx
    城市:xxx
    ==================

练习3(拓展)

创建一个脚本,要求:

  1. 接收脚本参数(至少2个参数)
  2. 输出脚本名称
  3. 输出参数个数
  4. 输出所有参数
  5. 输出当前进程ID

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径