Shell编程从入门到精通-第二章 基础语法入门

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 环境变量的管理

环境变量是全局可见的变量,可在多个进程间传递。

查看环境变量

使用 envprintenv 命令查看所有环境变量:

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脚本,并为后续的流程控制、函数等高级语法学习打下基础。

更多内容,欢迎访问南徽玉的个人博客

相关推荐
REDcker1 天前
Media Source Extensions (MSE) 详解
前端·网络·chrome·浏览器·web·js
阿珊和她的猫1 天前
Chrome 的 SameSite 属性:原理与解决方案
前端·chrome
西门吹-禅2 天前
【iFlow 处理agents】
前端·chrome
西门吹-禅3 天前
【iFLow skills】
前端·chrome
xinhuanjieyi3 天前
python获取股票分红
chrome·python·elasticsearch
武帝为此4 天前
【Shell 函数库介绍】
前端·chrome
武帝为此4 天前
【Shell 变量作用域详解】
前端·chrome
yma165 天前
前端react模拟内存溢出——chrome devtool查找未释放内存
前端·chrome·react.js
忧郁的橙子.5 天前
04-从零搭建本地AI对话系统:Ollama + DeepSeek-R1:7B + Streamlit
前端·chrome