目录
一 Shell脚本概述
-
Shell:是用户与操作系统内核(如Linux、Unix)交互的命令行接口,常见的Shell包括
Bash
(Bourne-Again Shell)、sh
、zsh
等。 -
Shell脚本:是一个包含一系列Shell命令的文本文件,通过Shell解释器执行。它类似于Windows的批处理文件(
.bat
),用于自动化重复性任务或组合复杂操作。
1 shell的作用
-
自动化任务:例如批量重命名文件、定时备份数据。
-
系统管理:快速完成软件安装、日志分析、监控系统状态。
-
简化复杂操作:将多步命令组合成一个脚本,避免手动输入错误。
通过/etc/shells文件了解当前系统支持的shell脚本种类。
2 编写第一个shell脚本
(1) Shell脚本的基本结构
#!/bin/bash # 指定解释器(这里是Bash)
# 这是一个注释 # 注释以#开头
echo "Hello World!" # 打印输出
-
第一行
#!/bin/bash
(Shebang):告诉系统用哪个解释器执行脚本。 -
注释:用
#
开头,提高脚本可读性。 -
命令:逐行编写需要执行的命令。
(2)运行Shell脚本
运行脚本的命令:
1:打开一个子shell,执行脚本的指令,然后退出该子脚本
bash aaa.sh
sh aaa.sh
./aaa.sh(需要执行权限)
2:直接用当前shell执行
source aaa.sh
. aaa.sh
3 重定向与管道操作
(1)重定向操作
重定向用于控制命令的输入/输出方向,可以将数据从文件导入命令,或将命令的输出保存到文件。
交互设备文件 | 说明 |
标准输入 | 键盘,0,命令将从标准输入文件中读取在执行过程中需要的输入数据 |
标准输出 | 显示器,1,命令将执行后的输出结果发送到标准输出文件 |
标准错误 | 显示器,2,命令将执行期间的各种错误信息发送到标准错误文件 |
1)重定向输出
>
:覆盖输出到文件(若文件不存在则创建)
>>
:追加输出到文件
2)重定向输入
<
:将文件内容作为命令的输入
3)错误重定向
2>
:将错误信息覆盖写入文件
ls /nonexistent 2> error.log # 错误信息保存到error.log
2>>
:追加错误信息到文件
ls /invalid 2>> error.log # 追加错误日志
&>
或 2>&1
:将标准输出和错误一起重定向
command &> all_output.log # 输出和错误都保存到文件
command > output.log 2>&1 # 等效写法
(2)管道操作
管道(|
)用于将前一个命令的输出作为后一个命令的输入,实现多命令协作。
管道符组合使用命令的总结:
管道符(|
)可以将多个命令串联起来,实现数据的筛选、处理和格式化。以下是 df
(磁盘信息)、grep
(文本过滤)、awk
(文本处理)的经典组合用法。
常见场景:
过滤数据
cat file.txt | grep "error" # 筛选包含"error"的行
统计处理
ps aux | grep nginx | wc -l # 统计nginx进程数量
排序与去重
sort data.txt | uniq # 排序后去重
组合重定向
ls -l | tee dir_list.txt # 输出到屏幕的同时保存到文件
对比总结:
操作 | 符号 | 作用 | 示例 | |
---|---|---|---|---|
输出覆盖 | > | 将命令输出覆盖写入文件 | echo "text" > file | |
输出追加 | >> | 将命令输出追加到文件末尾 | echo "text" >> file | |
输入重定向 | < | 从文件读取输入(代替键盘) | wc -l < file | |
错误重定向 | 2> | 将错误信息写入文件 | ls /tmp 2> error.log | |
管道 | ` | ` | 将前一个命令的输出作为下一个的输入 |
二 Shell变量的作用,类型
1 自定义变量
(1)定义新的变量
-
语法:
变量名=变量值
(等号两边不能有空格) -
命令规则:
变量名只能包含字母、数字和下划线
变量名必须以字母或下划线开头
变量名是区分大小写的
变量名不能使用Shell的保留关键字
变量名应尽可能具有描述性
避免使用空格或特殊字符
(2)查看和引用变量的值
-
查看变量:
echo $name # 输出变量值 echo ${name} # 推荐写法(避免歧义)
-
查看所有变量:
set # 显示当前Shell所有变量(包括环境变量)
(3)变量赋值的特殊操作
1)双引号(“)
特点:允许解析变量和转义字符。
greeting="Hello, $name!" # 输出:Hello, Alice!
2)单引号(‘)
特点:禁止解析变量和转义字符(原样输出)。
greeting='Hello, $name!' # 输出:Hello, $name!
3)反撇号(`)
作用:将命令的输出赋值给变量。
current_time=`date` # 传统写法
current_time=$(date) # 现代推荐写法(支持嵌套)
注意:` 反撇号后面跟命令= $() 。它们之间的区别:$()支持指令的嵌套,`不支持
4)read命令
作用:从用户输入或文件中读取值并赋值给变量。
read -p "Enter your name: " username # 交互式输入
echo "Welcome, $username!"
(4)设置变量的作用范围
-
局部变量(默认):仅在当前Shell进程中有效。
local_var="Local"
-
环境变量(全局):通过
export
传递给子进程。export GLOBAL_VAR="Global"
-
查看环境变量:
env # 显示所有环境变量
echo $PATH # 查看特定环境变量(如PATH)
(5)数值变量的运算
Shell默认将变量视为字符串,需用以下方式执行数学运算:
方法1:$(( ))
或 let
a=5 b=3
echo $((a + b)) # 输出:8(加法)
let "c = a * b" # 使用let计算乘法
echo $c # 输出:15
方法2:expr
命令
result=$(expr $a + $b) # 注意操作符两侧需有空格
echo $result # 输出:8
方法3:bc
命令(浮点数运算)
echo "scale=2; 10 / 3" | bc # 输出:3.33(保留2位小数)
关键总结表
操作 | 语法示例 | 说明 |
---|---|---|
定义变量 | var="value" | 等号两侧无空格 |
引用变量 | echo ${var} | 避免歧义(如${var}_suffix ) |
双引号 | "$var" | 解析变量和转义字符 |
单引号 | '$var' | 原样输出 |
命令替换 | `cmd` 或 $(cmd) | 将命令输出赋给变量 |
环境变量 | export VAR="value" | 对子进程生效 |
整数运算 | $((a + b)) | 加减乘除取模等 |
浮点数运算 | echo "5.0 / 2" | bc | 需安装bc 工具 |
2 特殊的shell变量
(1)环境变量
1)作用:由系统或用户定义,影响Shell和子进程的行为。
2)常见环境变量
变量名 | 含义 | 示例 |
---|---|---|
PATH | 可执行程序搜索路径 | echo $PATH |
HOME | 当前用户的家目录 | cd $HOME |
USER | 当前用户名 | echo $USER |
SHELL | 当前Shell路径 | echo $SHELL |
PWD | 当前工作目录 | echo $PWD |
LANG | 系统语言环境 | export LANG="en_US.UTF-8" |
(2)只读变量
1)作用:变量一旦定义,不能被修改或删除。
2)命令:
readonly PI=3.14 # 定义只读变量
PI=3.14159 # 报错:readonly variable
unset PI # 报错:cannot unsetreadonly # 列出所有只读变量
(3)位置变量
1)作用:用于获取脚本或函数的参数。
2)常见位置变量参数
变量名 | 含义 | 示例(脚本调用:./script.sh arg1 arg2 ) |
---|---|---|
$0 | 脚本名称 | echo $0 → ./script.sh |
$1 -$9 | 第1到第9个参数 | echo $1 → arg1 |
${10} ... | 第10个及以后的参数 | echo ${10} |
$# | 参数个数 | echo $# → 2 |
$* | 所有参数(合并为一个字符串) | echo $* → arg1 arg2 |
$@ | 所有参数(保留独立分隔) | echo $@ → arg1 arg2 (与$* 在循环中有区别) |
(4)预定义变量
1)作用:存储Shell运行时的状态信息。
2)常见预定义变量参数
变量名 | 含义 | 示例 |
---|---|---|
$? | 上一条命令的退出状态(0=成功) | ls /tmp; echo $? → 0 |
$$ | 当前Shell进程的PID | echo $$ |
$! | 最后一个后台进程的PID | sleep 10 &; echo $! |
$_ | 上一个命令的最后一个参数 | ls /tmp; echo $_ → /tmp |