N74023 第四周

Posted liutf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了N74023 第四周相关的知识,希望对你有一定的参考价值。

1. 总结脚本高级命令trap, install, mktemp, expect,
1) trap trap命令可以捕捉信号,修改信号原来的功能,实现自定义功能
trap [-lp] [[arg] signal_spec ...]


#列出所有信号
trap -l

#进程收到系统发出的指令后,执行自定义指令,而不会执行原操作
trap \'触发指令\' 信号

#忽略信号的操作
trap \'\' 信号

#恢复原信号的操作
trap \'-\' 信号

#列出自定义信号操作
trap -p


joke.sh

```
trap \'echo 删除根系统,不能中断\' 2
while true;do
echo "正在删除根系统中,请稍后"
sleep 1
done
```

#当脚本退出时,执行finish函数
trap finish EXIT

finish.sh finish 函数,使程序退出的时候,出于安全,干净的状态

```
finish ()
echo "finish at `date +%F_%T`" |tee -a /root/finish.log

trap finish exit

while true ;do
echo running
sleep 1
done


2) install

​把文件复制过来并加权限

```
install [OPTION]... [-T] SOURCE DEST
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...
```

选项:

```
-m MODE,默认755
-o OWNER 更改所有者
-g GROUP 更改组
-d DIRNAME 目录
```

例子

```
[root@Rocky data]# install /etc/hosts /data/hosts
[root@Rocky data]# ll /data/hosts
-rwxr-xr-x. 1 root root 158 Apr 4 17:34 /data/hosts

[root@Rocky data]# install -m 600 -o liu -g bin /etc/hosts /data/hosts

[root@Rocky data]# install -d /data/etc
相当于mkdir
```

 

 

3)mktemp 创建并显示临时文件,可避免冲突
mktemp [OPTION]... [TEMPLATE]
说明:TEMPLATE:filenameXXX,X至少出现三个

常见选项

```
-d 创建临时文件夹
```

例子

```
[root@Rocky data]# mktemp testXXX
test3Vx

temp_file=$(mktemp testXXXXXX.log)
[root@Rocky data]# echo $temp_file
testTSBY3C.log

#临时文件夹
[root@Rocky data]# mktemp -d /data/trashXXXXX
/data/trashPuuWa
```

实现文件垃圾箱

```
rm.sh

DIR=`mktemp -d /tmp/trash-$(date +%F_%H-%M-%S)XXXXXX`
mv $* $DIR
echo $* in move to $DIR

[root@Rocky data]# chmod +x /data/rm.sh
[root@Rocky data]# alias rm=/data/rm.sh
[root@Rocky data]# rm hello.sh
hello.sh in move to /tmp/trash-2023-04-04_17-10-41S14FFZ
[root@Rocky data]# ls /tmp/
trash-2023-04-04_17-10-41S14FF

[root@Rocky data]# function rm () local trash=`mktemp -d /tmp/trashXXXXX`;mv $* $trash;
[root@Rocky data]# rm test307

[root@Rocky data]# function rm () local trash=`mktemp -d /tmp/trash$(date +%F_%H-%M-%S)XXXXX`;mv $* $trash;
[root@Rocky data]# rm test3Vx

删函数,unset 函数名
```


2. 总结索引数组和关联数组,字符串处理,高级变量使用及示例。

##### 一次只赋值一个元素

```
ARRAY_NAME[INDEX]=VALUE
```

例子

```
weekdays[0]="Sunday"
weekdays[4]="Thursday"
```

##### 一次赋值全部元素

```
ARRAY_NAME=("VAL1" "VAL2" "VAL3" ...)
```

例子

```
title=("ceo" "coo" "cto")
num=(0..10)
alpha=(a..g)
file=( *.sh )
```

##### 只赋值特定元素(稀疏格式)

```
ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)
```

##### 交互式赋值

```
read -a ARRAY
```

例子

```
[root@Rocky8 ~]#read -a car
benz audi bmw

[root@Rocky8 ~]#echo $car[2]
bmw
[root@Rocky8 ~]#echo $car[1]
audi
```

##### 关联数组的定义

#关联数组必须先声明,不然容易导致混乱

```
[root@Rocky8 ~]#n74[birth]="2023.2.26"
[root@Rocky8 ~]#n74[num]=49
[root@Rocky8 ~]#n74[classroot]=room3
[root@Rocky8 ~]#n74[monitor]=zhangzong

#没有提前声明,导致查不到准确信息
[root@Rocky8 ~]#echo $n74[@]
zhangzong 49
[root@Rocky8 ~]#echo $n74[*]
zhangzong 49
[root@Rocky8 ~]#echo $n74[num]
49

[root@Rocky8 ~]#declare -A n74
-bash: declare: n74: cannot convert indexed to associative array
[root@Rocky8 ~]#unset n74

[root@Rocky8 ~]#declare -A n74
[root@Rocky8 ~]#n74[birth]="2023.2.26"
[root@Rocky8 ~]#n74[num]=49
[root@Rocky8 ~]#n74[classroot]=room3
[root@Rocky8 ~]#n74[monitor]=zhangzong
[root@Rocky8 ~]#echo $n74[*]
2023.2.26 zhangzong room3 49
[root@Rocky8 ~]#echo $n74[0]

[root@Rocky8 ~]#echo $n74[num]
49
[root@Rocky8 ~]#echo $n74[classroot]
room3
```

 

### 1.字符串处理

#### 1.1字符串切片

##### 1.1.1 基于偏移量取字符串

#定义一个字符串
[root@Rocky ~]# var=abcde
[root@Rocky ~]# echo $#var
5

#取的是字符长度,不是字节长度
[root@Rocky ~]# var=abcde我
[root@Rocky ~]# echo $#var
6

[root@Rocky ~]# echo $var:2
cde我
[root@Rocky ~]# echo $var:3
de我
[root@Rocky ~]# echo $var:2:2
cd
#: -,取倒数第几个
[root@Rocky ~]# echo $var: -2
e我

#抛头去尾
[root@Rocky ~]# echo $var:2:-2
cd

#取后边四个,然后再去除后两个
[root@Rocky ~]# echo $var: -4:-2
cd


##### 1.1.2 基于模式取子串

#以#*后边字符为界,删左留右
[root@Rocky ~]# url=http://www.magedu.org:8080/index.html
[root@Rocky ~]# echo $url#*mage
du.org:8080/index.html

[root@Rocky ~]# echo $url#*:
//www.magedu.org:8080/index.html

一个#为懒惰模式,##为贪婪模式,找到最后一个对应字符,开始删左留右
[root@Rocky ~]# echo $url##*:
8080/index.html
[root@Rocky ~]# echo $url##*//
www.magedu.org:8080/index.html
[root@Rocky ~]# echo $url##*/
index.html

可以在下载文件的时候,直接取文件名
[root@Rocky ~]# nginx_url=http://nginx.org/download/nginx-1.18.0.tar.gz
[root@Rocky ~]# wget $nginx_url
[root@Rocky ~]# echo $nginx_url##*/
nginx-1.18.0.tar.gz
[root@Rocky ~]# tar xf $nginx_url##*/

 

从右到左的话是

$var%word*

[root@Rocky ~]# echo $url
http://www.magedu.org:8080/index.html
[root@Rocky ~]# echo $url%/*
http://www.magedu.org:8080

两个%%是贪婪模式
[root@Rocky ~]# echo $url%%/*
http:


#### 1.2 搜索替代

[root@Rocky ~]# echo $url
http://www.magedu.org:8080/index.html

[root@Rocky ~]# echo $url/mage/wangge
http://www.wanggedu.org:8080/index.html

sed是对文本文件里的内容做处理
变量的处理用上边这个

#贪婪模式用两条/
[root@Rocky ~]# echo $url//w/b
http://bbb.magedu.org:8080/index.html
[root@Rocky ~]# echo $url//80/90
http://www.magedu.org:9090/index.html

#查找url所表示的字符串中,行首被http所匹配到的字符串,以apt替换之
[root@Rocky ~]# echo $url/#http/apt
apt://www.magedu.org:8080/index.html[root@Rocky ~]# echo $url/%html/en
http://www.magedu.org:8080/index.en

#查找url所表示的字符串中,行首被html所匹配到的字符串,以en替换之
[root@Rocky ~]# echo $url/%html/en
http://www.magedu.org:8080/index.en


#### 1.3 大小写转换

$url^^ 全部小转大
[root@Rocky ~]# echo $url^^
HTTP://WWW.MAGEDU.ORG:8080/INDEX.HTML

#tr也可以实现这个功能
[root@Rocky ~]# echo $url |tr \'a-z\' \'A-Z\'
HTTP://WWW.MAGEDU.ORG:8080/INDEX.HTML

$url.. 全部大转小
```


### 2.高级变量

#### 2.1高级变量赋值

![image-20230406102954888](C:\\Users\\小方哥\\AppData\\Roaming\\Typora\\typora-user-images\\image-20230406102954888.png)

例子

```
#name没有赋值
[root@Rocky ~]# unset name; title=$name-"liu"
[root@Rocky ~]# echo $title
liu

#name是空字符串
[root@Rocky ~]# name=" "; title=$name-"liu"
[root@Rocky ~]# echo $title


#name是非空字符串
[root@Rocky ~]# name="wang"; title=$name-"liu"
[root@Rocky ~]# echo $title
wang
```

 

#### 2.2 高级变量用法-有类型变量

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 变量参考

[root@Rocky ~]# declare -l var=UPPER
[root@Rocky ~]# echo $var
upper

[root@Rocky ~]# declare -u var=lower
[root@Rocky ~]# echo $var
LOWER
```

 

#### 2.3 变量的间接引用

##### 2.3.1 eval 命令

eval 命令首先扫描命令行进行所有的置换,然后再执行该命令 该命令适用于那些一次扫描无法实现其功能的变量,该命令对变量进行两次扫描

```
[root@Rocky ~]# n=10
[root@Rocky ~]# echo 1..$n
1..10

[root@Rocky ~]# eval echo 1..$n
1 2 3 4 5 6 7 8 9 10
```

 

##### 2.3.2 间接变量引用

如果第一个变量的值是第二个变量的名称,从第一个变量引用第二个变量的值就称为间接变量引用 varlable1的值是varlable2,而varlable2 又是变量名,varlable2的值为value,间接变量引用是指通过variable1获得变量值value的行为

```
varlable1=varlable2
varlable2=value

#例子
[root@Rocky ~]# x=y
[root@Rocky ~]# y=n74
[root@Rocky ~]# echo $x
y
[root@Rocky ~]# echo $$x
3948x
[root@Rocky ~]# echo \\$$x
$y
[root@Rocky ~]# eval echo \\$$x
n74

[root@Rocky ~]# echo $!x
n74
```

[root@Rocky ~]# echo $$x
3948x

相当于($$)x,两个$$,代表当前shell的pid的编号

 

 

3. 求10个随机数的最大值与最小值。
vim min_man.sh

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@Rocky ~]# bash min_max.sh
All numbers are 29305 9487 2193 9653 7734 32501 13522 28555 18809 15102
Max is 32501
Min is 2193

 

4. 使用递归调用,完成阶乘算法实现。

fact ()
if [ $1 -eq 0 -o $1 -eq 1 ];then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi

fact 10

 

5. 解析进程和线程的区别?

线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其他进程不可见;
调度和切换:进程上下文谢欢比进程上下文切换要快得多。


6. 解析进程的结构。

进程控制块PCB包含的信息:

●进程id、用户id和组id
●程序计数器
●进程的状态(有就绪、运行、阻塞)
进程切换时需要保存和恢复的CPU寄存器的值
●描述虚拟地址空间的信息
●描述控制终端的信息
●当前工作目录
●文件描述符表,包含很多指向file结构体的指针
●进程可以使用的资源上限(ulimit -a命令可以查看)
●输入输出状态:配置进程使用I/O设备

第四周编程总结

第一题:
选择法排序 (20 分)
本题要求将给定的n个整数从大到小排序后输出。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
4
5 1 7 6
输出样例:
7 6 5 1
实验代码:

include <stdio.h>
include <string.h>
int main() {
int a[10];
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}

int temp;
int index;
for(i=0;i<n;i++){
index=i;
for(j=i+1;j<n;j++){
if(a[j]>a[index]){
index=j;
}
}
temp=a[index];
a[index]=a[i];
a[i]=temp;
}

printf("%d",a[0]);
    for(i=1;i<n;i++){
printf(" %d",a[i]);
 }

return 0;
}

设计思路
1.调用数据
2.定义数组画出程序框图
3.引用for循环,理解排序法的思想
4.打入代码

流程图

编程所遇到的问题
技术图片

解决方法
通过在dev-c++上编译,发现少输入一个for循环语句。
编译结果
技术图片

运行结果截图
技术图片

第二题:找鞍点 (20 分)
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1:
2 1
输入样例2:
2
1 7
4 1

实验代码:
include <stdio.h>
int main()
{
int a[6][6],n;
scanf("%d",&n);
int i,j;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
scanf("%d",&a[i][j]);
}
int k=0,y=0,flag=1,p=0;
if(n==1)
printf("0 0");
else
{
for(i=0; i<n; i++)
{
y=i;
for(p=0; p<n; p++)
{
if(a[i][k]<=a[i][p])
{
k=p;
}
}
for(j=0; j<n; j++)
{
if(a[y][k]>a[j][k])
{
y=j;
break;
}
}
if(i==y)
{
flag=0;
break;
}
}
if(flag==0)
printf("%d %d",i,k);
else
printf("NONE");
}
return 0;
}

设计思路
1.输入变量 i,j.
2.进行for语句循环
3.比较大小.
4.输出结果

流程图

编程过程中所遇到的问题
技术图片

错误的将i=0 ,j=0改成i=1,j=1.

解决方法
在dev-c++上编译得出哪里出现错误。
运行结果截图
技术图片

学习进度条
博客字数 累计代码行
第一周: 0 60
第二周: 280 60
第三周: 260 60
第四周: 380 70

总结:对于解决数组问题还比较茫然,需要更进一步学习。

以上是关于N74023 第四周的主要内容,如果未能解决你的问题,请参考以下文章

第四周学习进度

学习进度——第四周

学习进度条 第四周

第四周学习进度

第四周学习进度情况

第四周学习进度情况