Shell脚本的基础语法是编写实用脚本的基石。本章将介绍Shell脚本中的核心语法元素,包括变量定义、引号使用、环境变量等内容,帮助你快速掌握Shell脚本的基本编写规则。
2.1 变量与常量
2.1.1 变量的定义与赋值
在Shell中,变量的定义不需要声明类型,直接通过赋值语句创建:
bash
# 定义变量(等号两侧不能有空格)
name="Shell"
age=25
# 错误示例(等号两侧有空格)
# name = "Shell" # 会被解析为命令name
注意:变量名只能包含字母、数字和下划线,且不能以数字开头。
2.1.2 变量的引用
引用变量时,使用 $ 符号前缀,常见的引用方式有两种:
bash
# 基本引用方式
echo "Hello, $name"
# 花括号引用(推荐,避免变量名与其他字符混淆)
echo "Hello, ${name}Script"
2.1.3 常量的实现
Shell中没有真正的常量关键字,但可以通过 readonly 命令将变量设为只读(即常量):
bash
# 定义只读变量(常量)
readonly PI=3.14159
# 尝试修改只读变量(会报错)
PI=3.14 # 报错:PI: readonly variable
2.2 系统预定义变量与环境变量
2.2.1 常用系统预定义变量
Shell内置了一系列预定义变量,用于获取系统信息或脚本执行状态:
| 变量 | 描述 | 示例 |
|---|---|---|
$0 |
脚本文件名 | ./test.sh |
$1-$9 |
脚本的第1-9个参数 | 执行 ./test.sh a b 时,$1=a,$2=b |
$# |
脚本参数的个数 | 执行 ./test.sh a b 时,值为 2 |
$* |
所有参数的集合(作为单个字符串) | a b |
$@ |
所有参数的集合(作为独立字符串) | a b |
$? |
上一条命令的退出状态码(0表示成功) | 执行 ls 后,值为 0 |
$$ |
当前脚本的进程ID | 随机数字 |
$HOME |
当前用户的主目录 | /home/username |
$PATH |
命令搜索路径 | /usr/local/bin:/usr/bin |
$PWD |
当前工作目录 | /home/username/Documents |
示例:打印脚本参数与状态
bash
#!/bin/bash
echo "脚本名: $0"
echo "参数个数: $#"
echo "所有参数: $*"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "上一条命令状态: $?"
echo "当前进程ID: $$"
echo "用户主目录: $HOME"
echo "当前目录: $PWD"
echo "命令搜索路径: $PATH"
2.2.2 环境变量的管理
环境变量是全局可见的变量,可在多个进程间传递。
查看环境变量
使用 env 或 printenv 命令查看所有环境变量:
bash
# 查看所有环境变量
env
# 查看指定环境变量
printenv HOME
# 或
echo $HOME
设置环境变量
通过 export 命令设置环境变量:
bash
# 临时设置环境变量(仅当前会话有效)
export MY_VAR="Hello"
echo $MY_VAR # 输出:Hello
# 永久设置环境变量(需要修改配置文件)
# Bash用户:编辑 ~/.bashrc 或 ~/.bash_profile
# Zsh用户:编辑 ~/.zshrc
# 示例(在配置文件中添加)
export PATH=$PATH:/usr/local/mybin
export MY_VAR="Hello"
# 使配置生效
source ~/.bashrc # 或 source ~/.zshrc
2.3 引号的使用
Shell中的引号有三种:单引号、双引号、反引号(或 ````` 符号,在bash中也可使用 $()),它们的作用不同。
2.3.1 单引号 (')
单引号中的内容会被原样输出,不解析变量,也不执行命令:
bash
name="Shell"
echo 'Hello, $name' # 输出:Hello, $name
echo 'Current dir: $(pwd)' # 输出:Current dir: $(pwd)
2.3.2 双引号 (")
双引号中的内容会解析变量 和转义字符,但不直接执行命令:
bash
name="Shell"
echo "Hello, $name" # 输出:Hello, Shell
echo "Line1\nLine2" # 输出两行
2.3.3 反引号 (`````) 或 $()
反引号(或 $())用于执行命令并返回结果 ,$() 是现代推荐用法(避免嵌套时的歧义):
bash
# 反引号写法
date_str=`date`
echo "Current time: $date_str"
# $() 写法(推荐)
date_str=$(date)
echo "Current time: $date_str"
# 嵌套示例($()更清晰)
# 错误示例(反引号嵌套需要转义)
# files=$(ls `pwd`)
# 正确示例($() 直接嵌套)
files=$(ls $(pwd))
echo "Files: $files"
2.4 注释的使用
注释是提高代码可读性的关键,Shell脚本中的注释以 # 开头:
bash
#!/bin/bash
# 这是一个单行注释
# 功能:打印Hello World
echo "Hello World" # 行尾注释
# 多行注释的实现(利用here document)
: <<'EOF'
这是多行注释
第一行
第二行
EOF
echo "脚本继续执行"
注意 :: 是一个空命令(不做任何操作),<<'EOF' 表示将后续内容作为输入传递给 : 命令,但因为 : 不处理输入,所以实现了多行注释的效果。
2.5 综合示例
下面是一个包含本章知识点的综合示例脚本:
bash
#!/bin/bash
# 定义变量
project="Shell Programming"
version=1.0
readonly AUTHOR="Your Name"
# 打印变量
echo "Project: $project"
echo "Version: ${version}"
echo "Author: $AUTHOR"
# 使用系统预定义变量
echo "\nSystem Info:"
echo "Script name: $0"
echo "Current directory: $PWD"
echo "User home: $HOME"
# 使用反引号执行命令
echo "\nRuntime Info:"
echo "Current date: $(date)"
echo "Files in current dir: $(ls -l | wc -l)"
# 演示引号的区别
echo "\nQuotes Demo:"
echo "Single quotes: 'Current dir: $PWD'"
echo "Double quotes: \"Current dir: $PWD\""
echo "Command substitution: $(echo "Hello from command")"
# 尝试修改只读变量
# AUTHOR="New Author" # 会报错
2.6 本章小结
本章介绍了Shell脚本的基础语法元素,包括:
- 变量与常量 :通过赋值定义变量,使用
readonly实现常量 - 引用变量 :使用
$var或${var}引用变量(推荐后者) - 系统预定义变量 :如
$0、$1-$9、$#、$?等 - 环境变量 :通过
export设置,在配置文件中永久保存 - 引号的使用 :
- 单引号:原样输出,不解析变量
- 双引号:解析变量和转义字符
- 反引号/
$():执行命令并返回结果
- 注释 :使用
#单行注释,利用: <<'EOF'实现多行注释
掌握这些基础语法后,你将能够编写简单的Shell脚本,并为后续的流程控制、函数等高级语法学习打下基础。
更多内容,欢迎访问南徽玉的个人博客