0%

读取变量

shell变量包括两种:环境变量和用户定义变量。环境变量用于定制shell的运行环境,保证shell的正确运行,可以参考环境变量那一节来进行配置;用户定义的变量在shell脚本中用来作为临时的存储空间

1
2
3
4
5
6
7
8
9
10
11
12
#设置变量
# 变量名=变量值 之间没有空格
myvar=this_is_variable
# 如果变量值包含空格,需要使用引号
myvar1="this is variable1"
# 使用变量,这里可以有引号也可以没有引号,还可以使用${varName}
myvar2=$myvar1
myvar3="$myvar1"
# 如果变量后有其他英数单词要用${},否则shell无法正确判断变量
echo Hi,${myvar1}Mm
# 如果是多个变量连接的话需要引号
myvar4="$myvar $myvar1"

注意:设定变量时,等号两边不能有空格

可以通过$variable来读取变量,如果变量是一段命令的话,可以将命令放在括号中,shell会将这个这个命令进行执行,替换为命令的输出结果,该过程称为命令替换

1
$(command)

交互式

上述方式是静态的在命令行或者脚本中使用赋值语句来给变量赋值,使用起来对用户并不友好,所以可以使用read来接收键盘输入的变量,与位置参数变量相比更适合于人机交互

1
2
3
4
5
6
7
8
read [选项] [变量]
------------------------
-s 隐藏输入(密码)
-p 提示信息
-t 读取值时的等待时间,单位s
-n 限制字符个数
-a name 把词读入到name数组中去
-e 把一整行读入到第一个变量中
1
2
3
4
5
6
#!/bin/bash
# 将键盘输入的内容赋给num1变量
read -p "输入数字1: " num1
read -p "输入数字2: " num2
#$((运算式))可以进行数值运算
echo "两个数之和为"$(($num1 + $num2))
1
2
3
4
zhanghe@bogon shell % sh add.sh 
输入数字1: 13
输入数字2: 12
两个数之和为25

Nginx配置限流

Nginx有限流功能,是基于漏桶算法实现的

limit_req_zone是配置在http模块中的

1
2
#设置限流  zone用来定义ip状态和url访问频率的共享区域,其中mylimit为区域名称,冒号后为区域大小,16000个IP地址的状态信息大约是1M,rate为最大请求速率(如每分钟一个请求)
limit_req_zone $binary_remote_addr zone=mylimit:1m rate=1r/m;

limit_req是配置在location块、server块、http块中

1
2
# 请求限流 zone为上述定义的区域名称  burst为排队大小  nodelay表示不限制单个请求的延迟时间
limit_req zone=mylimit burst=10 nodelay;
阅读全文 »

位置参数变量

在写shell脚本的时候,难免会进行命令行传参,下面来介绍一下位置参数变量

  • $n n为数字,$0代表脚本名称,即当前程序的名称 $1-$9代表第一到第九个参数,十以上的参数需要使用大括号,如${10}
  • $* 表示命令行中的所有参数,把所有参数看成一个整体
  • $@ 也表示命令行中的所有参数,但是把每个参数区分对待
  • ${@:起点} 由起点开始,取得后面所有的位置参数
  • ${@:起点:个数} 由起点开始,取得指定个数的位置参数
  • $# 表示命令行中所有参数的个数
  • $? 命令或程序执行完后的状态,一般返回0表示执行成功

例:

1
2
3
4
5
6
7
8
9
10
11
12
#在hello.sh中
echo "参数个数为$#"
echo "第一个参数是$1"
echo "第二个位置开始数据${@:2}"
echo "第一个位置开始两个数据${@:1:2}"
------------------------------
#执行hello.sh
sh hello.sh 1 2 3
参数个数为3
第一个参数是1
第二个位置开始数据2 3
第一个位置开始两个数据1 2

bash中的特殊符号

符号 含义
‘’ 单引号 在单引号中所有的特殊字符都没有特殊含义
“” 双引号 双引号中$ `(反引) \ 有特殊含义,分别是调用变量的值、引用命令、转义符
`` 反引号 反引号中的是系统命令,在bash中会优先执行
$() 和反引号作用一样,用于引用命令,不过推荐使用该命令,因为反引号不明显
() 用于一串命令的执行,会在子shell中运行,括号内容仅在括号内生效,多条命令使用;隔开
{} 用于一串命令的执行,会在当前shell中执行,也可用于变量变形和替换,多条命令使用;隔开
[] 用于变量的测试
# #开头代表注释
$ 用于调用变量的值
\ 转义

skiplist实现

skiplist跳跃表,是一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针,来达到快速访问节点的目的,redis使用skiplist作为zsort的底层实现之一

结构很像树形结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct zskiplistNode {
// 对象
sds ele;
// 分值
double score;
// 后退指针,从表尾向表头方向的访问及诶按
struct zskiplistNode *backward;
// 层 数组中可以包含多个元素,每个元素都包含一个指向其他节点的指针
struct zskiplistLevel {
// 前进指针,从表头向表尾方向访问节点
struct zskiplistNode *forward;
// 跨度,记录两个节点间的距离,跨度值是两个节点score的差值
unsigned long span;
} level[];
} zskiplistNode;

typedef struct zskiplist {
// 头尾节点
struct zskiplistNode *header, *tail;
// 跳跃表的长度
unsigned long length;
// 记录目前跳跃表的深度(表头节点的层数不计算在内)
int level;
} zskiplist;