Linux高级编程_26_shell

文章目录

  • 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.mfbz.cn/a/884983.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贝锐蒲公英网盘首发,秒建私有云,高速远程访问

虽然公共网盘带来了不少便利&#xff0c;但是大家对隐私泄露和重要数据泄密的担忧也随之增加。如果想要确保数据安全&#xff0c;自建私有云似乎是一条出路&#xff0c;然而面对搭建私有云的复杂步骤&#xff0c;许多人感到力不从心&#xff0c;NAS设备的成本也往往让人望而却步…

【软设】项目管理

【软设】项目管理 (要会根据Gantt和Pert图求关键路径&#xff0c;可以看3.3的示例来了解Pert图) 一.进度管理 进度管理 是项目管理的重要组成部分&#xff0c;旨在确保项目在规定的时间范围内完成。进度管理不仅包括项目活动的规划&#xff0c;还包括监控和控制项目活动的进…

制造企业如何提升项目管理效率?惠科股份选择奥博思PowerProject项目管理系统

全球知名的显示方案综合服务商 - 惠科股份有限公司与北京奥博思达成合作&#xff0c;基于奥博思 PowerProject 搭建企业级项目管理平台。满足惠科多产品多业务领域的项目全周期管理。助力企业在技术研发、产品创新等方面继续取得行业领先优势。 同时&#xff0c;PowerProject …

NLP任务之预测最后一个词

目录 1.加载预训练模型 2 从本地加载数据集 3.数据集处理 4.下游任务模型 5.测试代码 6.训练代码 7.保存训练好的模型 8. 加载 保存的模型 1.加载预训练模型 #加载预训练模型 from transformers import AutoTokenizer#预训练模型&#xff1a;distilgpt2 #use_fast…

论文笔记:Gradient Episodic Memory for Continual Learning

1. Contribution 提出了一组指标来评估模型在连续数据上的学习情况。这些指标不仅通过测试准确性来表征模型&#xff0c;还通过其跨任务迁移知识的能力来表征模型。针对持续学习任务&#xff0c;提出了GEM模型&#xff08;Gradient Episodic Memory&#xff09;&#xff0c;它…

True NAS禁用ipv6

在 TrueNAS Scale 中&#xff0c;禁用 IPv6 的方法如下&#xff1a;12 进入 System->Advanced->Sysctl&#xff0c;设置一个 sysctl 可调整变量 net.ipv6.conf.all.disable_ipv6&#xff0c;值为 1&#xff0c;以完全禁用 IPv6。\

SOMEIP_ETS_139: SD_Options_Array_too_short

测试目的&#xff1a; 验证DUT能够拒绝一个选项数组长度短于所需的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个选项数组长度不足以包含所有必需选项的SubscribeEventgro…

【C++篇】启航——初识C++(上篇)

目录 引言 一、C的起源和发展史 1.起源 2.C版本更新 二、C在⼯作领域中的应⽤ 三、C入门建议 1.参考文档 2.推荐书籍 四、C的第一个程序 1.C语言写法 2.C写法 五、命名空间 1.为什么要有命名空间 2.定义命名空间 3.主要特点 4.使用示例 六、C输⼊&输出 …

【muduo源码分析】「阻塞」「非阻塞」「同步」「异步」

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言何为「muduo库」安装muduo库阻塞、非阻塞、同步、异步数据准备数据准备 引言 从本篇博客开始&#xff0c;我会陆续发表muduo库源码分析的相关文章。感谢大家的持续关注&#xff01;&#xff01;…

Vue|插件

在 Vue.js 中&#xff0c;插件是用来扩展 Vue 功能的一种方式&#xff0c;能够帮助开发者扩展和复用功能。通过合理使用插件&#xff0c;可以提高代码的组织性和可维护性 目录 如何使用插件?插件的定义创建及使用插件插件的参数插件的扩展 总结 如何使用插件? 插件的定义 插…

2-107 基于matlab的hsv空间双边滤波去雾图像增强算法

基于matlab的hsv空间双边滤波去雾图像增强算法&#xff0c;原始图像经过光照增强后&#xff0c;将RGB转成hsv&#xff0c;进行图像增强处理&#xff0c;使图像更加清晰。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a; 2-107 基于matlab的hsv空间双边滤…

论文阅读 | 可证安全隐写(网络空间安全科学学报 2023)

可证安全隐写&#xff1a;理论、应用与展望 一、什么是可证安全隐写&#xff1f; 对于经验安全的隐写算法&#xff0c;即使其算法设计得相当周密&#xff0c;隐写分析者&#xff08;攻击者&#xff09;在观察了足够数量的载密&#xff08;含有隐写信息的数据&#xff09;和载体…

推荐4款2024年热门的PDF转ppt工具

有时候&#xff0c;我们为了方便&#xff0c;需要将PDF里面的内容直接转换的PPT的格式&#xff0c;既方便自己演示和讲解&#xff0c;也让我们可以更加灵活的进行文件的编辑和修改。如果大家不知道要如何进行操作的话&#xff0c;我可以为大家推荐几个比窘方便实用的PDF转换工具…

html TAB、table生成

1. 代码 <!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 10px solid #ccc; padding: 30px; mar…

赛氪作媒体支持单位受邀参加首届科普翻译与跨学科专业学术研讨会

2024年9月22日&#xff0c;正值全国科普日之际&#xff0c;首届科普翻译与跨学科专业学术研讨会在上海健康与营养研究所信息中心励志厅成功举行并圆满结束。此次研讨会汇聚了来自全国各地的近60名专家学者、学界及企业界代表&#xff0c;共同探讨科普翻译与跨学科专业的发展。作…

BaseCTF2024 web

Web [Week1] HTTP 是什么呀 GET: ?basectf%77%65%31%63%25%30%30%6d%65POST: BaseflgX-Forwarded-For:127.0.0.1Referer: BaseCookie: c00k13i cant eat itUser-Agent: Base有Location跳转, 抓包得到flag: QmFzZUNURntkZGUzZjA0Yy1hMDg5LTQwNGMtOTFjNi01ODZjMzAxMzM3Y2J9Cg…

Springboot jPA+thymeleaf实现增删改查

项目结构 pom文件 配置相关依赖&#xff1a; 2.thymeleaf有点类似于jstlel th:href"{url}表示这是一个链接 th:each"user : ${users}"相当于foreach&#xff0c;对user进行循环遍历 th:if进行if条件判断 {变量} 与 ${变量}的区别: 4.配置好application.ym…

基于SpringBoot+Vue+MySQL的体育商城系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网的飞速发展&#xff0c;电子商务已成为人们日常生活中不可或缺的一部分。体育用品市场作为其中的一个重要分支&#xff0c;也逐渐向线上转移。基于SpringBootVueMySQL的体育商城系统应运而生&#xff0c;旨在通过构建…

E34.【C语言】位段练习题

1.题目 分析下列代码中位段在内存中的排布(已知测试平台为VS2022) struct S {int a : 2;int b : 5;int c : 10;int d : 30; };int main() {struct S s { 0 };return 0; } 有关位段的知识点见64.【C语言】再议结构体(下)文 2.提示 VS满足:由低地址向高地址存储,按浪费空间…

Halo 专业版,含推荐码

立即体验 准备好体验 Halo 了吗&#xff1f;你可以查阅我们完整的部署文档&#xff0c;或者在线使用 Demo 进行体验。 部署指南&#xff1a;www.halo.run Halo 专业版在购买界面输入优惠码&#xff1a; lqMawh8t 使用优惠码优惠码购买专业版&#xff0c;单件 7 折&#xff…