5、vim编辑和shell编程【超详细】

一、vim

1、了解

Vim (Vi IMproved) 是一款功能强大的文本编辑器

  • 正常模式:vim 文件,刚打开的样子
  • vim模式:输入文本的地方
  • 命令模式:输入 :wq等等的位置,可以对文本进行一些操作,比如:保存文本
    在这里插入图片描述

2、使用方法

  • 创建
vim 文件名 //如果没有这个文件,它会自己在当前目录生成
  • 创建好后,它会自己进入编辑里面
    • 你会看到这样的界面
      在这里插入图片描述
  • 进行编辑
先按一下 i 或 a
然后输入文字
输入完后,就按 ESC键 。

在这里插入图片描述
在这里插入图片描述

  • 保存或退出文件
:wq  保存并退出
:q!  强制退出
:q   不保存退出
注意:一定是在英语编辑模式下输入 : 符号

在这里插入图片描述

3、特殊操作

1. 拷贝当前行 (yy ),并粘贴(p)
2. 拷贝当前向下的2行(2yy ) 并粘贴(p)
3. 删除当前行(dd)或 删除当前向下的2行 (2dd)
4. 撤销上一操作 u
5. ctrl+r:反撤销
注意 :是在**正常模式下进行**

在这里插入图片描述

  • yyp
    在这里插入图片描述
  • dd
    在这里插入图片描述
设置行号 :set nu
取消行号 set nonu注意:在命令模式下

在这里插入图片描述
在这里插入图片描述

定位和修改操作切换到正常模式
nG 表示跳到第n行
gg 将光标直接跳到首行位置
0 表示光标移动到 当前行的 行首位置
$ 表示光标移动到 当前行的 行尾位置修改在命令模式下进行:s/string1/string2/g 表示将 当前行 所有的string1更换成string2:%s/string1/string2/g 表示将文本里的所有string1变string2:m,ns/string1/string2/g 表示[m,n]行闭区间内的所有string1更换成string2:/string 查找string

二、什么是shell编程?

1、了解

Shell编程是指利用Shell脚本(Shell Script)自动化执行一系列命令或任务Shell是一种命令行解释器,充当用户与操作系统内核(如Linux/Unix)之间的桥梁,而Shell脚本则是包含多个Shell命令的文本文件,可以批量运行这些命令
在这里插入图片描述


  1. 脚本文件

    • 扩展名通常为.sh(如test.sh),文件开头需指定解释器(如#!/bin/bash)。
    • 通过chmod +x 脚本名.sh赋予可执行权限后,可直接运行(./脚本名.sh)。
  2. 语法特点

    • 变量:存储数据(如name="张三",使用时加$符号,如echo $name)。
    • 条件判断if-elsecase语句(例如判断文件是否存在)。
    • 循环forwhile循环(如遍历文件列表)。
    • 函数:封装重复代码块。
    • 参数传递:通过$1$2获取脚本参数。
  3. 示例脚本

    #!/bin/bash
    echo "你好,世界!"  # 打印文本
    today=$(date)       # 获取当前日期
    echo "今天是:$today"
    

二、shell的编写执行方式

1、第一个shell程序

  • 创建 .sh 后缀的文件 ,并且在文件里写 #!/bin/bash 。运行最好用 ./文件名.sh 【无法直接运行,添加可执行权限给用户】。
注释用
# 
这个是单行:<<!
这个是多行
!
注意:被注释的内容 不要和 注释在同一行
mkdir shellCode //创建目录shellCode
cd shellCode //切换到shellCode
vim hello.sh //编辑 hello.sh
//进入hello.sh文件里面进行编写
#!/bin/bash  //必须输入这个,才能运行
echo "hello world" //echo输出。
//然后运行文件
sh hello.sh  //第一种运行方式//第二种方式
chmod u+x //给u可执行的权限
./hello.sh

在这里插入图片描述

在这里插入图片描述

2、shell变量

Linux 中 Shell 的变量分为系统变量和用户自定义变量。**

2.1、系统变量

  • 系统变量**:$HOME、$PWD、$SHELL、$USER 等等,比如:echo $HOME 等等。我们可以使用set命令显示当前 Shell 中所有变量。
    在这里插入图片描述

2.2、用户变量

  • 用户变量

    • 我们在开发的过程中,可以自定义变量
    • 定义过程:
      • ①定义变量:变量=值【注意等号两侧无空格
      • ②撤销变量:uset 变量
      • ③声明静态变量(不能修改,类似于常量):readonly 变量 【注意该变量不能unset
  • 自定义的变量要用 echo输出时 ,要加 $ 符号

  • 如下图
    在这里插入图片描述

#!/bin/bash
A=100
echo $A 
#或echo A=$A 或echo "A=$A"
echo A=$A 
echo "A=$A"
#然后保存退出vim编辑器
#销毁变量A
unset A
echo "A=$A"
#设置静态变量
readonly B=2
#销毁静态变量
unset B
echo $B# 这时候,就会出现问题,它会提醒,静态变量是只能读不能修改的。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


  • 我们也可以把linux的命令结果赋予给变量
C=`date`
echo $C

在这里插入图片描述


  • linux命令还有一种声明的方式
D=$(date)
echo D=$D

在这里插入图片描述

2.3、设置环境变量

  • 首先要知道设置的 文件是 /etc/profile
  • 基本语法
    • export 变量名=变量值
    • 将shell变量输出为环境变量/全局变量。那样多个脚本都可以使用 .sh 文件。
      在这里插入图片描述
  • source 配置文件:让修改后的配置文件立即失效
  • echo $变量名 :查询环境变量的值

2.5、设置位置参数变量

  • 基本语法
    • $n:n 为数字,$0 代表命令本身,$1~ 9 代表第一到第九个参数,十以上的参数需要用大括号,如 9 代表第一到第九个参数,十以上的参数需要用大括号,如 9代表第一到第九个参数,十以上的参数需要用大括号,如${10}
    • $ ∗ :代表命令行中所有的参数, * :代表命令行中所有的参数, :代表命令行中所有的参数,*把所有的参数看成一个整体
    • $@:代表命令行中所有的参数,不过该命令是把每个参数区分对待
    • $#:代表命令行中所有参数的个数
#!/bin/bash
echo "p0=$0,p1=$1,p2=$2"
echo "$*"
echo "$@"
echo "$#"

在这里插入图片描述

2.6、预定义变量

  • 基本语法
    • $$:当前进程的进程号
    • $!:后台运行的最后一个进程的进程号
    • $?:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确
#!/bin/bash
echo "当前进程号=$$"
echo "最后一个进程号=$!"
echo "上一个命令的返回状态=$?"

3、shell中的运算符

  • 3种写法
1、$((表达式))
2、$[表达式]
3、$(expr m 运算符 n)
注意:expr与运算符之间要有空格。只能有2个操作数,m和n必须是数字 ,数字和运算符之间必须有空格 。

3.1、 第一种 $(())

#!/bin/bash#输出表达式 3*(4+10)
TOTAL=$((3*(4+10)))
echo $TOTAL

在这里插入图片描述

3.2、 第二种【比较老了,可能用不了】

#!/bin/bash
#输出表达式 3*(4+10)
RESULT=$[3*(4+10)]
echo $RESULT

3.3、 第三种 expr

#expr
TEMP=$(expr 10 + 10)
echo "TEMP=$TEMP"

在这里插入图片描述

注意:linux里 乘号是 \* ,在expr里要用这个

  • 传入参数
$(($n运算符$n))
#注意 $0是本身,不用这个

在这里插入图片描述
在这里插入图片描述

4、shell的条件判断

4.1、单个if

  • 基本语法
if [ condition ] 
then满足if语句执行的代码
fi 

注意:condition前后要有空格

4.2、条件判断

  • 常用判读条件

    • 字符串比较
      • 字符串相等"$ str1" = “$ str2”
      • 字符串为空-z “$str”
      • 字符串非空-n “$ str”
      • 字符串不等"$ str1" != “$ str2”
      • str1 小于 str2 (按字典序)“$ str1” < “$ str2”
      • str1 大于 str2 (按字典序)“$str1” > " $ str2"
    • 两个整数的比较
      • 小于:-lt
      • 大于:-gt
      • 小于等于:-le
      • 大于等于:-ge
      • 不等于:-nt
      • 等于:-eq
    • 按照文件权限进行判断
      • 有读的权限:-r
      • 有写的权限:-w
      • 有可执行的权限:-x
    • 按照文件的类型进行判断
      • 文件存在且是常规文件:-f
      • 文件存在:-e
      • 文件存在且是目录:-d
    • 逻辑运算符
      • AND:-a 【只有 [[ condition ]] 才能使用&&
      • OR:-o 【只有[[ condition ]]才能使用 ||
      • NOT:!
    • true和false
      • true 是对
      • false是错
  • 案例1

    • abc 和 cbd 不相等
#!/bin/bash
if [ "abc"!="cbd" ]
thenecho "两个字符串不相等"
fi
  • 案例2
    • 中国人大于18 岁是中国成年人
if [ $age -ge 18 -a "$country" = "CN" ]; thenecho "中国成年人"
fi# 使用 [[ ]] 的更清晰写法 , 这里有&&
if [[ $age -ge 18 && "$country" == "CN" ]]; thenecho "中国成年人"
fi
  • 案例3
    • 查看 a.txt 文件存在 【注意输入的是绝对路径
#!/bin/bash
if [ -f /home/a/shellCode/a.txt ]
thenecho "a.txt存在"
fi
  • 案例4
    • a.txt 的权限是 -r
#!/bin/bash
if [ -r /home/a/shellCode/a.txt ]
thenecho "a.txt的权限是write"
fi
  • 案例5
    • true的使用
#!/bin/bash
if [ true ]
thenecho "true"
fi

4.3、多if-else

  • 基本语法
if [ conditon ]
then 代码1
elif [ condition ]
then代码2
elif [ conditon ]
then代码3
else 默认
fi
  • 案例
#!/bin/bash
if [ $1 -lt $3  ]
thenecho "1<3"elseecho "1>3"
fi

4.4、case语句

  • 基本语法
case $变量名 in"值1")如果变量名的值等于 值1,就执行代码1;;"值2")代码2;;*)如果以上都不满足就执行这个代码;;
esac
  • 案例
#!/bin/bash
# 传参数
case $1 in"1")echo "一";;"2")echo "二";;*)echo "三";;
esac

在这里插入图片描述
在这里插入图片描述

5、循环语句

5.1、for循环[2种方法][无$变量]

  • 基础语法1
for 变量 in "值1" "值2" "值3"....
do代码
done
  • 案例
#!/bin/bash
for i in "$@"
doecho "数字是:$i"
done

在这里插入图片描述

  • 基础语法2
for(( 初始值;循环控制条件;变量变化 ))
do代码
done
  • 案例
#!/bin/bash
for(( i=0;i<10;i++ ))
doecho "数字是:$i"
done

在这里插入图片描述

5.2、while循环

  • 基础语法
while [ condition ]
do代码
done
  • 案例

#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
doSUM=$(($SUM+$i));i=$(($i+1));
done
echo "数字之和是:$SUM"

在这里插入图片描述

6、read获取输入

  • 基础语法
read 选项 参数
-p  指定读取值时的提示符
-t   指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了(放弃输入)
  • 案例1:使用-p
#!/bin/bash
read -p "请输入一个数字:" NUM1
echo "用户输入的值是$NUM1"
  • 案例2:使用-t
#!/bin/bash
read -t 10 -p "请输入一个数字:" NUM1
echo "用户输入的值是$NUM1"
# 10秒内不输入 ,它就自己跳到下一个函数了                      

7、函数

7.1、系统函数[遇到这种就网上查,这里只举2个例子]

  • 基础语法
basename  文件的完整路径    作用:获取文件名
dirname   文件的完整路径     作用:获取完整路径最前面部分
  • 案例1:使用basename
a@zyt-virtual-machine:~/shellCode$ pwd
/home/a/shellCode
a@zyt-virtual-machine:~/shellCode$ basename /home/a/shellCode/hello.sh
hello.sh

在这里插入图片描述

  • 案例2:使用dirname
a@zyt-virtual-machine:~/shellCode$ dirname /home/a/shellCode
/home/a

在这里插入图片描述

7.2、自定义函数

  • 基础语法
function function_name {# 函数体commands
}
function_name [$参数1...$参数2] 调用这个函数
  • 案例:函数参数传递
greet() {echo "Hello, $1!"
}greet "Alice"  # 输出: Hello, Alice!
greet "Bob"    # 输出: Hello, Bob!
  • 案例:返回值处理
    • 返回状态码(0-255):
is_even() {if (( $1 % 2 == 0 )); thenreturn 0  # 成功/真elsereturn 1  # 失败/假fi
}is_even 4
echo $?  # 输出返回状态码
  • 案例:返回数据(通过echo)
add() {local sum=$(( $1 + $2 ))echo $sum
}result=$(add 3 5)  # 捕获输出
echo "3 + 5 = $result"
  • 案例:局部变量(推荐)
myfunc() {local var="局部变量"echo "函数内: $var"
}myfunc
echo "函数外: $var"  # 输出为空
  • 案例:全局变量
global_var=""modify_global() {global_var="修改后的值"
}modify_global
echo $global_var  # 输出: 修改后的值
  • 案例:2数之和
#!/bin/bash
function getSum(){SUM=$(($n1+$n2))echo "两个数字之和是:$SUM"
}
read -p "请输入2个数字" n1 n2
getSum $n1 $n2

在这里插入图片描述

  • 案例:函数引用
say_hello() { echo "Hello!"; }
say_goodbye() { echo "Goodbye!"; }# 通过变量选择函数
action="say_hello"
$action  # 输出: Hello!action="say_goodbye"
$action  # 输出: Goodbye!
  • 案例:递归函数
factorial() {local n=$1if (( n <= 1 )); thenecho 1elseecho $(( n * $(factorial $((n-1))) ))fi
}factorial 5  # 输出: 120

8、数组

8.1、 初始化

# 方式1:空格分隔
colors=("red" "green" "blue")
arr=("$@")
# 方式2:逐个元素赋值
fruits[0]="apple"
fruits[1]="banana"
fruits[2]="orange"

8.2、访问单个和全部

  • 单个
echo ${colors[0]}    # 输出第一个元素(索引从0开始)
echo ${colors[-1]}   # 输出最后一个元素
  • 全部
echo ${colors[@]}    # 展开为独立单词(推荐)
echo ${colors[*]}    # 所有元素作为单个单词(可能有问题)

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

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

相关文章

《Robust Synthetic-to-Real Transfer for Stereo Matching》

论文地址&#xff1a;https://arxiv.org/pdf/2403.07705 源码地址&#xff1a;https://github.com/jiaw-z/DKT-Stereo 概述 通过在合成数据上预训练的模型在未见领域上表现出强大的鲁棒性。然而&#xff0c;在现实世界场景中对这些模型进行微调时&#xff0c;其领域泛化能力可…

蓝桥杯第10届 后缀表达式

题目描述 给定 N 个加号、M 个减号以及 NM1 个整数 A1,A2,⋅⋅⋅,ANM1​&#xff0c;小明想知道在所有由这N 个加号、M 个减号以及 NM1 个整数凑出的合法的 后缀表达式中&#xff0c;结果最大的是哪一个&#xff1f; 请你输出这个最大的结果。 例如使用 1 2 3 -&#xff0c…

C++前缀和

个人主页&#xff1a;[PingdiGuo_guo] 收录专栏&#xff1a;[C干货专栏] 大家好&#xff0c;今天我们来了解一下C的一个重要概念&#xff1a;前缀和 目录 1.什么是前缀和 2.前缀和的用法 1.前缀和的定义 2.预处理前缀和数组 3.查询区间和 4.数组中某个区间的和是否为特定…

uni app跨端开发遇到的问题

技术栈 uni app&#xff0c;vue3&#xff0c;uview puls&#xff0c;map… nvue 因为项目中有地图&#xff0c;要使用到map标签&#xff0c;所以考虑用原生nvue开发&#xff0c;它是有痛点的&#xff0c;首先浏览器不支持&#xff0c;我是要开发ios和Android&#xff0c;所以…

SQL注入操作

sql注入 一&#xff0c;SQL注入分类按照注入的网页功能类型分类按照注入点值的属性分类基于从服务器返回内容按照注入的程度和顺序 一&#xff0c;SQL注入分类 按照注入的网页功能类型分类 登录注入cms注入 cms逻辑&#xff1a;index.php首页展示内容&#xff0c;具有文章列表…

微信 MMTLS 协议详解(五):加密实现

常用的解密算法&#xff0c;对称非对称 加密&#xff0c;密钥协商&#xff0c; 带消息认证的加解密 #生成RSA 密钥对 void GenerateRsaKeypair(std::string& public_key,std::string& private_key) {RSA* rsa RSA_new();BIGNUM* bn BN_new();// 生成 RSA 密钥对BN_s…

ROS melodic 安装 python3 cv_bridge

有时候&#xff0c;我们需要处理这些兼容性问题。此处列举我的过程&#xff0c;以供参考 mkdir -p my_ws_py39/src cd my_ws_py39 catkin_make_isolated-DPYTHON_EXECUTABLE/usr/bin/python3 \-DPYTHON_INCLUDE_DIR/usr/include/python3.8 \-DPYTHON_LIBRARY/usr/lib/x86_64-l…

深入学习:SpringQuartz的配置方式!

全文目录&#xff1a; 开篇语前言摘要概述1. 基于 XML 的传统配置配置步骤1.1 Maven 依赖1.2 XML 配置文件1.3 实现 Job 类 2. 基于 Java Config 的现代配置方式配置步骤2.1 Maven 依赖2.2 配置类2.3 实现 Job 类 3. 动态任务调度动态添加任务动态删除任务 4. Quartz 持久化配置…

ClickHouse与TiDB实操对比:从入门到实战的深度剖析

ClickHouse与TiDB实操对比&#xff1a;从入门到实战的深度剖析 宝子们&#xff0c;在当今数据驱动的时代&#xff0c;选择合适的数据库对于处理海量数据和支撑业务发展至关重要。ClickHouse和TiDB作为两款备受关注的数据库&#xff0c;各自有着独特的优势和适用场景。今天&…

element-ui messageBox 组件源码分享

messageBox 弹框组件源码分享&#xff0c;主要从以下两个方面&#xff1a; 1、messageBox 组件页面结构。 2、messageBox 组件属性。 一、组件页面结构。 二、组件属性。 2.1 title 标题&#xff0c;类型为 string&#xff0c;无默认值。 2.2 message 消息正文内容&#xf…

睡眠健康领域的智能硬件设备未来的发展趋势

随着社会节奏的不断加快&#xff0c;人们的睡眠问题愈发多了起来&#xff0c;主要表现有以下几个方面&#xff1a; 睡眠质量下降 浅睡眠增多&#xff1a;现代生活中&#xff0c;人们面临着各种压力源&#xff0c;如工作压力、生活琐事、经济压力等&#xff0c;这些压力会导致大…

支付页面安全与E-Skimming防护----浅谈PCI DSS v4.0.1要求6.4.3与11.6.1的实施

关键词&#xff1a;支付页面安全、E-Skimming、PCI DSS v4.0.1、第三方脚本、风险管理、持卡人数据、数据安全、第三方服务提供商、TPSP、内容安全、网页监控、恶意脚本攻击 本文为atsec和作者技术共享类文章&#xff0c;旨在共同探讨信息安全的相关话题。转载请注明&#xff…

【gradio】从零搭建知识库问答系统-Gradio+Ollama+Qwen2.5实现全流程

从零搭建大模型问答系统-GradioOllamaQwen2.5实现全流程&#xff08;一&#xff09; 前言一、界面设计&#xff08;计划&#xff09;二、模块设计1.登录模块2.注册模块3. 主界面模块4. 历史记录模块 三、相应的接口&#xff08;前后端交互&#xff09;四、实现前端界面的设计co…

案例分享|树莓派媒体播放器,重构商场广告的“黄金三秒”

研究显示&#xff0c;与传统户外广告相比&#xff0c;数字户外广告在消费者心中的记忆率提高了17%&#xff0c;而动态户外广告更是能提升16%的销售业绩&#xff0c;整体广告效率提升了17%。这一显著优势&#xff0c;使得越来越多资源和技术流入数字广告行业。 户外裸眼3D广告 无…

23种设计模式-装饰器(Decorator)设计模式

装饰器设计模式 &#x1f6a9;什么是装饰器设计模式&#xff1f;&#x1f6a9;装饰器设计模式的特点&#x1f6a9;装饰器设计模式的结构&#x1f6a9;装饰器设计模式的优缺点&#x1f6a9;装饰器设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

[Vue]事件修饰符

文章目录 一、语法介绍二、添加代码三、结果展示四、参考文献 如有错误&#xff0c;请指正&#xff01;&#xff01;&#xff01; 一、语法介绍 1、问题来源 我们在处理网页时&#xff0c;当点击按钮时会触发对应事件&#xff0c;但是有时并不想触发该时间&#xff0c…

Go 语言 sync 包使用教程

Go 语言 sync 包使用教程 Go 语言的 sync 包提供了基本的同步原语&#xff0c;用于在并发编程中协调 goroutine 之间的操作。 1. 互斥锁 (Mutex) 互斥锁用于保护共享资源&#xff0c;确保同一时间只有一个 goroutine 可以访问。 特点&#xff1a; 最基本的同步原语&#x…

ubuntu22.04安装搜狗输入法保姆教程~

一、添加中文语言支持 1.首先打开设置,找到Language and Region 2.点击Manage Installed Languages 3.点击 Install/Remove Languages... 4.选中Chinese (simplified),点击Apply

docker中间件部署

1.docker安装 # 1.卸载旧版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 2.需要的安装包 yum install -y yum-utils# 3.设置镜像的仓库 # 3.1.默认是国外的&#x…

python康复日记-request库的使用,爬虫自动化测试

一&#xff0c;request的简单应用 #1请求地址 URLhttps://example.com/login #2参数表单 form_data {username: admin,password: secret } #3返回的响应对象response response requests.post(URL,dataform_data,timeout5 ) #4处理返回结果&#xff0c;这里直接打印返回网页的…