MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Bash中的脚本与数据库操作

2023-08-195.4k 阅读

Bash脚本基础

脚本结构与语法

Bash脚本是由一系列Bash命令按顺序组成的文本文件。通常,脚本的第一行指定使用的Shell解释器,即#!/bin/bash,这被称为Shebang行。它告诉系统使用/bin/bash程序来解释执行该脚本。

例如,一个简单的Bash脚本:

#!/bin/bash
echo "Hello, World!"

在上述脚本中,echo是一个常用的Bash命令,用于在标准输出上打印文本。

变量与数据类型

  1. 变量定义 在Bash中,变量无需声明类型。定义变量的语法为变量名=值,例如:
name="John"

注意,变量名与等号之间不能有空格。

  1. 变量引用 要使用变量的值,需在变量名前加上$符号,例如:
echo $name

也可以使用花括号来明确变量边界,例如:

echo ${name}Doe
  1. 数据类型 Bash主要处理字符串类型,但也能在一定程度上处理数值。例如,进行简单的数值运算:
num1=5
num2=3
result=$((num1 + num2))
echo $result

这里$((...))用于进行算术运算。

流程控制

  1. if语句 if语句用于根据条件执行不同的代码块。基本语法如下:
if [ 条件 ]; then
    命令1
    命令2
elif [ 另一个条件 ]; then
    命令3
else
    命令4
fi

例如,判断一个数是否大于10:

num=15
if [ $num -gt 10 ]; then
    echo "The number is greater than 10"
else
    echo "The number is less than or equal to 10"
fi

这里-gt是用于比较数值大小的操作符,表示“大于”。

  1. for循环 for循环用于遍历一系列值。语法如下:
for 变量 in 列表; do
    命令
done

例如,遍历一个数字列表:

for i in 1 2 3 4 5; do
    echo $i
done

也可以使用seq命令生成数字序列,如:

for i in $(seq 1 10); do
    echo $i
done
  1. while循环 while循环在条件为真时持续执行代码块。语法为:
while [ 条件 ]; do
    命令
done

例如,当变量小于10时持续增加变量值并打印:

num=1
while [ $num -lt 10 ]; do
    echo $num
    num=$((num + 1))
done

这里-lt表示“小于”。

数据库操作概述

常见数据库类型

  1. 关系型数据库 关系型数据库以表格形式存储数据,各表格之间通过关系相互关联。常见的关系型数据库有MySQL、PostgreSQL等。例如,在MySQL中可以创建包含用户信息的表格,如users表,包含idnameemail等字段。
  2. 非关系型数据库 非关系型数据库则以不同的结构存储数据,如键值对(如Redis)、文档(如MongoDB)等。例如,Redis常用于缓存数据,以键值对形式存储,可快速读取和写入。

数据库操作需求

在实际应用中,常需要通过Bash脚本对数据库进行增删改查操作。比如,在一个数据处理脚本中,可能需要从数据库中读取数据进行分析,然后将分析结果写回数据库。或者在系统部署脚本中,需要创建数据库、表格以及插入初始数据。

使用Bash脚本操作MySQL数据库

安装MySQL客户端

在使用Bash脚本操作MySQL数据库之前,需要确保系统安装了MySQL客户端。在Ubuntu系统上,可以使用以下命令安装:

sudo apt update
sudo apt install mysql-client

在CentOS系统上:

sudo yum install mysql - community - client

连接MySQL数据库

  1. 基本连接 使用mysql命令连接到MySQL数据库。语法为:
mysql -u用户名 -p密码 -h主机地址 -P端口号 数据库名

例如,连接到本地MySQL数据库:

mysql -uroot -p123456 -hlocalhost -P3306 mydatabase

这里-u指定用户名,-p指定密码,-h指定主机地址,-P指定端口号,最后指定要连接的数据库名。

  1. 在脚本中连接 可以将连接命令写在Bash脚本中。例如:
#!/bin/bash
mysql -uroot -p123456 -hlocalhost -P3306 mydatabase << EOF
show tables;
EOF

这里使用了Here - Document(<< EOFEOF之间的内容作为mysql命令的输入),在连接数据库后执行了show tables;命令,用于显示数据库中的所有表格。

执行SQL语句

  1. 简单查询 在脚本中执行SQL查询语句,例如查询users表中的所有数据:
#!/bin/bash
result=$(mysql -uroot -p123456 -hlocalhost -P3306 mydatabase -N -B -e "select * from users")
echo $result

这里-N选项表示不显示列名,-B选项表示以批处理模式运行,-e选项后面跟着要执行的SQL语句。查询结果存储在result变量中并打印。

  1. 插入数据 插入数据到users表:
#!/bin/bash
name="Alice"
email="alice@example.com"
mysql -uroot -p123456 -hlocalhost -P3306 mydatabase -e "insert into users (name, email) values ('$name', '$email')"

这里先定义了nameemail变量,然后在SQL插入语句中使用这些变量。

  1. 更新数据 更新users表中某条记录:
#!/bin/bash
new_email="newalice@example.com"
id=1
mysql -uroot -p123456 -hlocalhost -P3306 mydatabase -e "update users set email='$new_email' where id=$id"

这里根据id更新了email字段的值。

  1. 删除数据 删除users表中某条记录:
#!/bin/bash
id=1
mysql -uroot -p123456 -hlocalhost -P3306 mydatabase -e "delete from users where id=$id"

这里根据id删除了相应的记录。

处理查询结果

  1. 逐行处理 当查询结果有多行时,可以逐行处理。例如,查询users表中的所有email并打印:
#!/bin/bash
result=$(mysql -uroot -p123456 -hlocalhost -P3306 mydatabase -N -B -e "select email from users")
while read -r email; do
    echo $email
done <<< "$result"

这里使用while read -r循环逐行读取查询结果并打印。

  1. 提取特定字段 如果查询结果有多列,只提取特定字段。例如,查询users表中的nameemail,但只处理email
#!/bin/bash
result=$(mysql -uroot -p123456 -hlocalhost -P3306 mydatabase -N -B -e "select name, email from users")
while read -r name email; do
    echo $email
done <<< "$result"

这里在while read -r中指定了两个变量nameemail,分别对应查询结果的两列,但只处理了email

使用Bash脚本操作PostgreSQL数据库

安装PostgreSQL客户端

在Ubuntu系统上安装PostgreSQL客户端:

sudo apt update
sudo apt install postgresql - client

在CentOS系统上:

sudo yum install postgresql - client

连接PostgreSQL数据库

  1. 基本连接 使用psql命令连接到PostgreSQL数据库。语法为:
psql -U用户名 -h主机地址 -p端口号 数据库名

例如,连接到本地PostgreSQL数据库:

psql -Upostgres -hlocalhost -p5432 mydatabase

这里-U指定用户名,-h指定主机地址,-p指定端口号,最后指定要连接的数据库名。

  1. 在脚本中连接 在Bash脚本中连接PostgreSQL数据库并执行命令:
#!/bin/bash
psql -Upostgres -hlocalhost -p5432 mydatabase << EOF
\dt
EOF

这里使用Here - Document在连接数据库后执行了\dt命令,用于显示数据库中的所有表格。

执行SQL语句

  1. 简单查询 在脚本中执行SQL查询语句,例如查询users表中的所有数据:
#!/bin/bash
result=$(psql -Upostgres -hlocalhost -p5432 mydatabase -t -A -c "select * from users")
echo $result

这里-t选项表示只显示数据,-A选项表示以非对齐方式输出,-c选项后面跟着要执行的SQL语句。

  1. 插入数据 插入数据到users表:
#!/bin/bash
name="Bob"
email="bob@example.com"
psql -Upostgres -hlocalhost -p5432 mydatabase -c "insert into users (name, email) values ('$name', '$email')"

这里同样先定义变量,然后在SQL插入语句中使用。

  1. 更新数据 更新users表中某条记录:
#!/bin/bash
new_email="newbob@example.com"
id=1
psql -Upostgres -hlocalhost -p5432 mydatabase -c "update users set email='$new_email' where id=$id"
  1. 删除数据 删除users表中某条记录:
#!/bin/bash
id=1
psql -Upostgres -hlocalhost -p5432 mydatabase -c "delete from users where id=$id"

处理查询结果

  1. 逐行处理 查询users表中的所有email并逐行打印:
#!/bin/bash
result=$(psql -Upostgres -hlocalhost -p5432 mydatabase -t -A -c "select email from users")
while read -r email; do
    echo $email
done <<< "$result"
  1. 提取特定字段 查询users表中的nameemail,只处理email
#!/bin/bash
result=$(psql -Upostgres -hlocalhost -p5432 mydatabase -t -A -c "select name, email from users")
while read -r name email; do
    echo $email
done <<< "$result"

使用Bash脚本操作Redis数据库

安装Redis客户端

在Ubuntu系统上安装Redis客户端:

sudo apt update
sudo apt install redis - tools

在CentOS系统上:

sudo yum install redis - tools

连接Redis数据库

使用redis - cli命令连接到Redis数据库。语法为:

redis - cli -h主机地址 -p端口号 -a密码

例如,连接到本地Redis数据库:

redis - cli -hlocalhost -p6379 -a123456

这里-h指定主机地址,-p指定端口号,-a指定密码。

执行Redis命令

  1. 设置键值对 在Bash脚本中设置Redis键值对:
#!/bin/bash
key="user:1:name"
value="Charlie"
redis - cli -hlocalhost -p6379 -a123456 set $key $value

这里使用set命令设置了一个键值对。

  1. 获取键值 获取Redis中某个键的值:
#!/bin/bash
key="user:1:name"
value=$(redis - cli -hlocalhost -p6379 -a123456 get $key)
echo $value

这里使用get命令获取键对应的值并存储在value变量中,然后打印。

  1. 删除键 删除Redis中的某个键:
#!/bin/bash
key="user:1:name"
redis - cli -hlocalhost -p6379 -a123456 del $key

这里使用del命令删除指定的键。

处理Redis数据结构

  1. 哈希表操作 在Redis中,哈希表常用于存储对象。例如,存储用户信息:
#!/bin/bash
user_id="2"
name="David"
email="david@example.com"
redis - cli -hlocalhost -p6379 -a123456 hset user:$user_id name $name email $email

这里使用hset命令在哈希表user:$user_id中设置了nameemail字段。 获取哈希表中的字段值:

#!/bin/bash
user_id="2"
name=$(redis - cli -hlocalhost -p6379 -a123456 hget user:$user_id name)
echo $name

这里使用hget命令获取了哈希表中name字段的值。

  1. 列表操作 在Redis中,列表可用于存储有序的数据集合。例如,添加元素到列表:
#!/bin/bash
list_key="tasks"
task1="Clean room"
task2="Buy groceries"
redis - cli -hlocalhost -p6379 -a123456 rpush $list_key $task1 $task2

这里使用rpush命令将任务添加到tasks列表中。 获取列表中的所有元素:

#!/bin/bash
list_key="tasks"
tasks=$(redis - cli -hlocalhost -p6379 -a123456 lrange $list_key 0 -1)
echo $tasks

这里使用lrange命令获取了tasks列表中从索引0到最后一个元素的所有内容。

使用Bash脚本操作MongoDB数据库

安装MongoDB客户端

在Ubuntu系统上安装MongoDB客户端:

sudo apt update
sudo apt install mongodb - client

在CentOS系统上:

sudo yum install mongodb - client

连接MongoDB数据库

使用mongo命令连接到MongoDB数据库。语法为:

mongo 主机地址:端口号/数据库名 -u用户名 -p密码

例如,连接到本地MongoDB数据库:

mongo localhost:27017/mydatabase -uadmin -p123456

执行MongoDB命令

  1. 插入文档 在Bash脚本中插入文档到MongoDB集合:
#!/bin/bash
document='{ "name": "Eve", "email": "eve@example.com" }'
mongo localhost:27017/mydatabase -uadmin -p123456 --eval "db.users.insertOne($document)"

这里使用insertOne方法插入一个文档到users集合。

  1. 查询文档 查询MongoDB集合中的文档:
#!/bin/bash
result=$(mongo localhost:27017/mydatabase -uadmin -p123456 --eval "db.users.find().toArray()" | jq)
echo $result

这里使用find方法查询users集合中的所有文档,并通过jq工具格式化输出。jq是一个用于处理JSON数据的命令行工具,需要提前安装。

  1. 更新文档 更新MongoDB集合中的文档:
#!/bin/bash
new_email="neweve@example.com"
mongo localhost:27017/mydatabase -uadmin -p123456 --eval "db.users.updateOne({name: 'Eve'}, {\$set: {email: '$new_email'}})"

这里使用updateOne方法更新了nameEve的文档的email字段。

  1. 删除文档 删除MongoDB集合中的文档:
#!/bin/bash
mongo localhost:27017/mydatabase -uadmin -p123456 --eval "db.users.deleteOne({name: 'Eve'})"

这里使用deleteOne方法删除了nameEve的文档。

处理复杂查询与聚合

  1. 复杂查询 查询users集合中年龄大于30的用户:
#!/bin/bash
result=$(mongo localhost:27017/mydatabase -uadmin -p123456 --eval "db.users.find({age: {\$gt: 30}}).toArray()" | jq)
echo $result

这里使用$gt操作符表示“大于”进行查询。

  1. 聚合操作users集合按年龄进行分组并统计人数:
#!/bin/bash
pipeline='[{\$group: {_id: "$age", count: {\$sum: 1}}}]'
result=$(mongo localhost:27017/mydatabase -uadmin -p123456 --eval "db.users.aggregate($pipeline)" | jq)
echo $result

这里使用$group$sum操作符进行聚合操作。

通过以上内容,我们详细介绍了在Bash脚本中如何操作常见的数据库,包括关系型数据库MySQL、PostgreSQL以及非关系型数据库Redis和MongoDB。掌握这些技能可以使系统管理员和开发人员更高效地进行数据处理和自动化任务。