Skip to content

第一章 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文件的前两列