shell学习记录

shell简介

参考博文1

参考博文2------shell语法及应用

参考博文3------vi的使用

linux中有很多类型的shell ,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是 / b in/ b a s h ,流行的shell有ash、bash、ksh、csh、zsh等

复制代码
#!/bin/bash			#这一行被称为shebang 行	[指定告知系统当前这个脚本要使用的shell解释器]

(1)vi的使用

**(1)控制光标移动方向:**hjkl分别对应:左下上右

**(2)光标每次移动一个单词:**w(word):向后移动一个单词;b(back):向前移动一个单词

(3)移动到指定行: gg:移到文件顶部;G:移到文件末尾 ;数字gg /G /:数字:移动到对应行数,如:5gg

(4)屏幕移动: Ctrl+b:向上翻页 ; Ctrl+f:向下翻页**; H / M / L:屏幕顶部/中间底部**

(5)标记行: mx(x可取任意字母),跳转到标记行`x;如:标记行使用ma,则跳转到标记行使用`a

(7)撤销 / 恢复上一次命令:u / ctrl + r

**(8)选中文本:v / V / ctrl + v:**从光标位置开始按照正常模式选择文本 / 选中光标经过的完整行 / 垂直方向选中文本

(9)复制文本:y (复制) ;yy (复制1行,nyy复制多行) ; p (粘贴)

(10)删除文本: x / d / dd / D

复制代码
vi test.py +n   #n为行数  ,#打开文件,定位到指定行数,即可进行编辑

如果 vi 异常退出,在磁盘上可能会保存有 交换文件

下次再使用 vi 编辑该文件时,会看到以下屏幕信息,按下字母 d 可以 删除交换文件 即可

1.shell脚本的写入和运行

1.写入的4种方式

复制代码
shell脚本的写入方式
1.cat > test.sh
"hello world"
"hello boys"   #键入写入test.sh的内容,写完后按CTRL+D退出

2.echo "hello world" > test.sh  #写入test.sh并覆盖原有内容
3.echo "hello world" >> test.sh  #写入test.sh的末尾,不覆盖原有内容
4.vi test.sh     #使用vi编辑

注意执行前先给shell脚本可执行的权限:chmod +x test.sh(最开始创建的test.sh只是一个文本文件,必须给权限后才可运行)

复制代码
#3种方式均可运行sh脚本
bash test.sh  
sh test.sh
./test.sh      #注意!!! 不可忽略./

2.输入/输出重定向

linux标准输入输出:

0:键盘(/dev/stdin)------标准输入

1:显示器(/dev/stdout)------标准输出

2:显示器(/dev/stderr)------标准错误输出

输入重定向: 不使用标准输入端口输入文件,而是使用指定的文件作为标准输入设备。(使用**"<"符**来修改标准输入设备)

复制代码
echo "today is $(date)"    #输出Today id 2024年 05月 20日 星期一 14:26:59 CST
echo " today is $(date)" >> test.sh   #将输出内容写到test.sh文件的末尾

常用的转义字符:\n:换行 \t:制表符 \\反斜杠 \" 双引号 \'单引号

3.shell变量

注意事项!!!

1.等号两侧不能有空格,如:name="john"

2.环境变量建议大写

3.单引号(全引用):单引号括起的内容不管是常量还是变量都不会发生替换(引用的即输出的)

4.双引号(部分引用):变量发生替换,常量保持不变

**5.无引号:字符串不能包含空白字符(space/tab),**一般连续的字符串、数字、路径等可以不加引号

字符串常量使用单引号括起来,如果字符串含有变量命令等使用双引号括起来,不建议不加引号

命令执行:必须用反引号(`命令`)或(命令):****如:echo \`ls\` 或者echo (ls) ,才会输出ls命令执行结果(也即显示当前目录下的文件)

复制代码
#单引号使用
var=double
echo '$var'     #输出:$var

#双引号使用
var=double
echo "$var"    #输出:double

#无引号使用
str1="test1",str2='test2',str3=teststring
echo $str1,$str2,$str3     #输出test1,str2=test2,str3=teststring

3.1变量分类

1.自定义变量:户自由定义变量名和变量的值

2.环境变量:保存和系统操作环境相关的数据

3.位置参数变量:向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。

4.预定义变量:Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

复制代码
#变量的调用
[root@root scripts]# name="shen zhen"
[root@root scripts]# echo $name
shen zhen

3.2变量查看

set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。

复制代码
set [+-abCdefhHklmnpPtuvx]

unset name    #删除变量
env            #查看系统默认环境变量
3.2.1位置参数变量

n:** n为数字,**0表示当前 Shell 脚本程序的名称,$1-9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 ,如{10}

\*:** 代表命令行中所有的参数,**把所有的参数看成一个整体

**@:**代表命令行中所有的参数,不过@把每个参数区分对待

**$#:**代表命令行中所有参数的个数

复制代码
#! /bin/bash

echo "shell脚本本身的名字:$0"     #输出:shell脚本本身的名字:test.sh
echo "传给shell的第一个参数:$1"    #输出:传给shell的第一个参数:1
echo "传给shell的第二个参数:$2"    #输出:传给shell的第二个参数:2
3.2.2预定义变量

**$?:**最后一次执行命令的返回状态。为0则命令执行成功,反之,不成功

$$: 当前进程的进程号PID

**$!:**后台运行的最后一个进程的进程号

1.cat:用于查看和连接文件

'>'用于创建文件, '>>'用于追加内容(不覆盖原内容)

复制代码
cat file  #查看文件
cat > test.py # 将标准输入到重定向文件,覆盖该文件内容
cat >> test.py #将标准输入写到文件末尾

cat file1 file2 > file3  #将file1和file2的内容合并写到file3(若file3有内容,则会被覆盖)
cat file1 file2 > file3  #将file1和file2的内容合并写到file3(若file3有内容,则会写到文件后)

cat file1 file2    #显示多个文件内容
cat filename | command  #将cat命令的输出作为另一个命令的输入
cat -n textfile1 > textfile2  # textfile1 的文档内容加上行号后输入 textfile2 
cat filename | tail -n 10  #显示file的最后10行

nl filename      #显示行号(包括空白行)
cat -n filename  #显示行号(包括空白行)   
cat -b filename  #显示行号(不包括空白行)
cat -e filename  #在每行结尾处添加符号"$"

cat /dev/null > /etc/tsst.txt  #清空 /etc/test.txt 文档内容
cat /dev/fd0 > OUTFILE    #制作镜像文件,如要制作 软盘的镜像文件OUTFILE,将软盘放好后,使用此命令
cat /IMG_FILE > /dev/fd0   #相反的,如果想把 image file镜像文件 写到软盘,使用此命令

2.more 文件内容或输出查看工具

复制代码
more /root/test.py     #查看文件内容,同cat,并可分页显示文件内容
    参数如下:
    +num   从第num行开始显示;
    -num   只显示前num行;
    +/pattern   从pattern 前两行开始显示;
    -c   从顶部清屏然后显示;
    -d   提示Press space to continue, 'q' to quit.(按空格键继续,按q键退出),禁用响铃功能;
    -l    忽略Ctrl+l (换页)字符;
    -p    通过清除窗口而不是滚屏来对文件进行换页。和-c参数有点相似;
    -s    把连续的多个空行显示为一行;
    -u    把文件内容中的下划线去掉退出more的动作指令是q

more -dc test.sh     #清屏查看当前文件
ls -l /etc |more     #通过管道与more结合(当要显示的内容很多时,cat直接打印了所有内容,可能会看不到前面部分的内容,就可利用more分屏显示)

#查看大文件时,有以下常用快捷键:
    Enter:    向下1行(默认,可修改多行)
    Ctrl+f:   向下滚动1屏;
    空格键:    向下滚动1屏;
    Ctrl+b:   返回上一屏;
    = :       输出当前行的行号;
    :f:       输出文件名和当前行的行号;
    v:        调用vi编辑器;
    ! :       调用Shell,并执行命令;
    q :       退出more当我们查看某一文件时,想调用vi来编辑它,不要忘记了v动作指令,这是比较方便的;

3.less查看文件

复制代码
less test.sh
常用参数

-c 从顶部(从上到下)刷新屏幕,并显示文件内容。而不是通过底部滚动完成刷新;
-f 强制打开文件,二进制文件显示时,不提示警告;
-i 搜索时忽略大小写;除非搜索串中包含大写字母;
-I 搜索时忽略大小写,除非搜索串中包含小写字母;
-m 显示读取文件的百分比;
-M 显法读取文件的百分比、行号及总行数;
-N 在每行前输出行号;
-p pattern 搜索pattern;比如在/etc/profile搜索单词MAIL,就用 less -p MAIL /etc/profile
-s 把连续多个空白行作为一个空白行显示;
-Q 在终端下不响铃;


man less     #查看less 使用

head -n 5  /var/log/msg  #显示msg文件的前5行

tail -n 5  /var/log/msg  #显示msg文件的最后5行
tail -f    /var/log/msg  #实时显示msg文件

二、shell运算符

在shell中,常见的有算数运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符等

2.1算术运算符

bash不支持简单的数学运算,但是可以通过其他命令来实现,利用awk 、expr(常用)完成表达式的计算

条件表达式:

= |赋值| a=$b 将把变量 b 的值赋给 a。

==| 相等。用于比较两个数字,相同则返回 true(真)。| [ a == b ] 返回 false(假)。

!= |不相等。用于比较两个数字,不相同则返回 true。 |[ a != b ] 返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,如: [ a == b ]、[ a != b ]

复制代码
a=30
b=10
echo "$a"
echo "$b"
echo "a + b = " `expr $a + $b`  #输出40
echo "a - b = " `expr $a - $b`  #输出20
echo "a * b = " `expr $a \* $b` #输出300
echo "a / b = " `expr $a / $b`  #输出3
echo "a % b = " `expr $a % b`   #输出
--------------------------------------------
if [$a == $b]
then
    ech和b相等"
else
    echo "a和b不等"     #输出a和b不等
fi

2.2关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习