sh 脚本执行命令是 Linux 和 Unix 系统中自动化任务的核心手段之一,通过将一系列命令组合在一个文本文件中,用户可以高效地完成重复性操作、系统管理或应用程序部署等任务,本文将详细解析 sh 脚本的执行原理、常用命令、编写规范及实践技巧,帮助读者全面掌握这一实用技能。

sh 脚本的本质是一系列 shell 命令的集合,通过解释器逐行执行,在 Linux 系统中,默认的 shell 通常是 bash(Bourne Again Shell),但 sh 脚本通常遵循更基础的 Bourne Shell 语法,确保跨平台兼容性,执行 sh 脚本前,需确保文件具有可执行权限(通过 chmod +x filename.sh 设置),然后可通过三种主要方式运行:直接使用 bash filename.sh 或 sh filename.sh 调用解释器执行,或通过 ./filename.sh 以脚本首行指定的解释器(如 #!/bin/sh)执行。
编写 sh 脚本时,常用命令包括变量定义、条件判断、循环结构及函数封装等,变量定义无需声明类型,name="Linux",使用时需加 符号(如 $name),条件判断通过 if-then-else 结构实现,常与 test 命令或 [ ] 结合使用,if [ $age -gt 18 ]; then echo "成年"; fi,循环结构包括 for 和 while,前者适用于遍历列表(如 for i in 1 2 3; do echo $i; done),后者用于条件循环(如 while [ $count -lt 10 ]; do echo $count; count=$((count+1)); done),函数通过 function_name() { commands; } 定义,通过 function_name 调用,可传递参数($1、$2 分别代表第一个和第二个参数)。
在脚本执行过程中,输入输出重定向是常见操作。> 用于覆盖输出文件,>> 用于追加输出,< 表示从文件读取输入,管道符 可将前一个命令的输出作为后一个命令的输入,ls -l | grep ".txt" 列出所有 txt 文件,错误输出可通过 2> 单独重定向,command 2> error.log。&& 和 分别表示逻辑与和逻辑或,command1 && command2 仅当 command1 成功时执行 command2,而 command1 || command2 则在 command1 失败时执行 command2。
脚本的调试与优化同样重要,通过在脚本开头添加 set -x,可打印执行的每条命令及其参数,便于定位问题。set -e 可在命令返回非零状态码时立即退出脚本,避免错误累积,对于复杂逻辑,建议使用函数封装模块化代码,并通过注释说明功能,以下脚本实现了备份指定目录的功能:

#!/bin/sh
# 备份脚本:将源目录压缩并保存到目标路径
src_dir="/home/user/documents"
dest_dir="/backup"
timestamp=$(date +%Y%m%d)
backup_file="documents_$timestamp.tar.gz"
# 检查源目录是否存在
if [ ! -d "$src_dir" ]; then
echo "错误:源目录 $src_dir 不存在"
exit 1
fi
# 创建备份并验证
tar -czf "$dest_dir/$backup_file" -C "$src_dir" . || {
echo "备份失败"
exit 1
}
echo "备份成功:$dest_dir/$backup_file"
在实际应用中,sh 脚本常用于系统监控、日志分析和自动化部署,通过 cron 定时任务调度脚本,可实现每日自动清理临时文件或备份数据库,以下是一个简单的磁盘监控脚本,当磁盘使用率超过 90% 时发送警告:
#!/bin/sh
# 磁盘监控脚本
threshold=90
disk_usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$disk_usage" -gt "$threshold" ]; then
echo "警告:磁盘使用率已达 ${disk_usage}%" | mail -s "磁盘警告" admin@example.com
fi
需要注意的是,sh 脚本在处理字符串和数值时需谨慎,字符串比较建议使用 或 ,数值比较则使用 -eq(等于)、-ne(不等于)、-gt(大于)等选项,变量未定义时可能导致错误,可通过 ${variable:-default} 提供默认值,echo "姓名:${name:-未知}"。
相关问答 FAQs
-
问:sh 脚本和 bash 脚本有什么区别?
答:sh 脚本遵循 Bourne Shell 的基础语法,兼容性更广,适用于大多数 Unix 系统;bash 脚本是 Bourne Again Shell 的增强版本,支持更多功能(如数组、正则表达式扩展等),但可能在某些严格遵循 POSIX 标准的系统上不完全兼容,若需跨平台兼容性,建议使用 sh 脚本;若需利用高级功能,可选择 bash 脚本。
(图片来源网络,侵删) -
问:如何在 sh 脚本中处理命令行参数?
答:sh 脚本通过$1、$2等变量访问位置参数,$0表示脚本名称, 表示参数个数, 或 表示所有参数,以下脚本打印所有参数及其个数:#!/bin/sh echo "参数个数:$#" echo "所有参数:$*" for arg in "$@"; do echo "参数:$arg" done可通过
getopts内置命令解析带选项的参数(如-a、-b),实现更复杂的参数处理逻辑。
