1 参考

【尚硅谷】Shell脚本从入门到实战_哔哩哔哩_bilibili

本文为上面链接的课程学习记录。

2 基础

shell脚本需要shell解释器进行执行,shell解释器就是一个应用程序,有多种。

2.1 命令解释器

常用/bin/sh和/bin/bash。

$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/usr/bin/tmux

查看系统默认解释器:

$ echo $SHELL
/bin/bash

2.2 脚本入门

(1)打印hello world

$ touch tmp.sh
#!/bin/bash

echo "hello world"

#!/bin/bash 指定脚本解析器。

$ ./tmp.sh
hello world

(2)创建一个文件,然后向文件中写入字符串

#!/bin/bash

touch new.txt

echo "hello world" >> new.txt

">>":输出重定向

3 变量

3.1 常用系统变量

$HOME:当前用户的home目录;

$PWD:当前路径

$SHELL:当前命令解析器

$USER:当前用户

3.2 自定义变量

(1)基础语法

定义变量:变量=值

注意:等号两边没有空格

$ s=1
$ echo $s
1

撤销变量:unset 变量

$ unset s

申明一个静态变量:readonly 变量名=值

$ readonly b=3
$ b=4
-bash: b: readonly variable

(2)变量定义规则

  • 变量名可以由字母、数字和下划线组成,但不能以数字开头,环境变量名建议大写。
  • 变量默认类型都是字符串类型,无法直接进行数值运算。
  • 变量的值如果有空格,需要使用双引号或单引号括起来。
  • 可以把变量提升为全局环境变量,使用export 变量名。

3.3 特殊变量

(1)$n

$n:n为数字,$0代表脚本名称,$1 ~ $9表示第1个到第9个参数,10以上的参数需要使用大括号包含,如${10}。

#!/bin/bash

echo "para0:" $0
echo "para1:" $1
echo "para2:" $2
echo "para3:" $3
echo "para4:" $4
echo "para5:" $5
echo "para6:" $6
echo "para7:" $7
echo "para8:" $8
echo "para9:" $9
echo "para10:" ${10}
$ ./tmp.sh 0 1 2 3 4 5 6 7 8 9
para0: ./tmp.sh
para1: 0
para2: 1
para3: 2
para4: 3
para5: 4
para6: 5
para7: 6
para8: 7
para9: 8
para10: 9

(2)$#

$#:获取所有输入参数个数,常用于循环。

#!/bin/bash

echo "\$#" $#
$ ./tmp.sh 0 1 2 3 4 5 6 7 8 9 10
$# 11

注:第0个参数是脚本的名字。

(3)$*

$*:代表命令行中所有的参数,把所有输入参数看作一个整体。

#!/bin/bash

echo "\$*" $*
$ ./tmp.sh 0 1 2 3 4 5 6 7 8 9 10
$* 0 1 2 3 4 5 6 7 8 9 10

(4)$@

$@:也代表命令中的所有参数,但把每个参数区分对待。

#!/bin/bash

echo "\$@" $@
$ ./tmp.sh 0 1 2 3 4 5 6 7 8 9 10
$@ 0 1 2 3 4 5 6 7 8 9 10

(5)$?

$?:最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果为非0(具体值,由命令决定),则证明上一个命令没有正确执行。

$ echo $?
0
$ xxx
bash: xxx: command not found...
$ echo $?
127

4 运算符

(1)基本语法

语法1:"$((运算符))"或者"[运算式]"

语法2:

  • expr +:加法
  • expr -:减法
  • expr \*:乘法
  • expr /:除法
  • expr %:取余

注意:expr运算符之间要有空格。乘法是"\*",不是"*"。

(2)举例

$ expr 3+2
3+2
$ expr 3 + 2
5
#!/bin/bash

expr 3 + 2
expr 3 - 2
expr 3 \* 2
expr 3 / 2
expr 3 % 2
expr `expr 2 + 3` \* 4
s=$[(2+3)*4]
echo $s
$ ./tmp.sh
5
1
6
1
1
20
20

5 条件判断

(1)基本语法

[ condition ]:条件非空即为true,[ xxx ]返回true,[]返回false。

注意:condition前后有空格。

(2)常用判断条件

1)两个整数之间的比较

条件 说明 条件 说明
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -ne 不等于(not equal)
-gt 大于(greater than) -ge 大于等于(greater equal)

2)按照文件权限进行判断

条件 说明 条件 说明
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)

3)按照文件类型进行判断

条件 说明 条件 说明
-f 文件存在并且是一个常规的文件 -e 文件存在(existence)
-d 文件存在并是一个目录(directory)

(3)举例

#!/bin/bash

[ 23 -gt 22 ]
echo $?
[ 23 -lt 22 ] && echo true || echo false [ -w tmp.sh ] && echo true || echo false
[ -e tm.txt ] && echo true || echo false
$ ./tmp.sh
0 # 0表示正确执行
false
true
false

(4)多条件判断

&&表示前一条命令执行成功时,才执行后一条命令,||表示前一条命令执行失败后,才执行下一条命令。

[ 23 -lt 22 ] && echo true || echo false

$ ./tmp.sh
false

6 流程控制

6.1 if判断

(1)基本语法

if [ 条件判断式 ];then
程序
elif [ 条件判断式 ];then
程序
else
程序
fi

或者

if [ 条件判断式 ]
then
程序
fi

注意事项:

  • [ 条件判断式 ],中括号和条件判断式之间必须有空格。
  • if后有空格。
#!/bin/bash

if [ $1 -eq 1 ];then
echo "input 1"
elif [ $1 -eq 2 ]
then
echo "input 2"
else
echo "input $1"
fi
$ ./tmp.sh 1
input 1
$ ./tmp.sh 2
input 2
$ ./tmp.sh 3
input 3

6.2 case语句

(1)基本语法

case $变量名 in
"值1")
# 如果变量的值等于值1,则执行程序1
;; "值2")
# 如果变量的值等于值2,则执行程序2
;; *)
# 如果变量的值都不是以上的值,则执行此程序
;;
esac

举例:

#!/bin/bash

case $1 in
1)
echo "input 1"
;; 2)
echo "input 2"
;; *)
echo "input $1"
;;
esac
$ ./tmp.sh 1
input 1
$ ./tmp.sh 2
input 2
$ ./tmp.sh 3
input 3

7 循环

7.1 for循环

(1)基本语法1

for (( 初始值;循环判断条件;变量变化 ))
do
程序
done

举例:

#!/bin/bash

s=0
for (( i=1;i<=100;i++ ))
do
s=$[$s+$i]
done echo "s = $s"
$ ./tmp.sh
s = 5050

(2)基础语法2

for 变量 in 值1 值2 值3 ...
do
程序
done

举例:打印所有输入的参数

#!/bin/bash

for para in $@
do
echo "$para"
done
$ ./tmp.sh 1 2 3 4 5 6
1
2
3
4
5
6
#!/bin/bash

# "$*"把输入参数当作了一个整体
for para in "$*"
do
echo "$para"
done
$ ./tmp.sh 1 2 3 4 5 6
1 2 3 4 5 6

7.2 while循环

(1)基本语法

while [ 条件判断式 ]
do
程序
done

举例:

#!/bin/bash

sum=0
i=1
while [ $i -le 100 ]
do
sum=$[$sum + $i]
i=$[$i + 1]
done echo "sum = $sum"
$ ./tmp.sh
sum = 5050

8 read读取控制台输入

(1)基本语法

read (选项)(参数)

选项:

  • -p:指定读取值时的提示符;
  • -t:指定读取值时等待的时间(秒)。不带这个选项,则一直等待。

参数:指定读取值的变量名

举例:

#!/bin/bash

# 在7秒内输入参数,提示字符串"Enter para during seven seconds: "
read -t 7 -p "Enter para during seven seconds: " PARA echo $PARA
$ ./tmp.sh
Enter para during seven seconds: haha
haha
$ ./tmp.sh
Enter para during seven seconds:

9 函数

9.1 系统函数

(1)basename

basename string suffix

功能:删除所有的前缀,包括最后一个"/"字符,然后将字符串显示出来。

选项:suffix为后缀,如果指定了后缀,basename会将pathname或string中的suffix去掉。

举例:

#!/bin/bash

pwd1="/home/tmp"
pwd2="/home/tmp/hello.txt" basename $pwd1
basename $pwd2 ".txt"
$ ./tmp.sh
tmp
hello

(2)dirname

dirname 文件绝对路径

功能:从给定的包含绝对路径的文件名中去除文件(非目录部分),然后返回剩下的路径(目录的部分)。

举例:

#!/bin/bash

pwd="/home/tmp/hello.txt"

dirname $pwd
$ ./tmp.sh
/home/tmp

9.2 自定义函数

(1)基本语法

# function关键字可选,()也是可选的
[ function ] funcname[()]
{
Action;
[return int;]
}
funcname

注意事项:

  • 必须在调用函数之前先声明函数,shell脚本逐行运行,不会先编译。
  • 函数返回值,只能通过$?系统变量获得,可以显示加return返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值n(0~255)。

举例:

#!/bin/bash

# 求和
function sum()
{
s=0;
s=$[$1+$2]
echo $s
} read -p "Input para1 : " PARA1
read -p "Input para2 : " PARA2 sum $PARA1 $PARA2
$ ./tmp.sh
Input para1 : 10
Input para2 : 20
30

10 shell工具

10.1 cut

(1)基本用法

cut [选项参数] filename

功能:在文件中负责剪切数据,从文件的每一行剪切字节、字符和字段,并将这些字节、字符和字段输出。

说明:默认分隔符是制表符(\t)

选项参数说明:

  • -f:列号,提取第几列
  • -d:分割符,按照指定分隔符分割列

举例:

#!/bin/bash

if [ $1 -eq 1 ];then
# 使用空格进行切割,提取第1列
cut -d " " -f 1 tmp.txt
elif [ $1 -eq 2 ];then
# 使用空格进行切割,提取第2列
cut -d " " -f 2 tmp.txt
elif [ $1 -eq 3 ];then
# 使用空格进行切割,提取第2列
cut -d " " -f 2,3 tmp.txt
elif [ $1 -eq 4 ];then
# 仅切割出字符串"abc"
cat tmp.txt | grep abc | cut -d " " -f 2
fi
$ more tmp.txt
hello world me
haha haha you
123456 abc he $ ./tmp.sh 1
hello
haha
123456 $ ./tmp.sh 2
world
haha
abc $ ./tmp.sh 3
world me
haha you
abc he $ ./tmp.sh 4
abc
# 选取系统PATH变量名,从第2个“:”开始后的所有路径
$ echo $PATH | cut -d : -f 3-

10.2 sed

基本用法:

sed [选项参数] 'command' filename

功能:一种流编辑器,一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容。处理完成后,把缓冲区的内容输出到屏幕,接着处理下一行,不断的重复直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。

选项参数:

  • -e:直接在命令列模式上进行sed的动作编辑。

命令功能描述:

  • a:增加,a的后面可以接字符串,在下一行出现
  • d:删除
  • s:查找并替换
$ more tmp.txt
hello world me
haha haha you
123456 abc he # 将like添加到文件的第二行下
$ sed "2a like" tmp.txt
hello world me
haha haha you
like
123456 abc he # 删除包含有he的行
$ sed "/he/d" tmp.txt
haha haha you # 将"you"替换为"your"
$ sed "s/you/your/g" tmp.txt
hello world me
haha haha your
123456 abc he # 删除第1行,并将"you"替换为"your"
$ sed -e "1d" -e "s/you/your/g" tmp.txt
haha haha your
123456 abc he

10.3 awk

功能:一个强大的文本分析工具,将文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

基本用法:

awk [选项参数] 'pattern1 {action1} pattern2 {action2} ...' filename

pattern:表示awk在数据中查找的内容,也就是匹配模式。

action:在找到匹配内容时所执行的一系列命令。

选项参数说明:

  • -F:指定输入文件拆分隔符
  • -v:赋值一个用户定义变量

举例:

$ more tmp.txt
Keywords:
Status: CLOSED DUPLICATE of bug 1151231
Alias: None
Product: Fedora
Component: dnf
Version: rawhide
Hardware: x86_64
OS: Linux
Priority: unspecified
Severity: high
Target Milestone: ---
Assignee: Packaging Maintenance Team
QA Contact: Fedora Extras Quality Assurance
Docs Contact:
URL:
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked Reported: 2014-10-17 13:51 UTC by lejeczek
Modified: 2014-10-17 13:54 UTC (History)
CC List: 7 users (show)
Fixed In Version:
Doc Type: Bug Fix
# 搜索tmp.txt文件中以Assignee关键字开头的行,并输出该行的第2列(以":"符号进行切割)
$ awk -F: '/^Assignee/ {print $2}' tmp.txt
Packaging Maintenance Team # 搜索tmp.txt文件中以Assignee关键字开头的行,并输出该行的第1、2列(以":"符号进行切割)
$ awk -F: '/^Assignee/ {print $1,$2}' tmp.txt
Assignee Packaging Maintenance Team # 文件开头加"user,shell",然后打印,然后文件末尾加"ggg"
$ awk 'BEGIN{print "user,shell"} {print} END{print "ggg"}' tmp.txt
user,shell
Keywords:
Status: CLOSED DUPLICATE of bug 1151231
Alias: None
Product: Fedora
Component: dnf
Version: rawhide
Hardware: x86_64
OS: Linux
Priority: unspecified
Severity: high
Target Milestone: ---
Assignee: Packaging Maintenance Team
QA Contact: Fedora Extras Quality Assurance
Docs Contact:
URL:
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked Reported: 2014-10-17 13:51 UTC by lejeczek
Modified: 2014-10-17 13:54 UTC (History)
CC List: 7 users (show)
Fixed In Version:
Doc Type: Bug Fix
ggg

awk内置变量:

  • FILENAME:文件名
  • NR:已读的记录数
  • NF:浏览记录的域的个数(切割后,列的个数)
$ awk -F: '{print "filename:"FILENAME " NR:"NR}' tmp.txt
filename:tmp.txt NR:1
filename:tmp.txt NR:2
filename:tmp.txt NR:3
filename:tmp.txt NR:4
filename:tmp.txt NR:5
filename:tmp.txt NR:6
filename:tmp.txt NR:7
filename:tmp.txt NR:8
filename:tmp.txt NR:9
filename:tmp.txt NR:10
filename:tmp.txt NR:11
filename:tmp.txt NR:12
filename:tmp.txt NR:13
filename:tmp.txt NR:14
filename:tmp.txt NR:15
filename:tmp.txt NR:16
filename:tmp.txt NR:17
filename:tmp.txt NR:18
filename:tmp.txt NR:19
filename:tmp.txt NR:20
filename:tmp.txt NR:21
filename:tmp.txt NR:22
filename:tmp.txt NR:23
filename:tmp.txt NR:24
filename:tmp.txt NR:25 # 打印空行所在的行号
$ awk -F: '/^$/ {print "NR:"NR}' tmp.txt
NR:20

10.4 sort

功能:将文件进行排序,并将排序结果标准输出

基本语法:

sort (选项) (参数)

参数:指定待排序的文件列表

选项说明:

  • -n:依照数值的大小排序
  • -r:以相反的顺序来排序
  • -t:设置排序时所用的分割字符
  • -k:指定需要排序的列

举例:

$ more tmp.txt
bb:40:5.4
bd:20:4.2
xz:50:2.3
ae:10:3.5
ss:30:1.6 # 使用":"进行切割,然后按第2列数值大小以相反的顺序进行排序
$ sort -t : -nrk 2 tmp.txt
xz:50:2.3
bb:40:5.4
ss:30:1.6
bd:20:4.2
ae:10:3.5

11 特殊字符

参考:

shell 脚本里的 特殊字符 $(( ))、$( )、``与${ }的区别 - 马克图 - 博客园 (cnblogs.com)

https://www.cnblogs.com/splendid/p/11201733.html

(1)$(command)或`command`

# 新开一个子shell顺序执行命令cmd1,cmd2,cmd3
(cmd1;cmd2;cmd3)

功能:先执行command,再将结果替换出来,再重组成新的命令行。

#!/bin/bash

s1=`basename ${PWD}`
s2=$(basename ${PWD}) echo "s1: $s1"
echo "s2: $s2"
$ pwd
/home/tmp $ ./tmp.sh
s1: tmp
s2: tmp

注意:$( )的弊端是并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。

(2)花括号{}

基本用法:统配将对大括号中的文件名做扩展,大括号中不允许有空白。

第一种:对大括号中的以逗号分隔的文件列表进行扩展。

$ list=$(echo {a,b,c,d}.txt)
$ echo $list
a.txt b.txt c.txt d.txt

第二种:对大括号中以".."分割的顺序文件列表进行扩展。

$ list=$(echo {a..d}.txt)
$ echo $list
a.txt b.txt c.txt d.txt
$ list=$(echo a{1..3}.txt)
$ echo $list
a1.txt a2.txt a3.txt

(3)四种特殊的替换结构

${var:-string}  ${var:+string}  ${var:=string}  ${var:?string}

${var:-string}:若变量var为空,则用命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string}。

$unset a
$ echo ${a:-bcc}
bcc $ b=10
$ echo ${b:-bcc}
10

${var:+string}:若变量var不为空,则在命令行中用string来替换${var:+string},否则变量var为空时,则用变量var的值来替换${var:+string},也就是空值。

$ c=1
$ echo ${c:+abc}
abc $ unset c
$ echo ${c:+abc}

${var:=string}:和${var:-string}一样,若var为空时,用string替换${var:-string}的同时,把string赋给变量var。

$ unset a
$ echo ${a:=bcc}
bcc
$ echo $a
bcc

${var:?string}:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。

$ unset a
$ echo ${a:?abc}
-bash: a: abc
$ a=10
$ echo ${a:?abc}
10

(4)四种模式匹配替换结构

${var%pattern}  ${var%%pattern}  ${var#pattern}  ${var##pattern}
  • #:去掉左边
  • %:去掉右边
  • #和%中的单一符号是最小匹配,两个相同符号是最大匹配。

pattern中支持通配符,常用的通配符如下:

  • *:表示零个或者任意多个字符
  • ?:表示零个或者一个任意字符
  • [...]:表示匹配中括号里面的字符
  • [!...]:表示不匹配中括号里面的字符

${var%pattern}:在var中从右边开始匹配,看它是否和给的模式pattern结尾,如果是就从命令行把var中的内容去掉右边最短的匹配模式。

$ var=testcase
$ echo ${var%s*e}
testca

${var%%pattern}:在var中从右边开始匹配,看它是否和给的模式pattern结尾,如果是就从命令行把var中的内容去掉右边最长的匹配模式。

$ var=testcase
$ echo ${var%%s*e}
te

${var#pattern}:在var中从左边开始开始匹配,看它是否和给的模式pattern结尾,如果是就从命令行把var中的内容去掉左边最短的匹配模式。

$ echo $var
testcase
$ echo ${var#?e}
stcase

${var#pattern}:在var中从左边开始开始匹配,看它是否和给的模式pattern结尾,如果是就从命令行把var中的内容去掉左边最长的匹配模式。

$ echo $var
testcase
$ echo ${var##*s}
e

(5)字符串提取和替换

${var:pos:length}  ${var/pattern/pattern}  ${var//pattern/pattern}

${var:num1:num2}:pos是位置,length为长度,表示从$var字符串的第$pos位置开始提取长度为$length的子串,不能为负数。

$ var=/home/tmp
$ echo ${var:5}
/tmp
$ echo ${var:(-4)} # 负数要用括号
/tmp
$ echo ${var:1:4}
home

${var/pattern1/pattern2}:将var字符串的第一个匹配的pattern1替换为另一个pattern2。

$ echo ${var/tmp/xxx}
/home/xxx

${var//pattern/pattern}:将var字符串中的所有能匹配的pattern替换为另一个pattern。

$ var=/abc/def/cde/md
$ echo ${var//c/xx}
/abxx/def/xxde/md

(6)符号$后的括号

${a}:变量a的值,不引起歧义的情况下可以省略大括号。

$(cmd):命令替换,和`cmd`效果相同,结果为shell命令cmd的输出值。

$((expression)):计算数学表达式exp的数值,其中exp只要符合C语言运算规则即可。

$ pwd
/home/tmp/Study_Shell
$ echo $(basename $PWD)
Study_Shell $ echo $((1+2+3))
6

shell脚本入门学习的更多相关文章

  1. Shell脚本入门学习笔记

    1.shell操作系统和用户之间.负责解释命令行 2./etc/shells 记录登录系统有效支持shell 3./etc/passwd 最后,有人谁可以看到用户的默认shell 4.直接输入shel ...

  2. Shell脚本编程学习入门 02

    Shell脚本编程学习入门是本文要介绍的内容,我们可以使用任意一种文字编辑器,比如gedit.kedit.emacs.vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行):   #! ...

  3. 【shell】shell脚本入门

    1. 前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚 ...

  4. Linux Shell脚本入门--cut命令

    Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...

  5. linux的shell脚本入门

    Linux shell脚本入门教程 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活 的工具.Shell不仅仅是命令的收集,而且是一门非常 ...

  6. 详细介绍Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  7. (一)shell脚本入门

    shell脚本入门 1.脚本格式 脚本以#!/bin/bash 开头(指定解析器) 2.第一个shell脚本:helloworld (1)需求:创建一个shell脚本,输出helloworld 运行: ...

  8. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  9. Shell脚本的学习(二)

    Shell脚本的学习(二) 方法: 1) 一个计算器: 2)递归实现打印目录    3)方法调用

  10. Shell脚本的学习(一)

    Shell脚本的学习(一) 一)代码式shell脚本简介 1.下载 Xshell 5 建一个文件夹 mkdri home/data ; 1)查看一个在data里建一个1.sh 查看是否建立成功. 2) ...

随机推荐

  1. Pytorch-tensor的激活函数

    1.激活函数 激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题.因为很多问题都不是线性的,你只有给它加入一些非线性因素,就能够让问题更好的解决. 函数1:RE ...

  2. 通过UI自动化方式获取文章、视频信息

    出于学习研究,对某账号的文章.视频分析一翻,尝试使用自动化方式看能否获取相应信息. 获取某号的文章有多重方法: 第一种是通过搜狗浏览器搜索账号(这种方式每天只能获取一篇文章,基本上没啥用.): 第二种 ...

  3. 使用WebApi+Vue3从0到1搭建《权限管理系统》:二、搭建JWT系统鉴权

    视频地址:[WebApi+Vue3从0到1搭建<权限管理系统>系列视频:搭建JWT系统鉴权-哔哩哔哩] https://b23.tv/R6cOcDO qq群:801913255 一.在ap ...

  4. 《Effective C#》系列之(三)——充分利用C#语言的新功能

    在<Effective C#>这本书中,利用C#语言的新功能是其中一章的内容.以下是该章节的一些核心建议,以及使用C#代码示例说明: 利用自动属性:在C# 3.0中引入了自动属性,可以大大 ...

  5. 【Oracle】对一个已经拥有重复数据的表的列设置唯一性约束

    对一个已经拥有重复数据的表的列设置唯一性约束 在这种情况下创建唯一性约束,可以发现会报错,通常为由于存在重复的键值,无法生效唯一性约束 最简单的方法,就是删除重复的记录,这样就可以按照正常流程,创建唯 ...

  6. 力扣1069(MySQL)-产品分析Ⅱ(简单)

    题目: 编写一个 SQL 查询,按产品 id product_id 来统计每个产品的销售总量. 查询结果格式如下面例子所示:  解题思路: 没有用到product表,直接在sales表中使用聚合函数: ...

  7. 基于 Serverless 打造如 Windows 体验的个人专属家庭网盘

    ​简介:虽然现在市面上有些网盘产品, 如果免费试用,或多或少都存在一些问题, 可以参考文章<2020 国内还能用的网盘推荐>.本文旨在使用较低成本打造一个 "个人专享的.无任何限 ...

  8. PyFlink 开发环境利器:Zeppelin Notebook

    简介: 在 Zeppelin notebook 里利用 Conda 来创建 Python env 自动部署到 Yarn 集群中. PyFlink 作为 Flink 的 Python 语言入口,其 Py ...

  9. [FE] Canvas 转图片并下载的方式

    先获取 canvas 节点,使用 toDataURL 转为 image 数据,最后使用 a 链接下载. // Trans to image const canvas = document.getEle ...

  10. dotnet SemanticKernel 入门 开篇

    本文将开坑告诉大家什么是 SemanticKernel 以及如何使用框架 众所周知 GPT 是一个大语言模型,能够参与的输入和输出是文本内容.而想要让 GPT 完成各项功能,则需要对接现有的编程世界. ...