第一章 Shell脚本基础 v1.0
第一部分 函数
一、函数定义
bash
function function_name {
# 函数体
command1
command2
...
}
bash
function_name() {
# 函数体
command1
command2
...
}
二、函数调用
定义好函数后,可以在脚本的其他地方直接通过函数名调用
bash
function_name [参数]
三、函数参数
函数可以接受参数,这些参数在函数内部通过位置变量 $1
, $2
, ...
, $n
来访问,其中 $1
表示第一个参数,$2
表示第二个参数,依此类推。在Shell脚本中,特殊变量 $0
表示脚本本身的名称,而不是函数名。
bash
# 带参数的函数示例
hello() {
echo "Hello, $1! Welcome to $2."
}
# 调用函数并传递参数
hello "Alice" "Shell Programming"
四、函数返回值
Shell中返回值一般指函数的退出状态码,用于表示函数执行的成功(0)或失败(非0)。
默认情况下,函数的退出状态码是最后一条命令的退出状态码。可以使用 return 语句显式设置退出状态码。
bash
function check_number() {
if [ $1 -lt 0 ]; then
echo "Error: Number is negative"
return 1 # 函数返回状态码1
fi
echo "Number is positive"
return 0 # 函数返回状态码0
}
bash
check_number -5
echo $? # 输出:1
check_number 5
echo $? # 输出:0
另一种概念的返回值是输出返回值,函数可以通过
echo
返回值,调用时可以捕获这些输出。
bash
calculate_sum() {
local sum=$(( $1 + $2 ))
echo $sum
}
# 捕获函数的输出
result=$(calculate_sum 5 3)
echo "The sum is: $result" # 输出:The sum is: 8
五、变量作用域
Shell中,变量的作用域有全局和局部之分
- 全局变量:在函数外部定义的变量或在函数内部未使用 local 关键字声明的变量是全局变量,可以在函数内外访问
- 局部变量:在函数内部使用 local 关键字声明的变量是局部变量,仅在函数内部可见
bash
global_var=10
my_function() {
local local_var=20 # 局部变量
echo "Inside function: global_var=$global_var, local_var=$local_var"
# Inside function: global_var=10, local_var=20
}
my_function
echo "Outside function: global_var=$global_var, local_var=$local_var"
# Outside function: global_var=10, local_var=
第二部分 文本处理
一、grep
用于在文本中搜索匹配特定模式的行,并将匹配的行打印出来
bash
grep [选项] '搜索词' 文件
# 常用选项
# -v:反转匹配,显示不符合模式的行
# -E:使用扩展正则表达式
# -i:忽略大小写
# -w:全词匹配
# -n:显示匹配行的行号
# -r:递归搜索目录中的文件
bash
grep "a" example.txt # 搜索 example.txt 文件中含有a的行
grep -i "a" example.txt # 搜索 example.txt 文件中包含 "a" 且忽略大小写的行
grep -v "a" example.txt # 搜索 example.txt 文件中不包含 "a" 的行
grep -r 'hello' . # 递归搜索当前目录下所有文件中包含 "hello" 的行
grep -E 'apple|banana' example.txt # 使用扩展正则表达式搜索包含 "apple" 或 "banana" 的行
二、sed
流编辑器,能够在不修改原始文件的情况下,对文本进行快速高效的编辑操作
bash
sed [选项] '命令' 文件
# 常用选项
# -n:默认情况下,sed会输出处理后的所有行,-n选项只输出经过sed命令处理的行
# -e:允许在同一命令行中执行多个sed命令
# -i:直接修改文件内容(修改前建议备份文件)
# -f:从文件中读取sed命令
bash
sed 's/apple/orange/g' example.txt # 将example.txt文件中每一行的apple替换为orange
sed -n '2p' example.txt # 只打印example.txt文件的第2行
sed '1,3d' example.txt # 删除example.txt文件中第1到第3行
sed 's/^/#/g' example.txt # 在example.txt文件每一行开头添加#
sed -i's/old/new/g' example.txt # 直接修改example.txt文件,将old替换为new
三、awk
文本处理工具,能够逐行处理文本,通过指定的模式匹配和操作对数据进行提取、转换和输出
bash
awk [选项] '模式 {操作}' 文件
# 常用选项
# -F:指定输入字段分隔符
# -v:定义变量
# 常用模式
# BEGIN:在处理文件内容之前执行一次操作
# END:在处理完文件所有内容之后执行一次操作
# 常用操作
# $1、$2...:表示第1个、第2个...字段
# NF:表示当前行的字段数量
# NR:表示当前处理的行号
awk -F: '{print $1}' /etc/passwd # 以:为分隔符,打印/etc/passwd文件中的第1个字段(用户名)
awk '{print $NF}' example.txt # 打印example.txt文件中每一行的最后一个字段
awk 'NR==10' example.txt # 打印example.txt文件的第10行
awk -v sum=0 '{sum+=$1} END {print sum}' data.txt # 计算data.txt文件中第一列数字的总和
awk 'BEGIN {FS=","; OFS=":"} {print $1,$2}' data.csv # 以逗号为输入分隔符,冒号为输出分隔符,打印data.csv文件的前两列