2. 总结索引数组和关联数组,字符串处理,高级变量使用及示例。
索引:
索引的编号从
0
开始,属于数值索引
索引可支持使用自定义的格式,而不仅是数值格式,即为
关联索引
,
bash 4.0
版本之后开始支持
bash
的数组支持稀疏格式(索引不连续)
关联数组:
注意:关联数组必须先声明再调用
declare -A ARRAY_NAME
ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘...)
#
普通数组可以不事先声明
,
直接使用
declare
-a
ARRAY_NAME
#
关联数组必须先声明
,
再使用
declare
-A
ARRAY_NAME
注意:两者不可相互转换
字符串处理:
字符串切片-基于偏移量取字符串
:
#返回字符串变量var的字符的长度,一个汉字算一个字符
${#var}
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,
offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset}
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
${var:offset:number}
#取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
${var: -length}
#从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
${var:offset:-length}
#先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-
length前空格,并且length必须大于offset
${var: -length:-offset}
范例:
[root@localhost ~]# str=123456789
[root@localhost ~]# echo ${#str}
9
[root@localhost ~]# echo ${str:2}
3456789
字符串切片-
基于模式取子串:
#其中word可以是指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字
符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右
${var#*word}
#从var变量的值中删除以word开头的部分
${var#word}
#同上,贪婪模式,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容,即贪婪模
式,以最后一个word为界删左留右
${var##*word}
${var##word}
#其中word可以是指定的任意字符,功能:自右而左,查找var变量所存储的字符串中,第一次出现的word,
删除字符串最后一个字符向左至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以从右向左的第
一个word为界删右留左
${var%word*}
${var%word}
#同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符,即贪婪模式,以从右向
左的最后一个word为界删右留左
${var%%word*}
${var%%word}
高级变量赋值:
高级变量用法
-
有类型变量
Shell
变量一般是无类型的,但是
bash Shell
提供了
declare
和
typeset
两个命令用于指定变量的类型,两个命令是等价的。
declare [选项] 变量名
选项:
-r 声明或显示只读变量
-i 将变量定义为整型数
-a 将变量定义为数组
-A 将变量定义为关联数组
-f 显示已定义的所有函数名及其内容
-F 仅显示已定义的所有函数名
-x 声明或显示环境变量和函数,相当于export
-l 声明变量为小写字母 declare -l var=UPPER
-u 声明变量为大写字母 declare -u var=lower
-n make NAME a reference to the variable named by its value
3. 求10个随机数的最大值与最小值。
[root@localhost data]# cat random_mix_or_max.sh
#!/bin/bash
declare -i min max
declare -a nums
for ((i=0;i<10;i++));do
nums[$i]=$RANDOM
[ $i -eq 0 ] && min=${nums[0]} && max=${nums[0]} && continue
[ ${nums[$i]} -gt $max ] && max=${nums[$i]} && continue
[ ${nums[$i]} -lt $min ] && min=${nums[$i]}
done
echo "All numbers are ${nums[*]}"
echo Max is $max
echo Min is $min
[root@localhost data]# . random_mix_or_max.sh
All numbers are 17412 13765 21528 17397 15326 16550 7531 14570 10271 14991
Max is 21528
Min is 7531
3. 解析进程和线程的区别?
- 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
- 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进 程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
- 调度和切换:线程上下文切换比进程上下文切换要快得多。
5. 解析磁盘中的代码如何在计算机上运行的?
6. 总结OOM原理,及处理方法。
OOM
即
Out Of Memory
,
“
内存用完了
”,
在情况在
java
程序中比较常见。系统会选一个进程将之杀死。
在日志
messages中看到类似下面的提示:
Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child
当
JVM
因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个 error,因为这个问题已经严重到不足以被应用处理)。
原因:
给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的
VM
参数指定)太少。
应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
使用的解决办法:
1
,限制
java
进程的
max heap
,并且降低
java
程序的
worker
数量,从而降低内存使用
2
,给系统增加
swap
空间
设置内核参数(不推荐),不允许内存申请过量:
echo 2 > /proc/sys/vm/overcommit_memory
echo 80 > /proc/sys/vm/overcommit_ratio
echo 2 > /proc/sys/vm/panic_on_oom
8. 说明IPC通信和RPC通信实现的方式。
IPC: Inter Process Communication 进程间通信
pipe 管道,单向传输
socket 套接字文件,双工通信
Memory-maped file 文件映射,将文件中的一段数据映射到物理内存,多个进程共享这片内存
shm shared memory 共享内存
signal 信号
Lock 对资源上锁,如果资源已被某进程锁住,则其它进程想修改甚至读取这些资源,都将被阻塞,直到锁被打开
semaphore 信号量,一种计数器
不同主机:
socket=IP
和端口号
RPC:remote procedure call 远程过程调用
MQ 消息队列,生产者和消费者,如:Kafka,RabbitMQ,ActiveMQ
9. 通过mkfifo, cat, 来解释秒杀的并发问题,如何通过队列解决的?最好结合图形。说明消息队列的作用?
10. 总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换。
前台作业:通过终端启动,且启动后一直占据终端
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
让作业运行于后台:
运行中的作业: Ctrl+z
尚未启动的作业: COMMAND &
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系。
nohup COMMAND &>/dev/null &
screen;COMMAND
tmux;COMMAND
查看当前终端所有作业: jobs
[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (14.119.104.254) 56(84) bytes of data.
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=1 ttl=128 time=23.4 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=2 ttl=128 time=41.7 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=3 ttl=128 time=38.6 ms
^Z
[2]+ Stopped ping www.baidu.com
[root@localhost ~]# jobs
[1]- Stopped ping www.baidu.com
[2]+ Stopped ping www.baidu.com
[root@localhost ~]#