Sy6 编辑器vi的应用(+shell脚本3例子)

实验环境:

宿主机为win11,网络:10.255.50.5 6389

WSL2 ubuntu

目标机的OS:Ubuntu 内核、版本如下:

linux@peggy0223:/$ uname -r

5.15.146.1-microsoft-standard-WSL2

linux@peggy0223:/$ cat /proc/version

Linux version 5.15.146.1-microsoft-standard-WSL2 (root@65c757a075e2) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37) #1 SMP Thu Jan 11 04:09:03 UTC 2024

实验6 编辑器 vi的应用

1.实验目的

  1. 掌握编辑器vi的基本用法。
  2. 练习编写简单的shell程序。

2.vi的常用命令

操作命令简介:

Ctrl+D:窗口向下移动半屏。

Ctrl+U:窗口向上移动半屏。

Ctrl+F:翻至前一屏。

Ctrl+B:翻至后一屏。

k(或个):光标上移一行。

j(或!):光标下移一行。

1(或→):光标右移一行。

h(或一):光标左移一行。

Enter:光标移到下一行的开始。

-(减号):光标移到前一行的开始。

W:光标移到下一词的前端。

B:光标移到前一词的前端。

~或0(零):光标移到当前行的前端。

$:光标移到当前行的后端。

A:在光标后立即插入文本。

0:当前行后紧接着开辟一新行。

0(大写字母O):当前行前紧接着开辟一新行。

X:删除光标下的字符。

ndw:删除光标所在词及其后面的n-1个词(包括词后的空格)。D:从光标处删除到行未。

d:从光标处删除到行开始。

ndd:删除光标所在行及其后的n-1行。

U:取消前一次变更。

/字符串:查找字符串。

:w;存盘。

:q:不存盘退出。

:q!:强行退出。

:wq:存盘退出。

:help:显示帮助信息。

:set number:显示行号。

3.实验内容

  1. 复制/ete/passwd文件到自己的目录下。
  2. 用vi操作命令练习编辑复制后的passwd文件。
  3. 用vi操作命令练习编辑以下shell文件:

①大九九乘法表;

②小九九乘法表;

③交互式成批添加用户。

4.实验报告

以书面形式记录下每一个实验内容、编写的源程序,说明程序调试中遇到的问题和解决方法。

5. 思考题

  1. 编辑器vi有几种工作模式?
  2. 说明实现成批添加用户的原理?

实验记录:

ps注意,脚本文件建议以sh后缀名结尾,这样vi等编辑器会自动识别一些命令和字符,若是使用txt或者无后缀名则不会有提示(vi下是不同颜色提示和成对的符号匹配)。

S1、

 

在Linux环境下,我们可以使用vi/vim编辑器来创建并编写一个简单的shell脚本,该脚本可以输出大九九乘法表。以下是具体步骤:

当然,这里是一个使用Bash shell脚本实现九九乘法表的简单例子,采用嵌套循环:

```bash

#!/bin/bash

# 使用嵌套for循环

for ((i=1; i<=19; i++))

do

    for ((j=1; j<=i; j++))

    do

        # 计算乘积并格式化输出

        result=$((i*j))

        printf "%2d * %2d = %2d\t" $j $i $result

    done

    # 结束一行后换行

    echo

done

```

当你运行这个脚本时,它会按照九九乘法表的形式逐行打印出1到9的乘法运算结果。`printf`命令在这里用于格式化输出,`%2d` 表示至少占两位宽度的整数,`%2d * %2d = %2d\t` 是指每部分都至少占用两位,且末尾跟随一个制表符用于列对齐。每完成一行内部循环后,外部循环的`echo`命令将打印一个新行,从而实现乘法表的结构布局。

这样你就成功使用vi编辑器创建并运行了一个能输出大九九乘法表的shell脚本了。

S2、

基于上述信息,我们可以给出一个简单的Bash shell脚本来实现九九乘法表。以下是脚本的一个示例:

```bash

#!/bin/bash

# 方法一:使用两个嵌套的for循环

for ((i=1; i<=9; i++))

do

    for ((j=1; j<=i; j++))

    do

        # 使用let命令进行乘法计算,并用echo -n输出不换行的结果

        let result=i*j

        echo -n "$i*$j=$result\t"

    done

    # 在每行结束后输出一个换行符

    echo

done

```

当你保存这个脚本到一个名为`multiplication_table.sh`的文件中,并赋予它执行权限后(例如:`chmod +x multiplication_table.sh`),可以通过运行`./multiplication_table.sh`来执行它,将会得到以下输出:

```

1*1=1        

1*2=2        2*2=4        

1*3=3        2*3=6        3*3=9        

1*4=4        2*4=8        3*4=12        4*4=16        

...

9*8=72        9*9=81        

```

这个脚本利用了两层for循环,外层循环变量`i`从1遍历到9,内层循环变量`j`也从1开始但不超过`i`,这样可以确保每一行只打印出从1到当前行数的乘积。每次计算结果后,用`echo -n`命令不换行地输出结果,并在每个结果后面加上制表符`\t`用于对齐。当内层循环结束时,外层循环的`echo`命令会输出一个换行符,从而形成新的一行。

S3、

以下是一个简单的Shell脚本示例,用于交互式地批量添加用户。在这个脚本中,它会循环询问用户输入用户名和密码,直到用户不再想添加更多用户为止。

```bash

#!/bin/bash

while true

do

    echo "请输入要创建的用户名(或按q退出):"

    read username

    # 如果输入q,则退出循环

    if [ "$username" = "q" ]; then

        break

    fi

    # 提示输入用户密码

    echo "请输入用户的密码:"

    read -s password

    echo ""

    # 创建新用户并设置密码

    useradd $username

    echo "$password" | passwd --stdin $username   #ubuntu2204passwd不支持--stdin选项

    echo "$password" | sudo chpasswd username    #替代选项命令!已经验证ok

    # 检查添加用户是否成功

    if [ $? -eq 0 ]; then

        echo "用户 '$username' 已成功创建。"

    else

        echo "创建用户 '$username' 失败,请检查输入或系统权限。"

    fi

    echo ""

done

echo "已结束添加用户。"

```

**注意**:

- 此脚本需要在具有相应权限的环境中运行,因为`useradd`和`passwd`命令通常需要root权限。

- 密码输入时,使用了`-s`选项使passwd命令在读取密码时不显示输入内容。

- `echo "$password" | passwd --stdin $username`这条命令将密码通过管道传递给passwd命令,以非交互方式设置密码。

- 使用`$?`来获取上一条命令(在这里是`useradd`或`passwd`)的退出状态,如果为0则表示命令执行成功。

Ps,清空文本文件或者脚本文件方法:

第一种使用 > filename ;

第二种使用 cat /dev/null  > filename ;

第三种使用 echo “” > filename ;这种是出现一个空格行效果。

分别如下:

第四种使用 truncate -s 0 filename.txt ;

truncate是一个专门用来截断文件的命令,它可以将文件截断到指定长度,如果指定长度为0,则可以清空文件内容。

第五种使用 dd if=/dev/null of=filename.txt

dd命令是一个非常强大的命令,它可以用来复制文件、转换文件格式等操作,但是它也可以用来清空一个文件。

如下操作:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Blockchain】区块 | 节点 | 共识机制 | 公链 | 联盟链 | 以太坊 | DApp | 智能合约

Blockchain 初识区块链区块链是什么什么是区块什么是节点什么是分布式什么是共识机制工作量证明(Proof of Work, PoW)权益证明(Proof of Stake, PoS)历史证明(Proof of History, PoH)权威证明(Proof of Authority, PoA)信誉共识(Proof of Reputation, PoR)存储证明(Proof of St…

【3DsMax+Pt】练习案例

目录 一、在3DsMax中展UV 二、在Substance 3D Painter中绘制贴图 一、在3DsMax中展UV 1. 首先创建如下模型 2. 选中如下三条边线作为接缝 重置剥 发现如下部分还没有展开 再选一条边作为接缝 再次拨开 拨开后的UV如下 二、在Substance 3D Painter中绘制贴图 1. 新建项目&am…

C++AVL树拓展之红黑树原理及源码模拟

前言&#xff1a;我们之前已经从零开始掌握AVL树http://t.csdnimg.cn/LaVCChttp://t.csdnimg.cn/LaVCC 现在我们将继续学习红黑树的原理并且实现插入等功能&#xff0c;学习本章的前提要求是掌握排序二叉树和AVL树&#xff0c;本章不再提及一些基础知识&#xff0c;防止本文结…

国产数据库中统计信息自动更新机制

数据库中统计信息描述的数据库中表和索引的大小数以及数据分布状况&#xff0c;统计信息的准确性对优化器选择执行计划时具有重要的参考意义。本文简要整理了下传统数据库和国产数据库中统计信息的自动更新机制&#xff0c;以加深了解。 1、数据库统计信息介绍 优化器是数据库…

纯小白蓝桥杯备赛笔记--DAY5(竞赛常用库函数)

文章目录 大小写转换islower和isupper&#xff1a;检查一个字符是否是小写或者大写。Tolower和toupper函数&#xff1a;ASCII码&#xff1a; 二分查找二分查找的前提&#xff1a;库函数只能对数组进行二分查找&#xff0c;且数组中的元素是单调的。binary_search函数&#xff1…

【C++第五课-C/C++内存管理】C/C++的内存分布、new/delete、new和delete的实现原理

目录 C/C的内存分布new/deletenew内置类型使用new自定义类型使用newnew失败 delete内置类型使用delete自定义类型使用delete new和delete的实现原理new[] 和delete[]的补充知识 定位new&#xff08;了解&#xff09;常见面试题 C/C的内存分布 频繁的new/delete堆容易产生内存碎…

【数据处理包Pandas】DataFrame数据的基本操作

目录 一、DataFrame数据的查询&#xff08;一&#xff09;查询单行数据&#xff08;二&#xff09;查询多行数据&#xff08;三&#xff09;查询列数据&#xff08;四&#xff09;查询指定的行列数据 二、DataFrame数据的编辑&#xff08;一&#xff09;增加数据&#xff08;二…

拦截器未生效的问题

记录一下自己出现的一个问题 配置好拦截器后 protected void addInterceptors(InterceptorRegistry registry) {log.info("开始注册自定义拦截器...");registry.addInterceptor(jwtTokenUserInterceptor).addPathPatterns("/**").excludePathPatterns(&q…

【Java 多线程】从源码出发,剖析Threadlocal的数据结构

文章目录 exampleset(T value)createMap(t, value);set(ThreadLocal<?> key, Object value)ThreadLocalMap和Thread的关系 全貌 ThreadLocal是个很重要的多线程类&#xff0c;里面数据结构的设计很有意思&#xff0c;很巧妙。但是我们平时使用它的时候常常容易对它的使用…

怎么开发高可靠、能处理多种复杂问题、处理各种异常情况的爬虫程序

开发高可靠、能处理多种复杂问题、处理各种异常情况的爬虫程序是一个综合性的任务&#xff0c;涉及多个方面的技术和策略。以下是一些关键步骤和最佳实践&#xff0c;可以帮助你实现这样的爬虫程序&#xff1a; 明确需求和目标&#xff1a; 在开始编写代码之前&#xff0c;明确…

图片转换成base64如何在html文件中使用呢

在HTML文件中使用Base64编码的图片非常简单。Base64编码是一种将二进制数据转换为ASCII字符串的方法,这使得可以直接在网页上嵌入图片数据,而无需引用外部图片文件。以下是如何在HTML中使用Base64编码的图片的步骤: 步骤 1: 将图片转换为Base64编码 首先,你需要将图片文件…

Photoshop笔记大全

文章目录 PS常用快捷键Shift+工具代码PS名词解释PS影子制作PS图像优化PS常用快捷键 Ctrl+R:调出标尺 Ctrl+T:调整变形。拖动时,按住ctrl键,任意变形。按住Shift键,等比例变形。按Esc键,恢复。 Alt+delete:前景色填充 Ctrl+delete:背景色填充 ctrl+x:剪切 ctrl+v…

WPF+Prism 模块化编程(一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 WPFPrism 模块化编程&#xff08;一&#xff09; 一、Prism项目创建安装二、将项目升级为Prism项目三、将Prism项目升级为支持模块化编程项目 一、Prism项目创建安装 1、新建…

四道题搞懂二叉树深度

二叉树的最大深度&#xff08;LeetCode104&#xff09; 先表示左树的深度&#xff0c;再表示右树的深度。再进行条件判断 class solution {public int maxDepth(TreeNode root) {if (root null) {return 0;}int leftDepth maxDepth(root.left);int rightDepth maxDepth(ro…

zookeeper常见命令详解2

1、version 展示客户端版本 [zkshell: 1] version ZooKeeper CLI version: 3.6.0-SNAPSHOT-29f9b2c1c0e832081f94d59a6b88709c5f1bb3ca, built on 05/30/2019 09:26 GMT2、whoami 展示出所有已经添加&#xff08;addauth&#xff09;用户的信息 [zkshell: 1] whoami Auth sch…

JAVA面试大全之集合IO篇

目录 1、集合 1.1、Collection 1.1.1、集合有哪些类? 1.1.2、ArrayList的底层?

算法系列--动态规划--特殊的状态表示--分析重复子问题

&#x1f495;"轻舟已过万重山!"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–算法系列–动态规划–特殊的状态表示–分析重复子问题 大家好,今天为大家带来的是算法系列--动态规划--特殊的状态表示--分析重复子问题 一.组合总数IV 链接…

蓝桥集训之游戏

蓝桥集训之游戏 核心思想&#xff1a;博弈论 区间dp 设玩家1的最优解为A 玩家2的最优解为B 1的目标就是使A-B最大 2的目标就是使B-A最大 当玩家1取L左端点时 右边子区间结果就是玩家2的最优解B-A 即当前结果为w[L] – (B-A) 当玩家1取R右端点时 左边子区间结果就是玩家2的最…

Mybatis-特殊SQL的执行

1. 模糊查询 在MyBatis中进行模糊查询时&#xff0c;有以下三种常见的实现方式&#xff1a; 1.1. 错误示范 先来个准备操作&#xff0c;并做一个错误示例 根据姓名&#xff0c;模糊查询用户&#xff0c;(x小x) 更新数据表 SQLMapper.java package com.sakurapaid.mybatis3…

力扣top100-两数之和

思路&#xff1a; 用 hashMap 存储遍历过的元素和对应的索引。 每遍历一个元素&#xff0c;看看 hashMap 中是否存在满足要求的目标数字。 所有事情在一次遍历中完成&#xff08;用了空间换取时间&#xff09;。 // twoSum 函数接受一个整数数组 nums 和一个目标值 target&am…