0%

Shell 语法速览

基本语法

以下是 Shell 脚本 的基本语法整理,涵盖了常用的变量定义、条件判断、循环结构、函数、I/O 操作以及一些实用的命令和脚本示例。


一、Shell 脚本的基本结构

1.1 脚本头部

Shell 脚本的第一行通常是 shebang,指定脚本的解释器。

1
2
#!/bin/bash
# 或者指定其他 Shell 解释器,例如 /bin/sh 或 /bin/zsh

1.2 注释

  • 单行注释用 # 开头。
  • 没有多行注释,通常使用 : '...'<<COMMENT ... COMMENT 模拟。
1
2
3
4
5
6
7
8
9
10
11
# 这是单行注释

: '
这是
多行
注释
'

<<COMMENT
这也是多行注释
COMMENT

二、变量

2.1 变量定义

  • 直接赋值,无需类型声明。
  • 等号两边不能有空格。
1
2
name="Alice"
age=25

2.2 变量引用

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

1
echo "Name: $name, Age: ${age}"

2.3 变量类型

  • 局部变量: 仅在当前脚本中有效。
  • 环境变量: 使用 export 定义,供子进程继承。
1
export PATH=$PATH:/my/custom/path

2.4 只读变量

使用 readonly

1
readonly PI=3.14

三、运算

3.1 算术运算

使用 expr$(( ))

1
2
3
4
5
6
7
8
9
10
x=10
y=5

# 使用 expr
result=`expr $x + $y`
echo $result

# 使用 $(( ))
result=$((x + y))
echo $result

3.2 比较运算

运算符 描述
-eq 等于
-ne 不等于
-lt 小于
-le 小于或等于
-gt 大于
-ge 大于或等于
1
2
3
if [ $x -gt $y ]; then
echo "$x is greater than $y"
fi

3.3 字符串比较

运算符 描述
= 等于
!= 不等于
-z 字符串为空
-n 字符串非空
1
2
3
if [ "$name" = "Alice" ]; then
echo "Hello, Alice"
fi

四、条件判断

4.1 if-else 语句

1
2
3
4
5
6
7
if [ 条件 ]; then
# 条件为真时执行
elif [ 条件 ]; then
# 其他条件为真时执行
else
# 条件都不成立时执行
fi

示例

1
2
3
4
5
if [ $age -ge 18 ]; then
echo "Adult"
else
echo "Minor"
fi

4.2 文件测试

运算符 描述
-e 文件存在
-f 是普通文件
-d 是目录
-r 可读
-w 可写
-x 可执行
1
2
3
if [ -f "/path/to/file" ]; then
echo "File exists"
fi

五、循环结构

5.1 for 循环

1
2
3
for var in list; do
# 循环体
done

示例

1
2
3
for i in 1 2 3 4 5; do
echo "Number: $i"
done

5.2 while 循环

1
2
3
while [ 条件 ]; do
# 循环体
done

示例

1
2
3
4
5
counter=0
while [ $counter -lt 5 ]; do
echo "Counter: $counter"
counter=$((counter + 1))
done

5.3 until 循环

1
2
3
until [ 条件 ]; do
# 循环体
done

示例

1
2
3
4
5
counter=0
until [ $counter -ge 5 ]; do
echo "Counter: $counter"
counter=$((counter + 1))
done

六、函数

6.1 函数定义

1
2
3
function_name() {
# 函数体
}

6.2 参数与返回值

  • $1$2 等为函数参数。
  • 使用 return 返回状态码。
1
2
3
4
5
6
greet() {
echo "Hello, $1!"
return 0
}

greet "Alice"

七、I/O 操作

7.1 输出

使用 echoprintf

1
2
echo "Hello, World!"
printf "Name: %s, Age: %d\n" "Alice" 25

7.2 输入

使用 read

1
2
3
echo "Enter your name:"
read name
echo "Hello, $name!"

八、脚本调试

8.1 调试模式

使用 -x 查看执行过程。

1
bash -x script.sh

8.2 显示错误

使用 -e 让脚本在错误发生时退出。

1
set -e

九、常用命令

命令 描述
ls 列出目录内容
cd 切换目录
pwd 显示当前目录
cp 复制文件或目录
mv 移动或重命名文件
rm 删除文件或目录
chmod 修改文件权限
grep 搜索文件中的文本
awk 处理文本并生成格式化输出
sed 文本替换

十、脚本示例

10.1 备份文件

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

backup_dir="/backup"
src_dir="/data"

if [ ! -d $backup_dir ]; then
mkdir -p $backup_dir
fi

cp -r $src_dir/* $backup_dir
echo "Backup completed!"

10.2 批量重命名文件

1
2
3
4
5
6
7
#!/bin/bash

for file in *.txt; do
mv "$file" "${file%.txt}.bak"
done

echo "Files renamed!"

总结

  1. 基本语法:掌握变量、条件判断、循环、函数等基本语法。
  2. 文件与I/O操作:熟悉文件测试、输入输出以及文件处理命令。
  3. 调试与优化:使用调试模式和错误处理工具提高脚本质量。
  4. 实用命令:灵活使用 grepawksed 等命令处理数据。

通过熟练掌握这些基础和技巧,你将能快速编写高效的 Shell 脚本来处理自动化任务。

高级特性

以下是 Shell 脚本的 高级特性 整理,包括高级变量操作、进阶函数特性、数组与关联数组、流程控制、并发与异步处理、文件处理、调试和性能优化等内容。


一、变量与字符串高级操作

1.1 变量替换与默认值

语法 描述 示例
${var:-default} 如果变量未定义或为空,则返回 default echo ${name:-"Default Name"}
${var:=default} 如果变量未定义或为空,则赋值 default echo ${name:="Default Name"}
${var:+replacement} 如果变量已定义且非空,则返回 replacement echo ${name:+Defined}
${var:?error message} 如果变量未定义或为空,则打印错误信息并退出 echo ${name:?"Error: name required"}

1.2 字符串操作

操作 描述 示例
`$