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

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" ]
then
        echo "两个字符串不相等"
fi
  • 案例2
    • 中国人大于18 岁是中国成年人
if [ $age -ge 18 -a "$country" = "CN" ]; then
    echo "中国成年人"
fi

# 使用 [[ ]] 的更清晰写法 , 这里有&&
if [[ $age -ge 18 && "$country" == "CN" ]]; then
    echo "中国成年人"
fi
  • 案例3
    • 查看 a.txt 文件存在 【注意输入的是绝对路径
#!/bin/bash
if [ -f /home/a/shellCode/a.txt ]
then
        echo "a.txt存在"
fi


  • 案例4
    • a.txt 的权限是 -r
#!/bin/bash
if [ -r /home/a/shellCode/a.txt ]
then
        echo "a.txt的权限是write"
fi
  • 案例5
    • true的使用
#!/bin/bash
if [ true ]
then
        echo "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  ]
then
        echo "1<3"

else
        echo "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 "$@"
do
        echo "数字是:$i"
done

在这里插入图片描述

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

在这里插入图片描述

5.2、while循环

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

#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$(($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 )); then
        return 0  # 成功/真
    else
        return 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=$1
    if (( n <= 1 )); then
        echo 1
    else
        echo $(( 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.kler.cn/a/613284.html

相关文章:

  • 书籍学习|基于Java+vue的书籍学习平台(源码+数据库+文档)
  • CXL UIO Direct P2P学习
  • 运维规则之总结(Summary of Operation and Maintenance Rules)
  • Ingredient-oriented Multi-Degradation Learning for Image Restoration论文阅读
  • leetcoed0044. 通配符匹配 hard
  • DQL语句-distinct去重
  • git 问题 master has no tracked branch
  • 第一卷:京口草鞋摊的野望(1-36回)正反人物群像
  • 管家婆财贸ERP BD002.存货销售订单汇总看板
  • 中国劳动统计年鉴pdf+excel(1989-2024年)
  • CSS——变换、过度与动画
  • element-plus中,Tour 漫游式引导组件的使用
  • 1.单片机及开发板介绍
  • Python数据可视化-第1章-数据可视化与matplotlib
  • 产生式系统的完整示例——医疗诊断系统(附python代码)
  • F.binary_cross_entropy与sklearn.metric.log_loss的比较
  • 《C语言实现金字塔图案打印》
  • CSS学习笔记6——网页布局
  • CSS-BFC(块级格式化上下文)
  • 企业为何青睐数字孪生大屏?技术驱动与价值重构的双重逻辑