当前位置: 首页 > news >正文

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命令是一个非常强大的命令,它可以用来复制文件、转换文件格式等操作,但是它也可以用来清空一个文件。

如下操作:

相关文章:

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

实验环境&#xff1a; 宿主机为win11&#xff0c;网络&#xff1a;10.255.50.5 6389 WSL2 ubuntu 目标机的OS&#xff1a;Ubuntu 内核、版本如下&#xff1a; linuxpeggy0223:/$ uname -r 5.15.146.1-microsoft-standard-WSL2 linuxpeggy0223:/$ cat /proc/version Linux vers…...

把标注数据导入到知识图谱

文章目录 简介数据导入Doccano标注数据&#xff0c;导入到Neo4j寻求帮助 简介 团队成员使用 Doccano 标注了一些数据&#xff0c;包括 命名实体识别、关系和文本分类 的标注的数据&#xff1b; 工作步骤如下&#xff1a; 首先将标注数据导入到Doccano&#xff0c;查看一下标注…...

【前端基础】什么是类数组对象,类数组对象转换成数组的方法

类数组对象&#xff08;array-like object&#xff09;是指在 JavaScript 中具有类似数组的特征但不是真正的数组的对象。这些对象具有类似数组的特性&#xff0c;例如有一个 length 属性和通过索引访问元素的能力&#xff0c;但它们不具备数组对象的所有方法和特性。 什么是类…...

Python快速入门系列-8(Python数据分析与可视化)

第八章:Python数据分析与可视化 8.1 数据处理与清洗8.1.1 数据加载与查看8.1.2 数据清洗与处理8.1.3 数据转换与整理8.2 数据可视化工具介绍8.2.1 Matplotlib8.2.2 Seaborn8.2.3 Plotly8.3 数据挖掘与机器学习简介8.3.1 Scikit-learn8.3.2 TensorFlow总结在本章中,我们将探讨…...

双非硕转测试之Java学习笔记(一):集合

Java学习-----集合 简单概括单列集合--collectionlist接口&#xff1a;vector类&#xff1a;LinkedList类&#xff1a;set接口&#xff1a;HasSet类&#xff1a;LinkedHashSet类&#xff1a; 双列集合--MapMap接口&#xff1a;HashMap类&#xff1a;HashTable类&#xff1a;Pro…...

zabbix源码安装

目录 一.安装php和nginx客户端环境 二.修改php配置 三.修改nginx配置文件 四.下载并编译zabbix 五.创建zabbix需要的用户及组 六.安装编译需要的依赖 七.配置zabbix文件 八.数据库配置 九.配置zabbix 十.web界面部署 十一.遇到无法创建配置文件 十二.登录zabbix 前…...

计算机视觉之三维重建(5)---双目立体视觉

文章目录 一、平行视图1.1 示意图1.2 平行视图的基础矩阵1.3 平行视图的极几何1.4 平行视图的三角测量 二、图像校正三、对应点问题3.1 相关匹配法3.2 归一化相关匹配法3.3 窗口问题3.4 相关法存在的问题3.5 约束问题 一、平行视图 1.1 示意图 如下图即是一个平行视图。特点&a…...

计算机网络-TCP/IP 网络模型

TCP/IP网络模型各层的详细描述&#xff1a; 应用层&#xff1a;应用层为应用程序提供数据传输的服务&#xff0c;负责各种不同应用之间的协议。主要协议包括&#xff1a; HTTP&#xff1a;超文本传输协议&#xff0c;用于从web服务器传输超文本到本地浏览器的传送协议。FTP&…...

算法训练营第29天|LeetCode 491.递增子序列 46.全排列 47.全排列Ⅱ

LeetCode 491.递增子序列 题目链接&#xff1a; LeetCode 491.递增子序列 解题思路&#xff1a; 用哈希集合进行去重&#xff0c;同一树层不能取重复元素。 代码&#xff1a; class Solution { public:vector<vector<int>>result;vector<int>path;void…...

Ubuntu服务器搭建 - 环境篇

Ubuntu服务器搭建 - 环境篇 基于腾讯云服务器 - Ubuntu 20.04 LTS 一、安装 - MySQL 1.1 概述 MySQL安装方式有三种: 1. 使用Ubuntu 包管理工具 apt安装 2. 使用MySQL官方APT存储库安装 3. 使用MySQL官方二进制发行版安装 1.2 安装 MySQL 使用MySQL官方APT存储库安装 $ wget…...

深度学习基础模型之Mamba

Mamba模型简介 问题&#xff1a;许多亚二次时间架构(运行时间复杂度低于O(n^2)&#xff0c;但高于O(n)的情况)&#xff08;例如线性注意力、门控卷积和循环模型以及结构化状态空间模型&#xff08;SSM&#xff09;&#xff09;已被开发出来&#xff0c;以解决 Transformer 在长…...

Topaz Video AI for Mac v5.0.0激活版 视频画质增强软件

Topaz Video AI for Mac是一款功能强大的视频处理软件&#xff0c;专为Mac用户设计&#xff0c;旨在通过人工智能技术为视频编辑和增强提供卓越的功能。这款软件利用先进的算法和深度学习技术&#xff0c;能够自动识别和分析视频中的各个元素&#xff0c;并进行智能修复和增强&…...

解决WordPress文章的段落首行自动空两格的问题

写文章时&#xff0c;段落首行都会空两格&#xff0c;可是WordPress自带的编辑器却没有考虑到这一点&#xff0c;导致发布的文章首行都是顶格的&#xff0c;看起来很不习惯。 我们通常的解决方法都是在发布文章时把编辑器切换到“文本”模式&#xff0c;然后再在首行手动键入两…...

RISC-V单板计算机模拟和FPGA板多核IP实现

&#x1f3af;要点 &#x1f3af;使用单板计算机 Visionfive 2 或模拟器测试RISC-V汇编&#x1f3af;RISC-V汇编加载和算术。&#x1f3af;使用GNU MAKE汇编RISC-V指令&#xff0c;ESP32使用CMake编译执行指令。&#x1f3af;RISC-V汇编功能和使用释义&#xff1a;控制指令&am…...

Mojo编程语言案例及介绍

Mojo是一种新兴的编程语言&#xff0c;它结合了现代编程范式与简洁易读的语法&#xff0c;为开发者提供了一个强大且高效的开发工具。以下将详细介绍Mojo编程语言的特性&#xff0c;并通过一个实际案例来展示Mojo的应用。 一、Mojo编程语言介绍 Mojo编程语言的设计理念是“简单…...

【Python面试题收录】Python中有哪些方法交换两个变量的值?至少给出三种方法。

一、使用临时变量 # 定义原始变量 a 10 b 20# 直接交换&#xff0c;Python会一次性执行两个赋值操作 a, b b, a# 无需额外变量&#xff0c;a 和 b 的值已经交换 print(a) # 输出: 20 print(b) # 输出: 10 二、利用元组解包特性&#xff08;不使用临时变量&#xff0c;推荐…...

MySQL核心命令详解与实战,一文掌握MySQL使用

文章目录 文章简介演示库表创建数据库表选择数据库删除数据库创建表删除表向表中插入数据更新数据删除数据查询数据WHERE 操作符聚合函数LIKE 子句分组 GROUP BY HAVINGORDER BY(排序) 语句LIMIT 操作符 分页查询多表查询-联合查询 UNION 操作符多表查询-连接的使用-JOIN语句编…...

基于Springboot + MySQL + Vue 大学新生宿舍管理系统 (含源码)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; 管理员信息属性 &#x1f4ac; 学生信息实体属性 &#x1f4ac; 宿舍安排信息实体属性 &#x1f4ac; 卫生检查信息实体属性 &…...

vulnhub pWnOS v2.0通关

知识点总结&#xff1a; 1.通过模块来寻找漏洞 2.msf查找漏洞 3.通过网站源代码&#xff0c;查看模块信息 环境准备 攻击机&#xff1a;kali2023 靶机&#xff1a;pWnOS v2.0 安装地址&#xff1a;pWnOS: 2.0 (Pre-Release) ~ VulnHub 在安装网址中看到&#xff0c;该靶…...

leetcode热题100.数据流的中位数

作者&#xff1a;晓宜 &#x1f308;&#x1f308;&#x1f308; 个人简介&#xff1a;互联网大厂Java准入职&#xff0c;阿里云专家博主&#xff0c;csdn后端优质创作者&#xff0c;算法爱好者 ❤️❤️❤️ 你的关注是我前进的动力&#x1f60a; Problem: 295. 数据流的中位数…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...