From 73ebf2894e9322e2fc946b1240eefcfc6d5d27ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=82=E6=99=93=E4=B9=90?= <1487872160@qq.com> Date: Mon, 8 Jul 2024 17:31:40 +0800 Subject: [PATCH 1/4] 2024.7.8 --- ...75\346\225\260\347\254\224\350\256\260.md" | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 "\346\266\202\346\231\223\344\271\220/2027.7.8\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260\347\254\224\350\256\260.md" diff --git "a/\346\266\202\346\231\223\344\271\220/2027.7.8\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260\347\254\224\350\256\260.md" "b/\346\266\202\346\231\223\344\271\220/2027.7.8\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260\347\254\224\350\256\260.md" new file mode 100644 index 0000000..358d3cc --- /dev/null +++ "b/\346\266\202\346\231\223\344\271\220/2027.7.8\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260\347\254\224\350\256\260.md" @@ -0,0 +1,54 @@ + +``` +create or replace function gen_hanzi(int) +returns text as $$ +declare -- 局部变量 + res text; +begin + if $1 >=1 then + select string_agg(chr(int4(random()*25)+65), '') into res from generate_series(1,$1); + return res; + end if; + return null; +end; +$$ language plpgsql strict; + +select gen_hanzi(3); + +``` + +这段代码定义了一个名为 gen_hanzi 的 PostgreSQL 函数。该函数接受一个整数参数,并返回一个文本字符串。下面是对代码的详细解释: + +create or replace function gen_hanzi(int) +returns text as $$ + +这里定义了一个名为 gen_hanzi 的函数,它接受一个整数类型的参数,并返回一个文本类型的值。 + +declare -- 局部变量 + res text; +begin + +声明了一个局部变量 res,它是一个文本类型,用于存储函数生成的字符串。 + + if $1 >=1 then + +这个 if 语句检查传入的参数是否大于或等于1。如果条件成立,则执行以下代码块。 + + select string_agg(chr(int4(random()*25)+65), '') into res from generate_series(1,$1); + +这行代码使用 string_agg 函数来聚合一系列字符。generate_series(1,$1) 生成一个从1到参数 $1 的序列。对于序列中的每个数字,chr(int4(random()*25)+65) 生成一个随机大写字母。int4(random()*25)+65 生成一个介于65(大写字母'A'的ASCII码)和90(大写字母'Z'的ASCII码)之间的随机整数。chr() 函数将这些整数转换为对应的字符,然后通过 string_agg 函数连接起来形成字符串,并将结果赋值给 res。 + + return res; + end if; + +如果参数 $1 大于或等于1,则返回生成的字符串。 + + return null; +end; +$$ language plpgsql strict; + +如果参数 $1 小于1,函数返回 null。language plpgsql strict; 指定函数使用 PostgreSQL 的 PL/pgSQL 语言编写,并且是严格的。 + +最后,执行一个 select 语句来调用 gen_hanzi 函数,并传入参数3: + +select gen_hanzi(3); \ No newline at end of file -- Gitee From 1d0ce6e9f1451346871ca313b8316000c9c07c82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=82=E6=99=93=E4=B9=90?= <1487872160@qq.com> Date: Tue, 9 Jul 2024 14:43:21 +0800 Subject: [PATCH 2/4] 2024.7.9 --- ...60\345\222\214\344\275\234\344\270\232.md" | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 "\346\266\202\346\231\223\344\271\220/2024.7.9\345\244\207\344\273\275\346\225\260\346\215\256\345\272\223\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232.md" diff --git "a/\346\266\202\346\231\223\344\271\220/2024.7.9\345\244\207\344\273\275\346\225\260\346\215\256\345\272\223\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232.md" "b/\346\266\202\346\231\223\344\271\220/2024.7.9\345\244\207\344\273\275\346\225\260\346\215\256\345\272\223\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232.md" new file mode 100644 index 0000000..2be315f --- /dev/null +++ "b/\346\266\202\346\231\223\344\271\220/2024.7.9\345\244\207\344\273\275\346\225\260\346\215\256\345\272\223\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232.md" @@ -0,0 +1,88 @@ +# mysql备份和还原 +备份数据库的脚本 +``` +#!/bin/bash +#备份目录 +BACKUP=/data/backup/db + +#当前时间 +DATETIME=$(date +%Y-%m-%d_%H%M%S) +echo $DATETIME + +#数据库的地址 +HOST=localhost + +#数据库用户名 +DB_USER=root + +#数据库密码 +DB_PW=123456 + +#备份的数据库名 +DATABASE=oo + +#创建备份目录,如果不在,就创建 +[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}" + +#备份数据库 +mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sq + +#将文件处理成tar.gz +cd ${BACKUP} +tar -zcvf $DATETIME.tar.gz ${DATETIME} +#删除对应的备份目录 +rm -rf ${BACKUP}/${DATETIME} + +#删除10天前的备份文件 +find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \; +``` + +还原: +``` +第一种方法 + mysql -u root -p test < /home/backup/crm-2020-08-14-14-32.sql +Enter password:123456 + 第二种方法 +先登录mysql数据库,输入命令 mysql -u root -p,输入密码即可 +再使用数据库test, use test +导入备份文件. source /home/backup/crm-2020-08-14-14-32.sql +``` + +# postgresql的备份与还原 +备份 +``` + pg_dump -h 164.82.233.54 -U postgres databasename > C:\databasename.bak +``` +指令解释: +``` +pg_dump 是备份数据库指令, +164.82.233.54是数据库的ip地址(必须保证数据库允许外部访问的权限,如果是本地可以用localhost) +postgres 是数据库的用户名; +databasename 是数据库名。 +意思是导出到C:\databasename.bak文件里,如果没有写路径,单单写databasename.bak文件名,那么备份文件会保存在PostgreSQL\9.3\bin文件夹里。 +下面是恢复的命令: +``` +还原 +``` +psql -h localhost -U postgres -d databasename < databasename.bak +``` +指令解释: +``` +psql是恢复数据库命令 + localhost 是数据库的ip地址(这里指本机) +postgres 是数据库的用户名; +databasename 是要恢复到哪个数据库 +< 的意思是把C:\databasename.bak文件导入到指定的数据库里 +``` + + +# 备份 +``` +1.完整备份(Full Backup) 完整备份是指对整个数据库进行备份,包括所有数据和表。完整备份是最基本的备份类型,可以独立恢复数据库到某个时间点的状态。 + +2.增量备份(Incremental Backup) 增量备份是指备份自上次完整备份或增量备份以来发生变化的数据。增量备份只备份自上次备份以来新增或修改的数据,因此备份文件相对较小,但恢复时需要依次应用完整备份和所有增量备份。 + +3.差异备份(Differential Backup) 差异备份是指备份自上次完整备份之后发生变化的数据。与增量备份不同的是,差异备份只备份自上次完整备份以来发生变化的数据,而不是自上次备份以来的所有变化。在恢复时,只需要应用一次完整备份和最近的一次差异备份即可。 +``` + +拉取文件:scp root@47.115.218.75:/bfmysql.sh "D:\\vm" \ No newline at end of file -- Gitee From 1c037d7431a6748d025136c0536181c17157ca8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=82=E6=99=93=E4=B9=90?= <1487872160@qq.com> Date: Thu, 11 Jul 2024 10:33:06 +0800 Subject: [PATCH 3/4] 2024.7.11 --- ...34\344\270\232\347\254\224\350\256\260.md" | 144 +++++++++++++ ...55\346\263\225\347\254\224\350\256\260.md" | 202 ++++++++++++++++++ ...75\346\225\260\347\254\224\350\256\260.md" | 0 3 files changed, 346 insertions(+) create mode 100644 "\346\266\202\346\231\223\344\271\220/2024.7.10shell\345\205\245\351\227\250\345\222\214\344\275\234\344\270\232\347\254\224\350\256\260.md" create mode 100644 "\346\266\202\346\231\223\344\271\220/2024.7.11shell\350\257\255\346\263\225\347\254\224\350\256\260.md" rename "\346\266\202\346\231\223\344\271\220/2027.7.8\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260\347\254\224\350\256\260.md" => "\346\266\202\346\231\223\344\271\220/2024.7.8\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260\347\254\224\350\256\260.md" (100%) diff --git "a/\346\266\202\346\231\223\344\271\220/2024.7.10shell\345\205\245\351\227\250\345\222\214\344\275\234\344\270\232\347\254\224\350\256\260.md" "b/\346\266\202\346\231\223\344\271\220/2024.7.10shell\345\205\245\351\227\250\345\222\214\344\275\234\344\270\232\347\254\224\350\256\260.md" new file mode 100644 index 0000000..51f54ee --- /dev/null +++ "b/\346\266\202\346\231\223\344\271\220/2024.7.10shell\345\205\245\351\227\250\345\222\214\344\275\234\344\270\232\347\254\224\350\256\260.md" @@ -0,0 +1,144 @@ +# shell +Linux 的 shell 是一个强大的命令行解释器,它是用户与操作系统交互的桥梁。在 Linux 系统中,shell 负责接收用户输入的命令,解释这些命令,并调用操作系统的内核来执行相应的操作。以下是关于 Linux shell 的详细介绍: + +Shell 的类型 +Bash(Bourne Again SHell):是目前最流行的 shell,大多数 Linux 发行版默认使用 Bash。 +Zsh(Z Shell):是另一个功能丰富的 shell,提供了许多高级特性。 +Fish(Friendly Interactive SHell):以其易于使用的交互式特性而闻名。 +其他:如 Ksh(Korn Shell)、Tcsh(C Shell)等。 +Shell 脚本 +Shell 脚本是一种用 shell 语言编写的程序,通常以 .sh 作为文件扩展名。它允许用户自动化常见的任务,例如文件管理、系统监控、软件部署等。 + +脚本示例 +#!/bin/bash +# 这是一个简单的shell脚本示例 +``` +echo "Hello, World!" +``` + +# Shell 编程 +Shell 编程涉及编写脚本以实现自动化任务。以下是一些基本概念: + +变量:用于存储和使用数据。 +命令:执行特定操作的程序。 +控制语句:包括条件语句(if、else)、循环(for、while)等。 +函数:用于封装可重用的代码块。 +变量示例 +``` +#!/bin/bash +my_variable="Hello, World!" +echo $my_variable +``` +# 变量 +环境变量是在系统级别或用户级别定义的变量,它们对于当前会话中的所有进程都是可用的。 +系统级:对所有用户生效,通常在 /etc/profile 或 /etc/bash.bashrc 中设置。 +用户级:只对当前用户生效,通常在 ~/.bashrc 或 ~/.bash_profile 中设置。 +会话级:在当前 shell 会话中设置,只对当前会话有效。 +设置环境变量 +export MY_ENV_VAR="My environment variable" + +进程与会话 +每个 shell 都是一个进程,当用户通过终端连接到 Linux 服务器时,实际上是启动了一个新的 shell 进程。每个进程都有自己的环境变量,这些变量不会影响其他进程,除非修改了物理配置文件。 + +1.for批量创建用户100个用户 +``` +!/bin/bash +for((i=1;i<=100;i++)) +do + useradd ${i} + done +``` + 2.创建一个存放1-100奇数的数组 + ``` +#num=() + +for i in {1..100};do + if (( i % 2 !=0 ));then + num=$((num+i)) + fi +#done +``` +3.猜数字游戏:开始生成一个100以内的正整数,给10次机会猜数字,如果没有猜对,则提示小了或者大了,>如果猜对了,提示恭喜,全部次数用完都没有猜对,则显示“很遗憾” +``` +ranum=$((random % 100+1)) + +time=0 + +while [ $time -lt 10 ];do + echo "输入你的猜测(1-100)" + read guess + + time=$((time+1)) + +if [ $guess -eq $ranum ];then +i echo "对了" + exit 0 +elif [ $guess -lt $ranum ]; then + echo "小了" + else + echo "大了" +fi +done +echo "没有猜对" + +``` +4.显示一张99乘法表 +``` +for (( i=1; i<=9; i++ )) +do + for (( j=1; j<=i; j++ )) + do + printf "%d*%d=%-2d\\t" $j $i $(($i*$j)) + done + echo +done +``` +5.打印一个等腰三角形 +``` +height=5 +for (( i=1; i<=height; i++ )) +do + for (( j=1; j<=height-i; j++ )) + do + printf " " + done + for (( k=1; k<=2*i-1; k++ )) + do + printf "*" + done +echo +done +``` +6.抽奖游戏,50个人,抽奖,要求抽出5个三等奖、3个二等奖、1个一等奖,要求不能重复,中奖过的人不能重复中奖,结果生成在文件中 +``` +#!/bin/bash +par=() +win=() + + +for i in $(seq 1 50);do + par+=("$i") +done + +for((i=1;i<=5;i++));do +winn=$(shuf -e "${par[@]}"| head -n 1) +win+=("$winn 三等奖") +par=("${par[@]/$winn}") +done + +for((i=1;i<=3;i++));do + winn=$(shuf -e "${par[@]}"| head -n 1) + win+=("$winn 二等奖") + par=("${par[@]/$winn}") +done + +winn=$(shuf -e "${par[@]}"| head -n 1) +win+=("$winn 一等奖") + +echo "${win[@]}" + +echo "${win[@]}" > winners.txt + +echo "抽签结果已保存至winners.txt" +``` + diff --git "a/\346\266\202\346\231\223\344\271\220/2024.7.11shell\350\257\255\346\263\225\347\254\224\350\256\260.md" "b/\346\266\202\346\231\223\344\271\220/2024.7.11shell\350\257\255\346\263\225\347\254\224\350\256\260.md" new file mode 100644 index 0000000..29f9653 --- /dev/null +++ "b/\346\266\202\346\231\223\344\271\220/2024.7.11shell\350\257\255\346\263\225\347\254\224\350\256\260.md" @@ -0,0 +1,202 @@ +# shell 语法 + +# if +在 shell 脚本中,if 语句用于根据条件执行不同的操作。以下是 if 语句的基本语法和一些常见的用法示例: +注意事项 +条件表达式:条件表达式需要用方括号 [ ] 包围,并且方括号与条件之间需要有空格。 +逻辑运算符:常用的逻辑运算符有 -a(与)、-o(或)、!(非),但建议使用 && 和 || 来提高可读性。 +字符串比较:字符串比较时,可以使用 = 或 == 来判断是否相等,使用 != 来判断是否不相等。 + +基本语法 +``` +if [ condition ]; then + # 条件为真时执行的代码 +else + # 条件为假时执行的代码 +fi +``` +比较两个数值: +``` +num1=10 +num2=20 +if [ $num1 -eq $num2 ]; then + echo "两个数值相等" +else + echo "两个数值不相等" +fi +``` +使用逻辑运算符: +``` +num=5 +if [ $num -gt 0 ] && [ $num -lt 10 ]; then + echo "数值在 0 和 10 之间" +else + echo "数值不在 0 和 10 之间" +fi +``` +多重条件 +可以使用 elif 来处理多重条件: +``` +if [ condition1 ]; then + # 条件1为真时执行的代码 +elif [ condition2 ]; then + # 条件2为真时执行的代码 +else + # 所有条件都为假时执行的代码 +fi +``` +示例 +``` +num=15 +if [ $num -lt 10 ]; then + echo "数值小于 10" +elif [ $num -lt 20 ]; then + echo "数值在 10 和 20 之间" +else + echo "数值大于或等于 20" +fi +``` + + +# for + +在 shell 脚本中,for 循环用于遍历一系列的值。以下是 for 循环的常见语法和示例: + +语法 1:遍历列表中的值 +``` +for item in item1 item2 item3... +do + # 循环体中执行的操作 +done +``` +示例 1 +``` +for fruit in apple banana orange +do + echo "我喜欢 $fruit" +done +``` +语法 2:使用 C 语言风格的循环 +``` +for (( expression1; expression2; expression3 )) +do + # 循环体中执行的操作 +done +``` +其中: + +expression1 是初始化表达式,通常用于初始化循环变量。 +expression2 是条件表达式,只要条件为真,循环就会继续。 +expression3 是更新表达式,用于在每次循环结束时更新循环变量的值。 +示例 2 +``` +for (( i=1; i<=5; i++ )) +do + echo "数字: $i" +done +``` +语法 3:遍历文件中的行 +``` +for line in $(cat filename) +do + # 对每一行进行操作 + echo "$line" +done +``` + + +# 数组 + +在 Shell 脚本中,数组是一种可以存储多个值的变量。以下是一些基本的数组语法和操作方法: + +定义数组: +``` +array_name=(value1 value2 value3 ...) +``` +示例: +``` +fruits=(apple banana orange) +``` +访问数组元素: +``` +echo ${array_name[index]} +``` +示例: +``` +echo ${fruits[0]} # 输出: apple +``` +获取数组长度: +``` +echo ${#array_name[@]} +``` +示例: +``` +echo ${#fruits[@]} # 输出数组长度 +``` +遍历数组: +``` +for item in ${array_name[@]} +do + echo $item +done +``` +示例: +``` +for fruit in ${fruits[@]} +do + echo $fruit +done +``` +数组切片: +``` +echo ${array_name[start_index:step]} +``` +示例: +``` +echo ${fruits[0:2]} # 输出: apple banana +``` +数组的替换: + +临时替换(只影响当前行的输出): +``` +echo ${array_name[@]/old_value/new_value} +``` +永久替换(修改数组内容): +``` +array_name[index]=new_value +``` +示例: +``` +echo ${fruits[@]/banana/mango} # 输出: apple mango orange +fruits[1]=mango +echo ${fruits[@]} # 输出: apple mango orange +``` +删除数组元素: +``` +unset array_name[index] +``` +示例: +``` +unset fruits[1] +echo ${fruits[@]} # 输出: apple orange +``` +删除整个数组: +``` +unset array_name +``` +示例: +``` +unset fruits +echo ${fruits[@]} # 由于数组被删除,不会有输出 +``` +数组追加元素: +``` +array_name[index]=new_value +``` +示例: +``` +fruits[3]=grape +echo ${fruits[@]} # 输出: apple mango orange grape +``` + + diff --git "a/\346\266\202\346\231\223\344\271\220/2027.7.8\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260\347\254\224\350\256\260.md" "b/\346\266\202\346\231\223\344\271\220/2024.7.8\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260\347\254\224\350\256\260.md" similarity index 100% rename from "\346\266\202\346\231\223\344\271\220/2027.7.8\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260\347\254\224\350\256\260.md" rename to "\346\266\202\346\231\223\344\271\220/2024.7.8\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260\347\254\224\350\256\260.md" -- Gitee From b9902d642fa5340ee398fad3c09ab12900900f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=82=E6=99=93=E4=B9=90?= <1487872160@qq.com> Date: Sun, 14 Jul 2024 10:58:20 +0800 Subject: [PATCH 4/4] 2024.7.12 --- ...2024.7.12shell\347\254\224\350\256\260.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 "\346\266\202\346\231\223\344\271\220/2024.7.12shell\347\254\224\350\256\260.md" diff --git "a/\346\266\202\346\231\223\344\271\220/2024.7.12shell\347\254\224\350\256\260.md" "b/\346\266\202\346\231\223\344\271\220/2024.7.12shell\347\254\224\350\256\260.md" new file mode 100644 index 0000000..fdba3f7 --- /dev/null +++ "b/\346\266\202\346\231\223\344\271\220/2024.7.12shell\347\254\224\350\256\260.md" @@ -0,0 +1,38 @@ +# Bash 常用快捷键 +``` +快捷键 作用 +ctrl+A 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。 +ctrl+E 把光标移动到命令行结尾。 +ctrl+C 强制终止当前的命令。 +ctrl+L 清屏,相当于clear命令。 +ctrl+U 删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便 +ctrl+K 删除或剪切光标之后的内容。 +ctrl+Y 粘贴ctrl+U或ctul+K剪切的内容。 +ctrl+R 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。 +ctrl+D 退出当前终端。 +ctrl+Z 暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管理章节详细介绍。 +``` + +# linux 的标准输入与输出 +``` +设备 设备名 文件描述符 类型 +键盘 /dev/stdin 0 标准输入 +显示器 /dev/stdout 1 标准输出 +显示器 /dev/stderr 2 标准错误输出 +``` + +# 关系运算符 +``` +关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 +下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20: + +运算符 单词 说明 举例 +-eq equal 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。 +-ne not equal 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。 +-gt great than 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。 +-lt less than 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。 +-ge great than or equal 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。 +-le less than or equal 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。 +``` + + -- Gitee