函数
系统函数
常见内置命令
echo打印输出
#!/bin/bash
# 输出普通文本
echo "Hello, World!"
# 输出变量值
name="Alice"
echo "Hello, $name"
# 输出带有换行符的文本
echo -n "Hello, " # -n 选项不输出换行
echo "World!"
cd :改变当前工作目录 ; pwd:打印当前目录
#!/bin/bash
# 显示当前目录
echo "当前目录: $(pwd)"
# 改变到 home 目录
cd ~
echo "已切换到 Home 目录: $(pwd)"
# 返回上一级目录
cd ..
echo "返回上一级目录: $(pwd)"
exit:退出脚本返回一个状态码
#!/bin/bash
echo "脚本即将退出"
exit 0 # 退出脚本并返回状态码 0(表示成功)
read:读取用户输入
#!/bin/bash
echo "请输入你的名字:"
read name
echo "你好, $name"
test - 条件测试
#!/bin/bash
# 文件存在性测试
if test -e "/etc/passwd"; then
echo "文件 /etc/passwd 存在"
else
echo "文件 /etc/passwd 不存在"
fi
# 字符串测试
str="hello"
if test "$str" = "hello"; then
echo "字符串匹配"
else
echo "字符串不匹配"
fi
# 数字比较
a=5
b=10
if test $a -lt $b; then
echo "$a 小于 $b"
fi
常用外部命令
即常见的Linux服务器命令,下面对于常用的做出总结
ls :列出指定目录中的文件和子目录
cat : 查看文件内容
grep:搜索文本
也可以在脚本中写
#!/bin/bash
# 在文件中查找包含 "hello" 的行
grep "hello" file.txt
awk : 文本处理
sed :流编译器
#!/bin/bash
# 替换文件中的 "hello" 为 "hi"
sed 's/hello/hi/' file.txt
# 删除文件中包含 "world" 的行
sed '/world/d' file.txt
find:查找文件
#!/bin/bash
# 在当前目录下查找所有以 ".txt" 结尾的文件
find . -name "*.txt"
# 查找最近 5 天内修改过的文件
find . -mtime -5
tar :压缩和解压
#!/bin/bash
# 创建一个 tar 包
tar -cvf archive.tar file1.txt file2.txt
# 解压 tar 包
tar -xvf archive.tar
自定义函数
基本语法
# 方法1:使用 `function` 关键字
function my_function() {
echo "Hello, World!"
}
# 方法2:省略 `function` 关键字
my_function() {
echo "Hello, World!"
}
# 方法1:使用 `function` 关键字
function my_function1() {
echo "Hello, World!"
}
# 方法2:省略 `function` 关键字
my_function2() {
echo "Hello, World!"
}
my_function1
my_function2
函数参数
shell函数通过位置参数$1 $2等来使用参数
greet() {
echo "Hello, $1! You are $2 years old."
}
greet "Alice" 25 # 输出:Hello, Alice! You are 25 years old.
参数数量获取:通过 $#获取传递给函数的参数个数
count_args() {
echo "Number of arguments: $#"
}
count_args 1 2 3
返回值与错误处理
直接通过echo进行返回值
add() {
result=$(( $1 + $2 ))
echo $result
}
sum=$(add 5 3)
echo "Sum is: $sum" # 输出:Sum is: 8
return返回状态码
-
$?
存储的是上一个命令或函数的退出状态
check_positive() {
if [ $1 -gt 0 ]; then
return 0 # 返回0表示成功
else
return 1 # 返回1表示失败
fi
}
check_positive 10
if [ $? -eq 0 ]; then
echo "Positive number"
else
echo "Non-positive number"
fi
错误处理
check_error() {
if [ $1 -lt 0 ]; then
echo "Error: Negative number!" >&2
exit 1
fi
}
check_error -1
区部变量和全局变量
使用局部变量
-
local
关键字限制变量在函数内部有效 - 如果没有使用
local
,变量将是全局的,函数外部也可以访问
example() {
local var="I am local"
echo $var
}
example
echo $var
全局变量
- 函数内部不使用
local
,则变量会变成全局变量,函数外部也能访问
global_example() {
global_var="I am global"
}
global_example
echo $global_var
递归函数
factorial() {
if [ $1 -le 1 ]; then
echo 1
else
prev=$(factorial $(( $1 - 1 )))
echo $(( $1 * prev ))
fi
}
result=$(factorial 5)
echo "Factorial of 5 is: $result"
函数调试
set -x
和set +x
允许你跟踪函数内部的执行过程
set -x # 开启调试模式,显示每行命令及其执行结果
example_debug() {
echo "This is a debug example"
echo "Another line"
}
example_debug
set +x # 关闭调试模式
正则表达式
常规匹配
点号.:
a.b
将匹配任意字符(除了换行符)位于a
和b
之间的字符串
方括号
[]
(匹配字符集中的任意一个字符):例如[aeiou]
匹配任何一个元音字母(a
、e
、i
、o
、u
)
apple
banana
grape
pear
orange
umbrella
插入符号
^
(匹配行的开始):用来匹配以特定字符串开头的行
apple pie
banana split
apple tart
grape fruit
apple cider
$:匹配行结束,主要用来匹配特定字符串结尾的行
apple pie
banana tart
apple tart
grape tart
orange juice
|:示逻辑“或”操作符,匹配任意一个模式
apple
banana
carrot
grape
cucumber
orange
*:例如a*匹配零个或者多个a
+:匹配前一个字符或者多个
常用特殊字符
\:转移字符
\.
、\*
、\+
等- 用于转义字符,使它们失去特殊意义,变为字面量字符。例如,
.
通常匹配任意字符,但如果你想匹配一个字面量的点,可以使用\.
():分组和捕获
- 语法:
(abc|def)
- 说明:圆括号用于创建分组。它们可以帮助你将一部分模式组合在一起,从而作为一个整体来进行匹配
apple pie
banana split
grape fruit
apple tart
orange juice
{}:量词
- 语法:
a{n,m}
、a{n}
- 说明:大括号用于指定前一个字符出现的次数。例如,
a{2,4}
匹配2到4个a
,而a{3}
只匹配正好3个a
aa
aaa
aaaa
aaaaa
文本处理工具
cut
概述
用于从文本文件中提取字段、列或字符,可以通过指定分隔符、字段范围、字符位置等来灵活提取所需的数据
常用选项
-f
:选择字段。-d
:指定分隔符。-c
:选择字符位置。--complement
:选择除了指定字段之外的所有字段。-s
:只显示包含分隔符的行。
基本语法
cut OPTION... [FILE]...
常用选项和用法
-f
:选择字段
- 语法:
cut -f FIELD
-f
用来指定要提取的字段。字段是通过分隔符(默认是制表符)来划分的-d ','
用来指定字段的分隔符是逗号,而-f 1,3
表示提取第一列和第三列- 注意文中如果有其他注释会失效
-d
:指定分隔符
- 语法:
cut -d DELIM
- 使用
-d
选项来指定字段分隔符,默认为制表符。你可以将其设置为其他字符(如逗号、空格等)
-c
:按字符位置选择
- 语法:
cut -c N
- 使用
-c
选项根据字符位置选择字段。你可以选择一个或多个字符位置进行提取 - 提取每一行的前三个字符
--complement
:选择非指定字段
- 语法:
cut --complement
使用--complement
选项选择除指定字段之外的所有字段 - 使用
cut
提取除了第一列和第三列之外的所有列
-s
:只显示有分隔符的行
- 语法:
cut -s
- 使用
-s
选项来排除没有分隔符的行
awk
概述
基本语法
awk 'pattern { action }' input_file
pattern
:用于匹配的模式(正则表达式)。如果省略,则awk
会对每一行都执行动作action
:在模式匹配后执行的操作。如果省略,则默认打印匹配的行input_file
:要处理的输入文件。如果不指定,awk
会从标准输入读取数据
常用选项
打印整行内容
awk
会打印所有匹配行。只给出awk '{ print }'
就会打印每一行
打印指定字段
awk
将每一行默认按空格或制表符分割成字段,字段可以通过$n
访问,其中n
是字段的数字(从 1 开始)。$1
表示第一字段,$2
表示第二字段,依此类推
使用分隔符 -F
- 默认情况下,
awk
使用空格和制表符作为字段分隔符。你可以使用-F
选项指定其他分隔符
条件判断
基础运算
BEGIN END
BEGIN
和END
是特殊的块,用来在处理文本前或后执行操作。BEGIN
用于在处理前执行,END
用于在处理后执行
结合正则表达式使用
内置变量的使用
NR
:表示当前记录(行)的编号NF
:表示当前行的字段数FS
:字段分隔符,默认为空格或制表符OFS
:输出字段分隔符,默认为空
修改输出时的字段数值