Linux高级编程_26_shell

news2024/12/28 20:15:59

文章目录

  • shell
    • 概述:
    • 分类:
    • 语法:
      • 1、#!
      • 2、#
      • 3、执行:
        • 方式1:
        • 方式2:
        • 方式3:
      • 注意:
    • 第一个shell脚本
    • 变量
      • 变量的定义:
      • 变量的修改
      • 变量的取值
      • 撤销变量
      • 声明只读变量
      • 导出变量:
      • declare -i 将变量强制转换为数字
    • 预设变量
    • 脚本变量的特殊用法
    • 键盘录入
      • 语法
  • 条件测试语句
    • 语法:
    • 文件测试
    • 字符串测试
    • 数值测试
      • 扩展:
    • 复合测试:
    • 多重条件:
    • if 语句
    • case语句
    • for语句
    • while语句
    • until语句
    • 函数

shell

概述:

既是一种应用程序,又是一种程序设计语言

从应用程序角度理解:

交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能

​ 称为 shell 命令解析器

作用:

​ shell 是用户 与 Linux 内核之间的 接口程序

在这里插入图片描述

用户在提示符下输入的命令[如 cd pwd ls …]都由 shell 先解释然后传给 Linux 核心

它调用了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行

Linux 系统中提供了好几种不同的shell命令解释器,如 sh、ash、bash等。

一般默认使用 bash 作为默认的解释器。

后面编写的shell脚本,都是由上述shell命令解释器解释执行的。

查看默认 shell 命令解释器

echo $SHELL

从程序设计语言角度理解:

概念:

​ 它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括
循环和分支
​ 完成类似于windows下批处理操作,简化我们对系统的管理与应用程序的部署称
之为shell脚本

学过的c/c++等语言,属于编译性语言(编写完成后需要使用编译器完成编译、汇编、链接等过程变为二进制代码方可执行)

shell脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程
序,增加可执行权限,即可在安装shell命令解释器的环境下执行

​ 增加可执行权限命令:

chmod +x 文件名 注意文件名路径

分类:

  • 系统调用

    • 这类脚本无需用户调用,系统会在合适的时候调用,如:/etc/profile、 ~/.bashrc 等
      	/etc/profile:  
      		启动时调用
      	 ~/.bashrc:
           用户登录时调用
      
  • 用户编写手动调用

    • 示例:控制台打印hello shell 不需要编译器 只要有命令解析器就行

      代码:
      #!/bin/bash
      echo "hello shell"
      增加可执行权限
      运行
      

语法:

1、#!

定义以开头:#!/bin/bash

​ #! 用来声明脚本由什么shell 解释,否则使用默认shell

2、#

单个"#"号代表注释当前行

3、执行:

方式1:
./shell 文件名
这种方式先检测执行的文件中是否存在指定的shel命令解析器,如果存在使用指定的,如果不存在 使用默认的
开启子shell 由shell执行
方式2:
shell命令解析器名称  shell文件名
这种方式不会检测文件中是否存在指定的shell命令解析器,使用执行命令前指定的shell解析器
开启子shell 由子shell执行
方式3:
source shell文件名
或
. shell文件名
这种方式不会开启 子(新的)shell,直接由当前的shell去解释执行脚本

在这里插入图片描述

注意:

不要在window下使用最好

创建文件时:
		如果是在windows中创建编写的shell脚本文件,拖拽到Liunx下无法运行,因为windows与Liunx下\表示的含义不同,所以导致程序无法被识别
		解决方案1:
				在Liunx中使用vim编辑器,在最后一行模式输入Setff=unix
		解决方案2:
				在Linux中安装dos2unix,使用dos2unix转换
			步骤:
				1,命令行输入:sudo apt-age instal1 dos2unix
				2,命令行输入:dos2unix文件地址

第一个shell脚本

步骤:

  • 1 创建一个文件
  • 2 指定解析器
    • #!/bin/bash
  • 3 编写命令
    • linux命令
  • 4 保存
  • 5 增加权限
    • chmod +x 文件名
  • 6 执行

变量

作用:临时记录一个值或可以被改变的数据

分类:

  • 系统变量
    • 使用 env 查看 注意 =号左边为变量名 =右边为变量值
  • 自定义变量

变量的定义:

变量的定义与初始化:

  • 变量名=值
    • 注意:等号两边不能有空格
    • 此时所有的值都是字符串

变量的修改

  • 变量名=值
    • 注意:
      • 此时变量已经被定义

变量的取值

  • $变量名

撤销变量

  • unset 变量名

示例:

文件名 00_shell

#!/bin/bash
data=100   #定义变量
echo $data  #取值
unset data    #撤销变量
chmod -x 00_shell # 提升权限

./00shell  #执行

声明只读变量

  • readonly 变量名=值
    • 注意:
      • 只读变量 不能撤销 不能改值

导出变量:

  • export 变量名
    • 作用: 导出变量,导出给父 shell
      • 1 2 会导给 父shell 3 因为不会开启子shell 所以会导出到系统变量

declare -i 将变量强制转换为数字

  • declare -i 变量名

示例:

#!/bin/bash
declare -i xxz=100
xxz=&xxz*2
echo $xxz    #结果 是200 

注意:

  • 子shell 可以访问父shell的变量
  • 父shell 不能访问子shell的变量

预设变量

  • $#:传给shell脚本参数的数量
  • $*:传给shell脚本参数的内容
  • $1、$2、$3、、、、$9:运行脚本时传递给其的参数,用空格隔开
  • $?:命令执行后返回的状态
    • 用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)。
  • $0:当前执行的进程名
  • $$:当前进程的进程号
    • $$:变量最见的用途是用作临时文件的名字以保证临时文件不会重复

脚本变量的特殊用法

"": 包含的变量会被解释
'':包含的变量会作为字符串处理
``:反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量
\:  同c语言\n \t \r \a 等echo命令需加-e转义(bash解析器需求)
	echo -e "123\n456"  #这样才会换行
(命令):由子she11来完成,不影响当前she11中的变量,命令前后必须有空格
{命令}: 在当前shell中执行,会影响当前变量,命令前后必须有空格

键盘录入

语法

  • read 变量名
  • read -p 提示内容 变量名

示例:

#!/bin/bash
num=0
# echo "请输入一个数:"
# read num
# 或
read -p "请输入一个数:" num
echo "num=$num"

条件测试语句

语法:

语法1: test 条件

语法2:[ 条件 ] 注意:条件前后必须有空格

文件测试

文件测试:测试文件状态的条件表达式
-e 	是否存在
-d	是否为目录
-f	是否为文件
-r	是否可读
-W	是否可写
-x	是否可执行
-L	是否连接
-c	是否字符设备
-b	是否为块设备
-S	是否文件非空

示例:

test -e kkk
echo $?    #   $? 返回执行状态

返回0 为真 非0 为假
[ -e kkk ]
echo $?

字符串测试

=  两个字符串相等
!= 两个字符串不相等
-Z 空串
-n 非空串
		#注意:=! =前后要有空格

数值测试

-eq		数值相等
-ne		数值不相等
-gt		数 1 大于数 2
-ge		数 1 大于等于数 2
-le		数 1 小于等于数 2
-1t		数 1 小于数 2

扩展:

#${num:-Va]}如果num存在,返回num,否则返回va]
echo ${x:-10}
#${num:=Va]}如果hum存在,返回num,否则返回va1,并将va1赋值给num
echo ${y:=10}
echo $y

复合测试:

&&
command1 && command2
&&左边命令(commandl)执行成功(即返回0)shell 才执行&&右边的命令(command2)
||
command1 1l command2
丨左边的命令(command1)未执行成功(即返回非0)shel]才执行丨|右边的命令(command2)

多重条件:

-a:与
-o: 或
!: 非

示例:

#!/bin/bash
#输入文件路径判断文件是否可读可写可执行
echo 请输入文件路径
read filename
[ -r $filename -a -w $filename -a -x $filename ]
echo $filename 是否可读可写可执行:$?
[! -x $filename ]
echo $filename 是否不可执行:$?

if 语句

if [ 条件1 ];then
	执行第1段程序
elif [ 条件2 ];then
	执行第2段程序
elif[ 条件3 ];then
	执行第3段程序
....
else
	执行第n段程序
fi

示例:

#!/bin/bash
read -p 请输入年龄 age
elif [ $age -ge 18 ];then
echo 成年人
else
echo 未成年
fi

case语句

case $变量名 in
"值1") 
	语句1
;;
"值2")
	语句2
;;
"值2")
	语句3
;;
esac

	扩展  exit 1 #退出shell

示例

for语句

for((初始值;限制值;执行步阶))
do
程序段
done

示例:

#!/bin/bash
#计算100以内数之和
#declare-is强制将s作为int型数值,需要使用./运行
declare -i s=0
declare -i sum=0
for(( s=0; s<=100; s++ ))
do
sum=$sum+$s;
done
echo$sum

while语句

while [ 条件 ]
do
执行语句
done

示例:

注意 一定要注意 空格 的问题

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

扩展:

#!/bin/bash
# 变量名=$(( 值1 + 值2 ))
n01=10
n02=2
n03=$(( $n01 + $n02 ))
echo $n03
# 变量名=$(( 值1 - 值2 ))
n04=$(( $n01 - $n02 ))
echo $n04
# 变量名=$(( 值1 * 值2 ))
# 变量名=$(( 值1 / 值2 ))
# 变量名=$(( 值1 % 值2 ))
# 变量名=$(( 变量名-- ))
# n05=$(( n01-- ))
# echo $n05
# echo $n01
# 变量名=$(( --变量名 ))
n05=$(( --n01 ))
echo $n05
echo $n01
# 变量名=$(( 变量名++ ))
# 变量名=$(( ++变量名 ))
# 变量名=$(( -10 > 1 ? 10 : 1 ))
n06=$(( -10 > 1 ? 10 : 1 ))
echo $n06

until语句

语法:

until [ 条件 ]
do
	程序段
done
	注意:
			当条件表达式为假执行循环体中的代码,如果为真,结束循环

示例:

#!/bin/bash
i=0
until [ $i -ge 10 ]
do
i=$(( ++i ))
echo $i
done

函数

定义:

语法1

函数名(){
	程序段
}

语法2
function 函数名()
{
	程序段
}

调用

函数名 参数1 参数2....

示例:

#!/bin/bash
#函数的定义1
#函数名(){
#}
method()
{
	echo 自定义函数被执行
}
#函数的调用:函数名 参数1 参数2 ...
method

=
#函数的定义2
#function 函数名(){
#}
function method02()
{
	echo 自定义函数2被执行
}

method02

add()
{
	num=$(( $1+$2 ))
	return $num
}
add 2 21
echo $?

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

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

相关文章

【HDP】zookeeper未授权漏洞修复

目录 一、禁用四字命令 二、ZK-Client增加kerberos 一、禁用四字命令 Zookeeper四字命令的使用方式非常简单&#xff0c;通常有两种方式。第一种是通过Telnet方式&#xff0c;使用Telnet客户端登录ZooKeeper的对外服务端口&#xff0c;然后直接使用四字命令即可&#xff1b;第…

Kafka快速实战与基本原理详解

笔记:https://note.youdao.com/ynoteshare/index.html?id=b0357bdb4821ed2e35ecdbdacd65aa06&type=note&_time=1727570043631 启动kafka之前先启动zookper 看看ZK里面都有什么数据 : 刚开始什么数据都没有 接下来启动kafka,启动好后,日志在这里看: 启动好了kaf…

处于风口期的本地生活服务项目有哪些?如何入局才能赚得更多?

随着多家互联网大厂在本地生活服务板块的投入力度不断加大&#xff0c;越来越多的人都养成了在其本地生活服务板块消费的习惯&#xff0c;令各大平台本地生活业务日渐兴盛的同时&#xff0c;也让许多创业者发现了本地生活服务赛道中所蕴含着的商机&#xff0c;本地生活服务项目…

苏州 数字化科技展厅展馆-「世岩科技」一站式服务商

数字化科技展厅展馆设计施工是一个综合性强、技术要求高的项目&#xff0c;涉及到众多方面的要点。以下是对数字化科技展厅展馆设计施工要点的详细分析&#xff1a; 一、明确目标与定位 在设计之初&#xff0c;必须明确展厅的目标和定位。这包括确定展厅的主题、目标受众、展…

四DHCP服务实验

复习 &#xff1a;DHCP基础实验&#xff1a; 1. 在server端安装dhcp yum -y install dhcp 2. 找回dhcp的配置文件&#xff1a;/etc/dhcp/dhcpd.conf cp -a /usr/share/doc/dhcp-4.25/dhcpd.conf.example /etc/dhcp/dhcpd.conf 3. 修改/etc/dhcp/dhcpd.conf配…

抽象类、比较器和接口

一.抽象类 1.抽象类的概念&#xff1a;如果一个类中没有包含足够的信息来描述一个具体的对象&#xff0c;这样的类就是抽象类。&#xff08;图例说明&#xff1a;&#xff09; 2.抽象方法的概念&#xff1a;当一个方法被abstract来修饰&#xff0c;此时代表着这个方法可以不进…

C#知识|基于反射和接口实现抽象工厂设计模式

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 01 应用场景 在项目的多数据库支持上、业务的多算法封装、以及各种变化的业务中&#xff1b; 02 抽象工厂组成 抽象工厂包括抽象产品&#xff08;即业务接口&#xff0c;可以通过抽象类或抽象接口设计&#xff09;…

WSL2Linux 子系统(十一)

WSL 网络改为桥接模式&#xff08;默认NAT) 上一篇文章 《WSL2Linux 子系统(十)》 详细讲述 WSL&#xff08;Windows Subsystem for Linux&#xff09;WSL 显示画面的几种方法。本篇讲述 WSL 网络转为桥接模式的两种方法。 桥接模式允许 WSL 实例获得一个与宿主机在同一子网中…

【包教包会】CocosCreator3.x框架——音频声音模块(无需导入、无需常驻节点)

下载地址&#xff1a;AudioDemo3.x: CocosCreator3.x框架——音频模块 注意事项&#xff1a; 1、gi.musicPlay、gi.soundPlay是同步函数&#xff0c;使用前必须先将音频加载到缓存 Demo通过SceneLoading实现了一个极简的Loading页面&#xff0c;将音频全部加载后进入游戏&…

JAVA智慧社区系统跑腿家政本地生活商城系统小程序源码

智慧社区系统集成跑腿家政与本地生活商城 —— 打造便捷高效的社区生活圈 &#x1f3e0; 智慧社区新时代&#xff1a;一站式服务新体验 在快节奏的都市生活中&#xff0c;智慧社区系统正悄然改变着我们的生活方式。它不再只是一个居住的空间&#xff0c;而是集成了跑腿家政、本…

AI换脸技术新纪元:直播与视频创作的新利器

在数字媒体时代&#xff0c;实时面部交换技术正变得越来越流行。它不仅为视频创作者提供了新的表达方式&#xff0c;也为直播行业带来了革命性的变化。以下是一些目前市场上领先的实时面部交换软件&#xff1a; &#x1f31f; FaceFusion FaceFusion 是一款功能强大的实时面部…

2023ICPC区域赛杭州站

VP链接&#xff1a;Dashboard - The 2023 ICPC Asia Hangzhou Regional Contest (The 2nd Universal Cup. Stage 22: Hangzhou) - Codeforces D. Operator Precedence 一道构造题&#xff0c;将序列构造成 1 2 -1 2 -1 ...... 2 -1 x。根据题目条件&#xff0c;可以推出来 x …

全新带货思路,用AI美女数字人做情感赛道,27天销量1559单

本期就另外分享一个全新的AI美女数字人带货思路&#xff0c;如果你正好对AI视频带货感兴趣&#xff0c;那么本期内容直接给你抹平“视频号上AI美女数字人玩法信息差”&#xff0c;最主要还是趁这类内容还不卷的时候&#xff0c;赶紧行动起来&#xff01; 更多实操教程和数字人工…

智能AI对话绘画二合一网站源码系统 带完整的安装代码包以及搭建部署教程

系统概述 智能AI对话绘画二合一网站源码系统是一款基于先进的人工智能技术开发的综合性网站源码系统。该系统将AI对话功能和AI绘画功能完美融合&#xff0c;用户可以通过简单的对话指令&#xff0c;让系统生成符合要求的绘画作品&#xff0c;或者通过对话了解绘画相关的知识和…

世优科技出席36氪2024具身智能大会圆桌对话,入选创新应用案例

具身智能&#xff0c;作为人工智能领域的前沿分支&#xff0c;聚焦于构建能够通过集成感知与交互机制&#xff0c;在物理环境中实现动态适应与实时互动的智能系统及机器人平台。 9月26日&#xff0c;由36氪主办的“2024具身智能大会”以“让AI通向物理世界”为主题&#xff0c;…

Unity NetCode 客户端连接不上服务器,局域网模式 Failed to connect to server.

报错代码: Failed to connect to server. 报错截图&#xff1a; 解决办法: 服务端:绑定127.0.0.1和端口 客户端:写好对应服务端ip和端口 如何查看服务端所在局域网IP&#xff0c;192.xxx.xxx.xx,就不用教了吧。 注意这个钩&#xff0c;得点下&#xff0c;默认不勾选。 意…

【MYSQL】mysql约束---自增长约束(auto_increment)

1、概念 在Mysql中&#xff0c;当主键为自增长后&#xff0c;这个主键的值就不再需要用户输入数据了&#xff0c;而由数据库系统根据定义自动赋值。每增加一条记录&#xff0c;主键会自动以相同的步长进行增长。 注意&#xff1a;自增长约束通常与主键放在一起使用。 通过给…

AutoGen框架进行多智能体协作—反思与提升博客文章质量(三)

1. 实践场景 两个代理之间通过互相反思以提升博客质量。其中一个代理作为修改意见提出者&#xff0c;另一个代理为写作者。写作者依据要求进行内容创作&#xff0c;评论员则提出修改要求&#xff0c;作者再根据要求对内容进行重新调整。 2. 代码实践 本节学习内容&#xff1a…

一文上手SpringSecurity【八】

RBAC&#xff08;Role-Based Access Control&#xff09;&#xff0c;基于角色的访问控制。通过用户关联角色&#xff0c;角色关联权限&#xff0c;来间接的为用户赋予权限。 一、RBAC介绍 RBAC&#xff08;Role-Based Access Control&#xff09;&#xff0c;即基于角色的访…

Unity实战案例全解析:RTS游戏的框选和阵型功能(3)生成范围检测框 +重置框选操作

前篇&#xff1a;Unity实战案例全解析&#xff1a;RTS游戏的框选和阵型功能&#xff08;2&#xff09; 生成选择框-CSDN博客 本案例来源于unity唐老狮&#xff0c;有兴趣的小伙伴可以去泰克在线观看该课程 我只是对重要功能进行分析和做出笔记分享&#xff0c;并未无师自通&…