17、高效脚本模板生成与SQL基础入门

高效脚本模板生成与SQL基础入门

1. new_script工具介绍

new_script是一个能高效生成脚本模板的工具,它提供了多个有用的选项:
- -h, –help :显示帮助信息,该选项与其他new_script选项互斥,显示帮助信息后,new_script会退出。
- -q, –quiet :使new_script进入非交互模式,输出无定制化的基础模板。若未指定输出脚本文件,模板将输出到标准输出。
- -s, –root :在模板中添加一个例程,要求脚本必须由超级用户运行。若普通用户尝试运行,会显示错误信息并终止。

2. 创建第一个脚本模板

下面我们通过一个实例来展示如何使用new_script创建脚本模板。
1. 启动new_script并指定脚本名称

me@linuxbox:~$ new_script new_script-demo

若脚本已存在,会提示是否覆盖:

------------------------------------------------------------------------
** Welcome to new_script version 3.5.3 **
------------------------------------------------------------------------
File 'new_script-demo' exists. Overwrite [y/n] > y

若未指定脚本文件名,会提示输入。
2. 输入脚本目的和许可信息
接下来,需要输入脚本的目的和许可方式:

------------------------------------------------------------------------
** Comment Block **
The purpose is a one line description of what the script does.
------------------------------------------------------------------------
The purpose of the script is to: > demonstrate the new_script template
------------------------------------------------------------------------
The script may be licensed in one of two ways:
1. All rights reserved (default) or
2. GNU GPL version 3 (preferred).
------------------------------------------------------------------------
Include GPL license header [y/n]? > y
  1. 设置脚本权限
    可选择是否需要超级用户权限:
------------------------------------------------------------------------
** Privileges **
The template may optionally include code that will prevent it from
running if the user does not have superuser (root) privileges.
------------------------------------------------------------------------
Does this script require superuser privileges [y/n]? > n
  1. 定义命令行选项
    若选择支持命令行选项,可按提示依次输入短选项名、选项描述、长选项名(可选)和选项参数(可选):
------------------------------------------------------------------------
** Command Line Options **
The generated template supports both short name (1 character), and long
name (1 word) options. All options must have a short name. Long names
are optional. The options 'h' and 'help' are provided automatically.
Further, each option may have a single argument. Argument names must
be valid variable names.
Descriptions for options and option arguments should be short (less
than 1 line) and will appear in the template's comment block and
help_message.
------------------------------------------------------------------------
Does this script support command-line options [y/n]? > y
Option 1:
  Enter short option name [a-z] (Enter to end) -> a
  Description of option ------------------------> the first option named 'a'
  Enter long option name (optional) ------------> option_a
  Enter option argument (if any) ---------------> 
Option 2:
  Enter short option name [a-z] (Enter to end) -> b
  Description of option ------------------------> the second option named 'b'
  Enter long option name (optional) ------------> option_b
  Enter option argument (if any) ---------------> b_argument
  Description of argument (if any)--------------> argument for option 'b'
Option 3:
  Enter short option name [a-z] (Enter to end) -> 

当在短选项提示处直接回车时,new_script会结束命令选项的输入并写入模板。

3. 查看生成的脚本模板

生成的脚本模板包含以下几个部分:
1. 注释块
注释块包含了许可证、用法和修订历史等信息:

  1  #!/usr/bin/env bash
  2  # ---------------------------------------------------------------------
  3  # new_script-demo - Demonstrate the new_script template

  4  # Copyright 2021, Linux User <me@linuxbox.example.com>
  5    
  6  # This program is free software: you can redistribute it and/or modify
  7  # it under the terms of the GNU General Public License as published by
  8  # the Free Software Foundation, either version 3 of the License, or
  9  # (at your option) any later version.

 10  # This program is distributed in the hope that it will be useful,
 11  # but WITHOUT ANY WARRANTY; without even the implied warranty of
 12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 13  # GNU General Public License at <http://www.gnu.org/licenses/> for
 14  # more details.

 15  # Usage: new_script-demo [-h|--help]
 16  #        new_script-demo [-a|--option_a] [-b|--option_b b_argument]

 17  # Revision history:
 18  # 2021-05-05 Created by new_script ver. 3.5.3
 19  # ---------------------------------------------------------------------

注意,脚本目的的首字母会被大写,作者的姓名和电子邮件地址也会被自动计算。作者姓名从 /etc/password 文件获取,若设置了 REPLYTO 环境变量,则使用该变量的值作为电子邮件地址;否则,电子邮件地址为 $USER@$(hostname) 。可在 ~/.bashrc 文件中定义 REPLYTO 变量,例如:

export REPLYTO=me@linuxbox.example.com
  1. 常量和函数
 20  PROGNAME=${0##*/}
 21  VERSION="0.1"
 22  LIBS=     # Insert pathnames of required external shell libraries here

全局常量包含程序名(从 $0 派生)和版本号。 LIBS 常量应设置为包含要引入的外部shell库文件路径的空格分隔列表(需用双引号),且库文件路径名不能包含空格。
3. 处理程序终止的函数

 23  clean_up() { # Perform pre-exit housekeeping
 24    return
 25  }
 26  error_exit() {
 27    local error_message="$1"
 28    printf "%s: %s\n" "$PROGNAME" "${error_message:-"Unknown Error"}" >&2
 29    clean_up
 30    exit 1
 31  }
 32  graceful_exit() {
 33    clean_up
 34    exit
 35  }
 36  signal_exit() { # Handle trapped signals
 37    local signal="$1"
 38    case "$signal" in
 39      INT)
 40        error_exit "Program interrupted by user" ;;
 41      TERM)
 42        error_exit "Program terminated" ;;
 43      *)
 44        error_exit "Terminating on unknown signal" ;;
 45    esac
 46  }

clean_up 函数用于在脚本退出前执行清理操作,其他退出函数都会调用该函数以确保有序终止。
4. 加载外部库的函数

 47  load_libraries() { # Load external shell libraries
 48    local i
 49    for i in $LIBS; do
 50      if [[ -r "$i" ]]; then
 51        source "$i" || error_exit "Library '$i' contains errors."
 52      else
 53        error_exit "Required library '$i' not found."
 54      fi
 55    done
 56  }

load_libraries 函数会遍历 LIBS 常量中的内容,引入每个文件。若文件缺失或包含错误,脚本将终止并输出错误信息。
5. 用法和帮助信息函数

 57  usage() {
 58    printf "%s\n" "Usage: ${PROGNAME} [-h|--help]"
 59    printf "%s\n" \
         "       ${PROGNAME} [-a|--option_a] [-b|--option_b b_argument]"
 60  }
 61  help_message() {
 62    cat <<- _EOF_
 63  $PROGNAME ver. $VERSION
 64  Demonstrate the new_script template
 65  $(usage)
 66    Options:
 67    -h, --help                  Display this help message and exit.
 68    -a, --option_a              The first option named 'a'
 69    -b, --option_b b_argument   The second option named 'b'
 70      Where 'b_argument' is the argument for option 'b'.
 71  _EOF_
 72    return
 73  }

usage help_message 函数根据我们输入的信息生成,帮助信息格式整齐,选项描述按需大写。
6. 信号捕获和加载外部库

 74  # Trap signals
 75  trap "signal_exit TERM" TERM HUP
 76  trap "signal_exit INT"  INT
 77  load_libraries

最后进行信号捕获和调用加载外部库的函数。
7. 命令行解析器

 78  # Parse command-line
 79  while [[ -n "$1" ]]; do
 80    case "$1" in
 81      -h | --help)
 82        help_message
 83        graceful_exit
 84        ;;
 85      -a | --option_a)
 86        echo "the first option named 'a'"
 87        ;;
 88      -b | --option_b)
 89        echo "the second option named 'b'"
 90        shift; b_argument="$1"
 91        echo "b_argument == $b_argument"
 92        ;;
 93      --* | -*)
 94        usage >&2
 95        error_exit "Unknown option $1"
 96        ;;
 97      *)
 98        printf "Processing argument %s...\n" "$1"
 99        ;;
100    esac
101    shift
102  done

解析器根据我们定义的命令选项进行解析,为实际代码提供简单的存根。它能处理选项后的位置参数,即使脚本没有选项也能正常工作。
8. 主逻辑

103  # Main logic
104  graceful_exit

由于当前脚本还未实现具体功能,所以直接调用 graceful_exit 函数优雅退出。

4. 测试脚本模板

生成的脚本模板是一个功能完整且正确的脚本,可进行测试:
- 查看帮助信息

me@linuxbox:~$ ./new_script-demo --help
new_script-demo ver. 0.1
Demonstrate the new_script template
Usage: new_script-demo [-h|--help]
       new_script-demo [-a|--option_a] [-b|--option_b b_argument]
  Options:
  -h, --help                  Display this help message and exit.
  -a, --option_a              The first option named 'a'
  -b, --option_b b_argument   The second option named 'b'
    Where 'b_argument' is the argument for option 'b'.
  • 无选项或参数运行
me@linuxbox:~$ ./new_script-demo
me@linuxbox:~$

此时模板无输出。
- 使用选项和参数运行

me@linuxbox:~$ ./new_script-domo -a
the first option named 'a'
me@linuxbox:~$ ./new_script-demo -b test
the second option named 'b'
b_argument == test

模板会在处理选项和参数时显示信息。
- 处理位置参数

me@linuxbox:~$ ./new_script-demo ./*
Processing argument ./bin...
Processing argument ./Desktop...
Processing argument ./Disk_Images...
Processing argument ./Documents...
Processing argument ./Downloads...
5. SQL基础入门
5.1 数据与数据库

数据是当今世界的驱动力,大部分计算机应用都涉及数据库中的数据。关系数据库管理系统(RDBMS)常用于存储大量数据,许多行业如银行、保险公司、会计系统和网站都使用关系数据库来存储和组织数据。

5.2 关系数据库的发展

关系数据存储的概念由英国计算机科学家和IBM研究员E. F. Cobb在1970年提出。1973年左右,IBM开发了结构化查询语言(SQL)来简化和灵活管理关系数据库。如今,RDBMS和SQL结合形成了一个庞大的产业。

5.3 关系数据库对Linux的重要性

开源数据库程序(如MySQL)和Web服务器(如Apache)的出现,推动了Linux在早期万维网中的广泛应用。

6. 关系数据库的基本概念
6.1 表(Tables)

关系数据库由一个或多个包含列和行的表组成。列通常称为属性,行称为元组,但更常用的称呼是列和行。表类似于电子表格,每列包含相同类型的数据,表可以有任意数量的行。

6.2 模式(Schemas)

数据库的设计称为模式,它可以简单到只包含一两个表,也可以复杂到包含多个具有复杂相互关系的表。以书店数据库为例,包含三个表:
- Customers表
| Cust | First | Last | Street | City | ST |
| ---- | ---- | ---- | ---- | ---- | ---- |
| 0001 | Richard | Stollman | 1 Outonthe Street | Boston | MA |
| 0002 | Eric | Roymond | 2 Amendment Road | Bunker Hill | PA |
| 0003 | Bruce | Porens | 420 Middleville Drive | Anytown | US |
- Items表
| Item | Title | Author | Price |
| ---- | ---- | ---- | ---- |
| 1001 | Winning Friends and Influencing People | Dale Carnegie | 14.95 |
| 1002 | The Communist Manifesto | Marx & Engels | 00.00 |
| 1003 | Atlas Shrugged | Ayn Rand | 99.99 |
- Sales表
| Cust | Date_Time | Item | Quan | Total |
| ---- | ---- | ---- | ---- | ---- |
| 0002 | 202006150931 | 1003 | 1 | 99.99 |
| 0001 | 202006151108 | 1002 | 1 | 0.00 |
| 0003 | 202006151820 | 1001 | 10 | 149.50 |

6.3 键(Keys)

键用于唯一标识表中的行,并促进表之间的相互关系。键必须满足唯一性(在表中只能出现一次)和不可变性(不能更改)的要求。在书店数据库中, Customers 表的 Cust 列和 Items 表的 Item 列作为键。使用键而不是客户姓名等信息作为标识,是因为姓名可能会改变或存在重复,而键可以保证唯一性和不可变性。

7. 数据库引擎/服务器

Linux上有多种数据库服务器,其中最著名的是MySQL(及其分支MariaDB)和PostgreSQL。这些数据库服务器采用客户端/服务器架构,服务器进程运行,客户端通过网络连接发送SQL语句,服务器执行操作并将结果返回给客户端。许多网站使用这种架构,通过Web服务器向数据库服务器发送SQL语句来动态创建网页。

8. SQLite数据库

由于设置MySQL和PostgreSQL等数据库服务器较为复杂,我们选择使用SQLite进行学习。SQLite是一个库,可与应用程序结合提供高级SQL功能,在嵌入式系统领域非常流行。它为应用开发人员省去了编写自定义数据存储和管理解决方案的麻烦。除了库,SQLite还提供了一个命令行工具,可直接与SQLite数据库交互。它可以从标准输入接受SQL语句,并将结果输出到标准输出,适合在shell脚本中使用。

8.1 安装SQLite

在大多数Linux发行版中,可通过以下命令安装SQLite:

me@linuxbox:~$ sudo apt install sqlite3
8.2 构建测试环境

可从LinuxCommand.org网站下载一个存档文件来构建测试环境:

me@linuxbox:~$ cd
me@linuxbox:~$ curl -c http://linuxcommand.org/adventure-sql.tgz
me@linuxbox:~$ tar xzf adventure-sql.tgz
me@linuxbox:~$ cd adventure-sql

综上所述,new_script工具能帮助我们快速生成高质量的脚本模板,而SQLite则为我们学习SQL提供了一个简单易用的平台。通过学习和实践,我们可以更好地掌握脚本编写和数据库操作的技能。

高效脚本模板生成与SQL基础入门

9. 深入理解SQLite的使用
9.1 SQLite的基本操作流程

使用SQLite进行数据库操作,一般遵循以下流程:
1. 启动SQLite命令行工具 :在终端输入 sqlite3 ,后面可跟上数据库文件名,如果数据库文件不存在,SQLite会自动创建。例如:

sqlite3 mydatabase.db
  1. 执行SQL语句 :在SQLite命令行中,可以执行各种SQL语句,如创建表、插入数据、查询数据等。
  2. 查看操作结果 :执行查询语句后,SQLite会将结果输出到终端。
  3. 退出SQLite :输入 .quit 命令退出SQLite命令行。
9.2 SQLite中的数据类型

SQLite支持多种数据类型,主要包括:
| 数据类型 | 描述 |
| ---- | ---- |
| NULL | 表示空值 |
| INTEGER | 整数类型 |
| REAL | 浮点数类型 |
| TEXT | 文本类型 |
| BLOB | 二进制大对象类型 |

例如,创建一个包含不同数据类型的表:

CREATE TABLE employees (
    id INTEGER PRIMARY KEY,
    name TEXT,
    salary REAL,
    hire_date TEXT
);
9.3 向表中插入数据

插入数据可以使用 INSERT INTO 语句。例如,向 employees 表中插入一条记录:

INSERT INTO employees (name, salary, hire_date) VALUES ('John Doe', 5000.00, '2023-01-01');
9.4 查询表中的数据

使用 SELECT 语句可以查询表中的数据。例如,查询 employees 表中的所有记录:

SELECT * FROM employees;

也可以根据条件进行查询,如查询薪水大于3000的员工:

SELECT * FROM employees WHERE salary > 3000;
10. SQL语句的高级应用
10.1 数据更新与删除
  • 更新数据 :使用 UPDATE 语句可以更新表中的数据。例如,将 employees 表中 id 为1的员工的薪水更新为6000:
UPDATE employees SET salary = 6000 WHERE id = 1;
  • 删除数据 :使用 DELETE 语句可以删除表中的数据。例如,删除 employees 表中 id 为1的员工记录:
DELETE FROM employees WHERE id = 1;
10.2 表的连接操作

当需要从多个表中获取数据时,可以使用表连接操作。常见的连接类型有内连接( INNER JOIN )、左连接( LEFT JOIN )等。

以书店数据库为例,假设我们有 Customers 表和 Sales 表,要查询每个销售记录对应的客户信息,可以使用内连接:

SELECT Sales.Cust, Customers.First, Customers.Last, Sales.Item, Sales.Total
FROM Sales
INNER JOIN Customers ON Sales.Cust = Customers.Cust;
10.3 子查询

子查询是指在一个查询语句中嵌套另一个查询语句。例如,要查询购买了价格大于50的商品的客户信息,可以使用子查询:

SELECT * FROM Customers
WHERE Cust IN (
    SELECT Cust FROM Sales
    WHERE Item IN (
        SELECT Item FROM Items WHERE Price > 50
    )
);
11. 脚本与数据库的结合应用
11.1 在脚本中使用SQLite

我们可以在shell脚本中调用SQLite进行数据库操作。以下是一个简单的示例脚本,用于创建一个数据库并插入一条记录:

#!/bin/bash

# 创建数据库并插入数据
sqlite3 mytest.db <<EOF
CREATE TABLE test_table (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO test_table (name) VALUES ('Test Data');
EOF

# 查询数据
sqlite3 mytest.db "SELECT * FROM test_table"

将上述脚本保存为 test_script.sh ,并赋予执行权限:

chmod +x test_script.sh

然后运行脚本:

./test_script.sh
11.2 脚本与数据库交互的流程图
graph TD;
    A[开始脚本] --> B[连接到SQLite数据库];
    B --> C[执行SQL语句];
    C --> D{是否有查询结果};
    D -- 是 --> E[处理查询结果];
    D -- 否 --> F[继续执行其他操作];
    E --> F;
    F --> G{是否完成所有操作};
    G -- 否 --> C;
    G -- 是 --> H[关闭数据库连接];
    H --> I[结束脚本];
12. 总结与展望

通过使用new_script工具,我们能够快速生成规范且功能完善的脚本模板,大大提高了脚本开发的效率。而SQLite为我们提供了一个轻量级、易于使用的数据库平台,方便我们学习和实践SQL操作。

在未来的学习和工作中,我们可以进一步深入研究脚本编写和数据库操作的高级技巧。例如,优化脚本的性能、使用更复杂的SQL语句进行数据分析等。同时,还可以尝试将脚本和数据库应用到实际项目中,如开发一个简单的管理系统,通过脚本与数据库的交互实现数据的增删改查等功能。

此外,我们也可以关注其他数据库技术的发展,如NoSQL数据库,了解它们的特点和适用场景,以便在不同的项目中选择最合适的数据库解决方案。

总之,脚本编写和数据库操作是编程领域中非常重要的技能,通过不断学习和实践,我们可以不断提升自己的能力,为解决实际问题提供更有效的方法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值