【Shell】一天快速入门

news2025/1/11 1:50:26

1 Shell解析器

Linux提供的shell解析器有6种:

/bin/sh
/bin/bash
/sbin/nologin
/bin/csh
/bin/dash
/bin/tash

sh是bash的软连接。

2 Shell脚本

2.1 hello.sh脚本

#!/bin/bash
echo 'hello world!'

#! 告诉系统这个脚本需要什么解释器来执行;
脚本以#!/bin/bash开头;
echo表示输出。

文件扩展名 .sh 不是强制要求的。
运行:

# 方法1  直接运行解释器,hello.sh 作为 Shell 解释器的参数。
# 本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限
# 此时 Shell 脚本就不需要指定解释器信息,第一行可以去掉。
sh hello.sh  
# 或
bash hello.sh

# 方法2 hello.sh 作为可执行程序运行,Shell 脚本第一行一定要指定解释器。
# 本质是自己执行脚本,必须先赋予权限
chmod +x hello.sh   # 一定要先赋予脚本的+x权限,之后才能执行以下
./hello.sh

2.2 多命令处理脚本

需求:创建一个test.txt文件,使用脚本在文件中增加一行“test shell”字符。
(1)创建batch.sh脚本并编辑:

touch batch.sh
#!/bin/bash

cd /shell_stady/
#创建test.txt文件
touch test.txt
#将一句字符添加到test.txt文件中
echo "test shell " >> test.txt

(2)执行batch.sh

sh batch.sh

可以看到文件夹里多了一个test.txt文件。

(3)把test.txt文件内容显示到控制台上:

cat test.txt

3 Shell变量

在这里插入图片描述

3.1 显示当前变量的值

echo $变量名  #引用变量的值
set   #一次性显示当前shell中所有变量的名称值
env   #显示环境变量
printenv PATH   #显示指定变量和值

3.2 自定义变量

3.2.1 基本语法

定义变量:变量名=值

A=122

撤销变量:unset 变量名

unset A
echo $A

声明静态变量:readonly 变量名=值,静态变量只能读,不能撤销unset掉。

readonly B=234

变量定义规则:
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格。
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来,表示变量值为一个字符串。
(5)可把变量提升为全局环境变量,可供其他Shell程序使用。

3.2.2 配置环境变量

(1)export 变量名=变量值 (功能描述:将shell变量输出为环境变量)

(2)source 配置文件 (功能描述:让修改后的配置信息立即生效)

(3)echo $变量名 (功能描述:查询环境变量的值)
  export 变量名:把变量提升为全局变量。

例如:先定义一个变量D,默认为局部变量。

D="this is shell_stady."

编辑hello.sh

#!/bin/bash
echo 'hello world!'
echo $D

运行hello.sh发现$D并没有输出。

此时需要把局部变量D提升为全局变量:

export D

重新运行hello.sh。
在这里插入图片描述

3.3 特殊变量

3.3.1 $n

$n:n为数字,$0 代表该脚本名称(即文件),$1-9代表第一到第九个参数,十以上的参数需要用大括号包含如${10}

创建编辑parameter.sh

touch parameter.sh
vim parameter.sh
# 输入以下
#!/bin/bash
echo "$0 $1 $2 $3"

运行:
在这里插入图片描述
应用于:判断输入的参数,即脚本根据输入的参数执行相应的内容。

3.3.2 $#

$#:用于获取所有输入参数个数,常用于循环。

继续在parameter.sh末尾加上:

echo "$#"

运行:
在这里插入图片描述

3.3.3 $*、 $@

$*:代表命令行中所有的参数,即把所有的参数看成一个整体。
$@:也代表命令行中的所有的参数,不过把每个参数区分对待。

继续在parameter.sh末尾加上:

echo "$*"
echo "$@"

运行:
在这里插入图片描述

3.3.4 $?

$?:最后一次执行的命令的返回状态。如果这个变量的值为0,说明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则说明上一个命令执行不正确。常用于判断异常。
在这里插入图片描述

3.3.5 $$

$$:表示当前进程的进程号(PID)。

3.3.6 $!

$!:表示后台运行的最后一个进程的进程号(PID)。

4 运算符

语法:
(1)$((运算式)) 或 $[运算式] (推荐使用第二种);
(2)expr +,-,*, / ,% 加,减,乘,除,取余。(expr 与运算符之间要有空格)

在这里插入图片描述
例子1:混合运算:(2+3)*4
在这里插入图片描述
或创建一个calculate.sh

#!/bin/bash
temp=`expr 2 + 3`
result=`expr $temp \* 4`
echo "result=$result"

在这里插入图片描述
例子2:求两个输入参数之和。

创建getAaddB.sh

!#/bin/bash
#求两个输入参数之和
echo "$1 $2"
result=$[$1 + $2]
echo "$1$2之和为$result"

在这里插入图片描述

5 条件判断

5.1 判断语句

语法:[ condition ] ps:condition前后都要有空格。

条件非空几即为true,如:[ test ]返回true,[ ]返回false。

5.2 常用判断条件

5.2.1 两个整数之间的比较

  = 字符串比较
  -eq 等于(equal)
  -ne 不等于(Not equal)
  -lt 小于(less than)
  -le 小于等于(less equal)
  -ge 大于等于(greater equal)
   -gt 大于(greater then)
在这里插入图片描述

5.2.2 判断文件权限

  -r 有读的权限(read)
  -w 有写的权限(write)
  -x 有执行的权限(execute)

判断文件是否有写权限:
在这里插入图片描述

5.2.3 判断文件类型

  -b 是否是块设备文件
  -c 是否是字符设备文件
  -d 文件存在并不是一个目录(directory)
  -e 文件存在 (existence)
  -f 文件存在并且是一个常规的文件(file)
  -L 是否是软链接文件
  -s 文件是否非空
  -S 是否是套接字文件
  -p 是否是管道文件

判断目录中的文件是否存在:
在这里插入图片描述

5.2.4 多条件判断

&&表示前一条命令执行成功时,才执行后一条命令;
|| 表示上一条命令执行失败后,才执行下一条命令。

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

6 流程控制

6.1 if 判断

语法:

#  [ 条件判断式 ] 判断式两边必须要有空格
#  if后要有空格

if [ 条件判断式 ]:then
    程序
fi
# 或者
if [ 条件判断式 ]
    then
        程序
fi

例子:创建if.sh

#!/bin/bash
echo "$1"
if [ $1 -ge 5 ]
        then
                echo "输入值大于5"
elif [ $1 -gt 3 ]
        then
                echo "输入值大于3"
elif [ $1 -le 3]
        then
                echo "输入值小于等于3"
fi

在这里插入图片描述

6.2 case 语句

语法:

case $变量名 in
值1)
如果变量的值等于值1,则执行程序1
;;   # ;;表示命令序列结束,相当于Java中的break
值2)
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)    #表示默认模式,相当于Java中的default
如果变量的值都不是以上的值,则执行此程序
;;
esac

例子:

#!/bin/bash
case $1 in
1)
        echo "beijing"
;;
2)
        echo "shanghai"
;;
*)
        echo "guangzhou"
;;
esac

在这里插入图片描述

6.3 for 循环

语法一:

# for后要有空格
for (( 初始值;循环控制条件;变量变化 ))
    do
        程序
    done

例子:1累加到10。

#!/bin/bash
s=0
for ((i=0;i<=10;i++))
        do
                s=$[ $s + $i ]
        done
echo "result=$s"

在这里插入图片描述
语法二:

for 变量 in 值1 值2 值3...
    do
        程序
    done

例子:打印所有输入的参数,并区别四种情况。
(1)

#!/bin/bash

for i in $*
        do
                echo "输入的参数是$i"
        done

在这里插入图片描述(2)

#!/bin/bash

for i in $@
        do
                echo "输入的参数是$i"
        done

在这里插入图片描述
(3)“$*” 加引号的,一次输出所有,只循环一次。

#!/bin/bash

for i in "$*"
        do
                echo "输入的参数是$i"
        done

在这里插入图片描述
(4)

#!/bin/bash

for i in "$@"
        do
                echo "输入的参数是$i"
        done

在这里插入图片描述
总结:

$@$*"$@",参数有几个就循环几次。
"$*"不管参数有多少个,它只循环一次,并且值就是所有的值。

6.4 while 循环

语法:

#  while后要有空格
while [ 条件表达式 ]
    do
         程序
    done

例子:1累加到10。

#!/bin/bash
s=0
i=0
while [ $i -le 10 ]
    do
        s=$[ $s + $i ]
        i=$[ $i + 1 ]
    done
echo $s

在这里插入图片描述

7 read读取控制台输入

语法:read(选项)(参数)

选项:
  -p:指定读取值时的提示符
  -t:指定读取值时等待的时间(秒)

参数:
  变量:指定读取值的变量名

例子:提示7秒内读取控制台输入的名称。

#!/bin/bash
read -t 7 -p "input your name" NAME
echo $NAME

在这里插入图片描述

8 函数

8.1 系统函数

8.1.1 basename

语法:basename 字符串或路径名 后缀

返回完整路径最后的“/”的部分,常用于获取文件名。

  basename命令会截取所有前缀,包括最后一个“/”字符,然后显示。

  如果后缀被指定,basename会把该字符串或者路径名中的后缀去掉。

例子:返回 /shell_stady/hello.sh路径的文件名称。
在这里插入图片描述

8.1.2 dirname

语法:dirname 文件绝对路径

返回完整路径最后的“/”的前面的部分,常用于返回路径部分。

  从指定包含绝对u就的文件名中去除文件名(非目录部分),然后返回剩下的路径(目录部分)。
例子:返回 ./shell_stady/hello.sh的 ./shell_stady
在这里插入图片描述

8.2 自定义函数

语法:

function funname ()
{
    程序;
    return 参数;
}

# 调用直接写函数名
funname 参数

例子:计算输入两个参数和。

#!/bin/bash
function getSun()
{
    SUM=$[ $A + $B ]
    echo "$A+$B=$SUM"
}
read -p "请输入第一个数" A
read -p "请输入第二个数" B

# 调用函数getSun
getSun $A $B

在这里插入图片描述

9 Shell工具

9.1 cut

  负责在文件中剪切数据,cut从文件的每一行剪切字节、字符、字段,并将这些字节、字符、字段输出。

语法:cut 选项参数 filename

默认分隔符为Tab。

选项参数:
  -f:列号,提取第几列
  -d:分隔符,按指定分隔符分隔。

例子1:创建cut.txt

vim cut.txt

beijing tianjing
hangzhou shanghai
guangzhou shenzhen

在这里插入图片描述在这里插入图片描述例子2:切割环境变量PATH。
在这里插入图片描述例子3:切割ifconfig打印后的ip地址。
在这里插入图片描述

9.2 sed

  sed一次处理一行内容,把导航前处理的行存储在临时缓冲区(称模式空间);然后用sed命令处理缓冲区的内容;处理完成后将缓冲区的内容输出到控制台;重复直到文件末尾。

语法:sed 选项参数 “操作(带命令)” filename

参数选项:
  -n:按行取。
  -e直接在指令列模式上进行sed动作编辑。

命令描述:
  a:新增一行,直接在a后接字符串。
  d:删除。
  s:查找并替换。
在这里插入图片描述在这里插入图片描述

9.3 awk

  awk是文本分析工具,把文件逐行读入,默认分隔符为空格,对读入的行进行切片再分析处理。

语法:awk 选项参数 ‘pattern1 {action1} pattern2 {action2}…’ filename

  pattern:表示awk在数据中查找内容,即匹配模式,在匹配正则表达式时用:/正则表达式/

  action:在找到指定内容时所执行的一系列命令。

  只有匹配了pattern的行才会执行action。

选项参数:
  -F:指定文件拆分符。
  -v:赋值一个用户定义变量。

awk内置变量(在action内的变量):
  FILENAME:文件名
  NR:已读的记录数
  NF:浏览的域的个数(切割后列的个数)

例子1:先把 /etc/passwd复制到shell_stady目录下,取以root开头的行的第1列和第7列。
在这里插入图片描述在这里插入图片描述
例子2:BEGIN在所有数据读取行之前执行,END在所有数据执行之后执行。
在这里插入图片描述例子3:
在这里插入图片描述例子4:统计passwd文件名,每行的行号,每列的列数
在这里插入图片描述例子5:切割IP。
在这里插入图片描述例子6:查询sed.txt中空行所在的行号。
在这里插入图片描述

9.4 sort

对文件排序并输出。

语法:sort 选项参数 参数

选项参数:
  -n:按照数值大小排序
  -r:以相反的顺序排序
  -t:设置排序时用的分割符
  -k:指定需要排序的列

例子:创建sort.txt

aa:2:3.2
bb:1:5.4
cc:5:2.2
dd:8:1.2
fa:5:1.2
ab:3:4.3

在这里插入图片描述

10 Shell常用命令

10.1 目录

pwd  #确定现在所处的目录
cd  #切换目录
ls  #显示目录
    #参数:
    -a :显示包括隐藏文件和目录在内的所有目录和文件
    -l :显示文件的详细信息
    -h :配合-l以人性化的方式显示文件大小
    -t :按文件最后修改时间排序文件

在这里插入图片描述一行共10位:
1.表示文件类型:d表示目录,-表示文件,l表示链接文件,b表示可随机存取的设备,如U盘等,c表示一次性读取设备,如鼠标、键盘等。

2.owner身份所拥有的权限:readable、writable、excutable(读、写、执行)。

3.group身份所拥有的权限:readable、writable、excutable(读、写、执行)。

4.others身份所拥有的权限:readable、writable、excutable(读、写、执行)。

5.表示链接数,即有多少个文件链接到该文件。

6.表示拥有者。

7.表示所属群组。

8.表示文档容量大小,单位字节。

9.表示文档最后修改时间,注意不是文档的创建时间。

10.表示文档名称。以点(.)开头的是隐藏文档。

权限数字表示法:
在这里插入图片描述

10.2 文件和文件夹

mkdir  #创建文件夹
    #参数:
    -p :递归创建目录
    -m:设置新建目录权限
    
rmdir  #删除文件夹
    #参数:
    -p :递归删除目录
    
touch  #创建文件
cat  #查看文件内容
vim  #编辑文件
rm  #删除文件
    #参数:
    -f :强制删除文件。
    -r :递归删除目录及内容
    
chmod #修改目录和文件权限
    #参数:
    -u user 用户

    -g grop 用户组

    -o others 其他人

    -a all 所有人

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

10.3 输出重定向

# 输出重定向,用">"将输出的内容保存到文件中,
# 如果文件中有内容则会覆盖该文件所有的内容
echo '新加的内容' > test.txt

# 追加输出重定向,用">>"将内容追加输出到文件中末尾
echo '新加的内容' >> test.txt

10.4 别名

# 别名:命令、参数可以由另外一个命令执行来代替。
alias 别名='需要定义的名称、参数、命令'   #取别名
unalias 别名  #取消别名

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

10.5 命令

# 管道命令:管道中的前一条命令的输出转为下一条命令的输入。
命令1 | 命令2 | 命令3 | ... | 命令n
命令1;命令2;命令3   # 表示顺序执行若干命令
命令1 && 命令2   # 表示命令1运行成功才运行命令2
命令1 || 命令2   # 表示命令1运行不成功才运行命令2

11 正则表达式

 	^:匹配字符串的开头。
    $:匹配字符串的结尾。
    .:匹配除换行符外的任意一个字符。
    *:匹配前一个字符零次或多次。
    +:匹配前一个字符一次或多次。
    ?:匹配前一个字符零次或一次。
    []:匹配其中任意一个字符,常用于指定一组字符。
    [^]:不包含其中任意一个字符,常用于排除一组字符。
    |:匹配左右两边任意一个表达式。
    ():捕获匹配到的子字符串,可以使用反向引用来重复使用。

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

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

相关文章

NCNN----Monodepthv2单目深度估计 小米手机部署

题目要求&#xff1a;学习了解单目深度估计模型MonoDepthv2&#xff0c;基于NCNN推理框架部署到小米手机 MonoDepthv2 论文&#xff1a;Digging Into Self-Supervised Monocular Depth Estimation MonoDepthv2 源码&#xff1a;Monodepth2 GitHub 分析&#xff1a; 1&#xff0…

Illustrator如何进行任务自动化之实例演示?

文章目录 0.引言1.动作的录制2.对文件播放动作3.批处理 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对Illustrator进行了学习&#xff0c;本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对任务自动化进行…

Cadence技巧总结学习(DRC、Annotate)持续更新~

Cadence技巧总结学习持续更新~ 你还可以再哪里看到这篇文章&#xff1a;知乎 1. 画叉 对于芯片上不用的引脚信号画上号&#xff0c;如下&#xff1a; 按大写X就可以了&#xff0c;或是双脚引脚&#xff0c;在跳出的界面中&#xff0c;Is No Connect上✔。 2. 画线快捷键&#…

【关于C++中----智能指针】

文章目录 一、概念引入二、内存泄漏2.1 内存泄漏概念及其危害2.2 内存泄漏分类2.3 避免内存泄漏 三、智能指针的原理3.1 RAII3.2 像指针一样 四、三类智能指针4.1 auto_ptr4.2 unique_ptr4.3 shared_ptr 五、循环引用和weak_ptr 一、概念引入 在我们日常写代码过程中&#xff…

ARM学习(21)STM32 外设Can的认识与驱动编写

笔者来聊聊can的认识以及can接收数据的驱动编写 1、STM32 Can 外设的认识 Can的特性就不多说了&#xff0c;主要来聊聊can的一些标识符以及收发状态。can有一套收发机制&#xff0c;发送和接收都有硬件缓存&#xff0c;叫邮箱&#xff0c;通过下面的图可以看出&#xff0c;下面…

ESP32学习笔记 -- ESP32-S3 使用外部 PSRAM

ESP32-S3是乐鑫科技推出的一款专为物联网而生的SOC芯片,该芯片同时支持WIFI和BLE蓝牙功能,集成了高性能的Xtensa 32位LX7双核处理器,最高主频可达240MHz。 根据乐鑫官方资料介绍,该芯片内置512KB SRAM片上内存,并且具有45个可编程GPIO管脚和丰富的通信接口。为了更好地扩…

Flask框架之路由与蓝图的使用

路由与蓝图 路由路由概述路由的基本使用查看路由信息url_map对象命令行方式 HTTP请求方法 蓝图概述蓝图的基本使用蓝图的拆分指定蓝图的url前缀蓝图构造URL蓝图静态文件蓝图模板目录 路由 路由概述 在Flask中&#xff0c;路由用于将HTTP请求与特定的Python函数相匹配。通过定义…

K8s-Pod概念、创建及常用命令

文章目录 一、Pod概念1、Pod是什么&#xff1f;2、Pod网络共享实现方式3、Pod存储共享方式4、创建Pod整体流程 二、使用YAML文件定义Pod资源1、Pod资源清单YAML文件书写技巧1. YAML语法格式&#xff1a;2. 配置Linux tab缩进两个空格3. 使用kubectl explain帮助命令 2、创建Pod…

章节2:01-Java序列化和反序列化

章节2&#xff1a;01-Java序列化和反序列化 01-Java序列化和反序列化 基础环境 JDK解压版&#xff1a;包含Java运行时环境 IDEA&#xff1a;开发工具 Maven&#xff1a;jar包依赖管理 Tomcat&#xff1a;HTTP服务器 Burp Suite&#xff1a;发送HTTP请求 Kali&#xff1…

ANSYS APDL谐响应分析——悬臂梁的频响函数计算以及幅值、角度(相位)、分贝计算

问题描述 研究一根悬臂梁&#xff0c;材质为钢材。长度 L 2 L2 L2 米&#xff1b;截面为矩形&#xff0c;矩形的长度为 H 5 c m H 5cm H5cm&#xff0c;宽度为 B 2 c m B 2cm B2cm 。 建模思路&#xff1a; 先建立节点&#xff0c;然后用节点生成单元。使用n命令&…

book-riscv-rev1.pdf 翻译(自用,更新完成)第一章 操作系统接口

Job of operating system: 操作系统使得多个程序分享一台计算机&#xff0c;提供一系列仅靠硬件无法支持的服务。 管理与抽象低级别硬件&#xff08;如&#xff1a;文件处理程序不需要关注使用哪种硬盘&#xff09;使得多个程序分享硬件&#xff08;programs that can run at…

797. 差分(C++和Python3)——2023.5.7打卡

文章目录 QuestionIdeasCode Question 输入一个长度为 n 的整数序列。 接下来输入 m 个操作&#xff0c;每个操作包含三个整数 l,r,c &#xff0c;表示将序列中 [l,r] 之间的每个数加上 c 。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两个整数 n 和 m 。 第二…

高性能流媒体硬解码

目录 高性能流媒体硬解码前言1. What、Why and How1.1 What1.2 Why&#xff1f;1.3 How&#xff1f; 2. 离散傅里叶变换(DFT)2.1 JPEG编码2.2 哈夫曼编码(Huffman Coding) 3. 视频流媒体前置知识3.1 视频文件的构成3.2 视频的编码与封装3.3 H264编码的分层3.4 RTSP之RTP(Real-t…

【clang】安装clang编译器并将linux默认编译器改为clang

目录 省心操作法手动安装 本文是他人智慧的总结个人实践。 省心操作法 缺点&#xff1a; clang版本不能自己选择&#xff1b;我的系统是ubuntu 20&#xff0c;安装后是clang10.0版本 优点&#xff1a;省心&#xff0c;基本不会踩坑 手动安装 参考这篇文章ubuntu20.04 安装cl…

RabbitMQ --- 死信交换机

一、简介 1.1、什么是死信交换机 什么是死信&#xff1f; 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff08;dead letter&#xff09;&#xff1a; 消费者使用basic.reject或 basic.nack声明消费失败&#xff0c;并且消息的requeue参数设置为false…

超详细-自动化测试从选型到落地,2023年我从10k涨到了18k*14薪...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

系统集成项目管理工程师 下午 真题 及考点(2021年上下半年)

文章目录 2021年下半年试题一&#xff1a;第18章 项目风险管理&#xff0c;风险应对策略&#xff0c;风险的性质&#xff08;客观、偶然、相对、社会、不确定&#xff09;试题二&#xff1a;第9章 项目成本管理&#xff0c;执行绩效&#xff08;即CV和SV&#xff09;&#xff0…

HAL库版FreeRTOS(中)

目录 FreeRTOS 任务切换PendSV 异常PendSV 中断服务函数FreeRTOS 确定下一个要运行的任务函数vTaskSwitchContext()函数taskSELECT_HIGHEST_PRIORITY_TASK() PendSV 异常何时触发FreeRTOS 时间片调度实验功能设计软件设计下载验证 FreeRTOS 内核控制函数FreeRTOS 内核控制函数预…

蓝牙设备的名称与MAC地址及UUID

每个蓝牙设备都具有各自的地址和名称&#xff0c;他们之间通过唯一通过地址和名称进行数据交互。本文详细讲述了蓝牙设备的名称和地址的格式及作用。 名称 蓝牙设备具有各自的名称&#xff0c;通常为字母与数字的组合. MAC地址 与Ethernet相同&#xff0c;MAC地址为48bit的…

VTK安装路径检查

/usr/include/vtk-7.1——————VTK头文件