shell
Shell 脚本是一种在 Unix/Linux 操作系统上编写的脚本语言,主要用于自动化执行命令、任务调度以及管理系统。以下是对 Shell 脚本的简要总结:
1. 基础概念
- Shell 是操作系统提供的一个命令行解释器,常见的 Shell 类型有 Bash(Bourne Again Shell)、Zsh、Sh 等。
- Shell 脚本 是一组命令的集合,通常保存在
.sh
文件中,可以通过终端执行。
2. 基本语法
- 注释:以
#
开头的行是注释。注释不会被执行,通常用于解释代码。# 这是一个注释
- 变量:可以定义变量,并使用
$
符号来引用变量。name="World" echo "Hello, $name!"
- 条件语句:
if [ "$age" -ge 18 ]; then echo "You are an adult." else echo "You are a minor." fi
- 循环:
for i in 1 2 3 4 5; do echo "Number: $i" done
3. 常用操作
- 定义和使用函数:
my_function() { echo "This is a function." } my_function # 调用函数
- 命令替换:通过反引号
`command`
或$(command)
可以将命令的输出作为变量。current_time=$(date) echo "Current time: $current_time"
- 文件操作:使用
cat
、touch
、cp
、mv
、rm
等命令进行文件的创建、复制、移动、删除等操作。touch newfile.txt # 创建文件 cat newfile.txt # 查看文件内容
4. 脚本执行
- 给脚本添加执行权限:
chmod +x script.sh
- 运行脚本:
./script.sh
5. 控制流程
- 条件判断:使用
if
、else
、elif
来实现条件分支。 - 循环结构:常见的循环有
for
、while
、until
。 - 退出状态码:每个命令执行完后都会返回一个状态码,
0
表示成功,非0
表示失败。可以通过$?
获取上一个命令的状态码。if [ $? -eq 0 ]; then echo "Success" else echo "Failed" fi
6. Shell 脚本中的参数
$0
:脚本名$1
到$9
:传递给脚本的参数$#
:传递给脚本的参数个数$@
:所有传递给脚本的参数$?
:上一个命令的退出状态
echo "Script name: $0"
echo "First argument: $1"
echo "Number of arguments: $#"
7. 调试脚本
- 使用
set -x
开启调试模式,脚本会显示每条命令的执行过程。 - 使用
set +x
关闭调试模式。set -x echo "This is a debug message" set +x
8. 处理用户输入
- 使用
read
从用户处获取输入:echo "Enter your name:" read name echo "Hello, $name!"
9. 标准输入/输出和重定向
>
:将输出重定向到文件,覆盖原文件内容。>>
:将输出重定向到文件,追加到文件末尾。<
:从文件中读取输入。2>
:将标准错误输出重定向到文件。echo "This is output" > output.txt # 输出到文件 cat < input.txt # 从文件读取
10. 常用工具
- awk:文本处理工具,用于对文件或输入流进行格式化处理。
- sed:流编辑器,用于查找和替换文本。
- grep:用于文本搜索的工具。
1. awk:文本处理工具
awk
是一个强大的文本处理工具,常用于从文件或输入流中提取、格式化和处理数据。它支持基于模式的搜索、列操作、计算等功能。
基本用法
awk 'pattern { action }' filename
- pattern:匹配条件
- action:对匹配的行执行的操作
常见操作
-
按列打印:
awk
默认将每行按空格或制表符分割为多个字段,使用$1
表示第一列,$2
表示第二列,依此类推。# 打印第二列 awk '{ print $2 }' filename
-
按条件筛选:可以通过模式匹配筛选特定行。
# 打印包含 "error" 的行 awk '/error/ { print }' filename
-
使用内置变量:
$0
:整行NR
:当前记录的行号NF
:当前行的字段数
# 打印行号和每行的第一列 awk '{ print NR, $1 }' filename
-
计算与格式化输出:
# 计算文件中两列数字的和 awk '{ sum = $1 + $2; print sum }' filename
-
指定分隔符:使用
-F
选项指定分隔符。# 使用逗号作为分隔符 awk -F "," '{ print $1, $2 }' filename
高级示例
# 打印第二列大于100的行
awk '$2 > 100 { print $0 }' filename
2. sed:流编辑器
sed
是一种非交互式的文本处理工具,擅长文本的搜索、替换、删除等操作。
基本用法
sed 'command' filename
常见操作
-
替换文本:使用
s/查找/替换/
格式替换文本。# 将文件中的 "foo" 替换为 "bar" sed 's/foo/bar/' filename
-
全局替换:使用
g
表示全局替换。# 将文件中所有的 "foo" 替换为 "bar" sed 's/foo/bar/g' filename
-
删除行:使用
d
命令删除匹配的行。# 删除包含 "error" 的行 sed '/error/d' filename
-
在指定位置插入文本:
# 在第二行后插入 "Hello, World!" sed '2a Hello, World!' filename
-
指定行进行替换:
# 仅替换第三行的 "foo" 为 "bar" sed '3s/foo/bar/' filename
高级示例
# 将所有匹配的 "foo" 替换为 "bar",并保存到原文件
sed -i 's/foo/bar/g' filename
3. grep:文本搜索工具
grep
用于在文本中查找符合条件的行,并打印出来,支持正则表达式和多种选项。
基本用法
grep 'pattern' filename
常见操作
-
匹配并打印行:
# 查找文件中包含 "error" 的行 grep 'error' filename
-
忽略大小写:使用
-i
忽略大小写。grep -i 'error' filename
-
显示行号:使用
-n
选项显示匹配行的行号。grep -n 'error' filename
-
递归搜索:使用
-r
在目录中递归搜索。grep -r 'error' /path/to/dir
-
统计匹配行数:使用
-c
选项统计匹配的行数。grep -c 'error' filename
-
反向匹配:使用
-v
选项输出不匹配的行。grep -v 'error' filename
正则表达式支持
.
:匹配任意单个字符*
:匹配零个或多个前面的字符^
:匹配行的开始$
:匹配行的结束
# 查找以 "start" 开头的行
grep '^start' filename
# 查找以 "end" 结尾的行
grep 'end$' filename
高级示例
# 查找多个关键字
grep -E 'error|warning' filename
# 查找所有 .log 文件中包含 "failed" 的行
grep 'failed' *.log
- awk:适合复杂的文本处理和数据操作,如按列打印、计算统计等。
- sed:擅长查找和替换文本、批量编辑文件等。
- grep:快速、简单的文本搜索工具,适合查找特定模式、筛选日志等。
这些工具各具特色,经常结合使用,可以大大提高文本处理的效率。
11. 案例示例
-
批量重命名文件:
for file in *.txt; do mv "$file" "${file%.txt}.bak" done
-
自动备份文件:
backup_dir="/backup" mkdir -p "$backup_dir" cp -r /home/user/documents "$backup_dir" echo "Backup complete!"
总结
Shell 脚本在自动化任务中极为有用,尤其是在系统管理、服务器维护、批量任务处理等场景。熟练掌握 Shell 脚本的语法和常用工具,可以显著提升开发和运维效率。