# Linux 学习记录37(C高级篇)

news2024/11/22 6:34:52

Linux 学习记录37(C高级篇)

在这里插入图片描述

本文目录

  • Linux 学习记录37(C高级篇)
  • 一、常见的shell解析器
  • 二、变量
    • 1. shell脚本外部传参
    • 2. 输入输出
      • (1. 输出
      • (2. 输入
    • 3. 命令置换符
    • 4. shell中的数组
  • 三、shell中的算数运算
    • 1. (())运算
    • 2. $[ ]运算
    • 3. let运算
    • 4. expr指令
      • (1.数据运算
      • (3. 字符运算
  • 四、shell中的分支结构
    • 1. if
      • (1. if单分支语句
      • (2. if多分支语句
    • 2. test指令
      • (1. 对数据
      • (2. 对字符串
      • (3. 对文件操作
  • 思维导图
  • 练习
    • 1. 编写一个名为myfirstshell.sh的脚本,它包括以下内容
    • 2. 写一个shell脚本,获取当前用户名,用户id和工作路径
    • 3. 编写脚本,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
    • 4. 输入学生成绩,判断等级

一、常见的shell解析器

  1. bash:与终端的交互性较好,一般用于linux使用的都是bash
  2. sh:与终端的交互器较差,开发板的解析器常用的是sh

二、变量

1. shell脚本外部传参

#!/bin/bash
#获取外部参数个数(不包含脚本名)
echo "$#"

#直接获取所有参数
echo "$@/$*"

#打印外部参数
echo "$1 $2 $3"
#如果参数的位置>=10则需要加上{}
echo "${10}"

功能:

在这里插入图片描述

2. 输入输出

(1. 输出

echo 要输出的内容
	1. 会自动换行
	2. 默认不解析转义字符
参数:
	1. -n:取消换行
	2. -e:解析转义字符

(2. 输入

read var  ---->read后面直接跟变量名,如果read后面接多个变量,多个变量获取数据时以空格作为分隔
#如果没有多个变量,空格会作为字符串的一部分
read -p "提示信息" var   #-p用于输出提示信息
read -s var   #不回显终端的输入
read -t 4 var   #如果4秒不输入,就结束输入
raed -n 3 var   #输入三个字符就停止

3. 命令置换符

将指令运行的结果赋值给变量

val=`ls`  反引号
将ls的结果赋值给变量val
=============================
val=$(ls) 
将ls的结果赋值给变量val

4. shell中的数组

shell中只有一维数组,shell中支持 稀疏数组 ,shell中支持变长数组
稀疏数组:不连续赋值变量的数组

定义:
数组名=(初始值1 初始值2 初始值3 ...)
arr=(11 22 33 hello)
=================================
数组名=([下标1]=初始值1 [下标3]=初始值3 [下标5]=初始值5 ...) #稀疏数组
arr=([1]=11 [3]=33 [5]55 [7]=hello)
能够不按顺序赋值
=================================
访问变量
arr[6]=99 #给变量赋值
echo ${arr[5]}   #访问数组中的第6个元素
echo ${arr}      #访问数组中的第1个元素
echo ${arr[@]}   #访问数组中的全部元素
echo ${arr[*]}   #访问数组中的全部元素
echo ${#arr[*]}  #统计数组中的全部元素个数
echo ${#arr[@]}  #统计数组中的全部元素个数
echo ${#arr[3]}  #统计数组中这个元素字符的个数
==================================
arr=(12 566 hello)
arr1=([0]=90 [5]=100 [7]=67)  #稀疏数组,数组中的下标不连续

#arr2和arr3的区别,在于元素个数的不同,因为arr2中两个数组链接时没有加空格

arr2=(${arr[*]}${arr1[@]})
arr3=(${arr[*]} ${arr1[@]})
echo ${arr2[2]}  #hello90
echo ${arr3[2]}  #hello

三、shell中的算数运算

shell是弱数据类型的语法

所以shell擅长执行指令,不擅长做运算操作,所以通常需要借助工具完成运算

如:(()),$[],let,expr

1. (())运算

1. (())常用于整形数据运算
2. 支持大部分的C语言语法,并支持C语法中的复杂语法
3. 支持幂运算,**
4. 在(())内使用变量可以加$,也可以不加$,(())的两侧可以有空格,也可以没有空格
5. 使用var1=$((var1+var2)),获取计算结果
#!/bin/bash
var1=91
var2=81
var1=$((var1+var2))
echo ${var1}
===============================
幂运算:
#!/bin/bash
var2=3
var2=$((var2**3))
echo ${var2}
===============================
一个括号内可以存放多个表达式,表达式都会依次执行
#!/bin/bash
var1=10
var2=90
((var1=var1**3,var2++,++var2,var2=var1+var2))
echo $var1
echo $var2

示例:

#!/bin/bash
read  -p "请输入第一个参数" var1
read  -p "请输入第二个参数" var2

echo "两数和:$((var1+var2))"
echo "较大值:$(((var1>var2)?var1:var2))"

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

2. $[ ]运算

计算结果必须使用变量名接收

格式:变量名=$[表达式1,表达式2,表达式3…]

1. 可以有空格,也可以没有空格
2. 使用变量可以加$,也可以不加$
#!/bin/bash
var1=10
var2=11
var3=$[var1+var2]
echo ${var3}

在这里插入图片描述

3. let运算

1. 格式:let 变量名=表达式,let和变量名间一定要加空格
2. 运算符两侧不能有空格
3. 使用变量可以加$,也可以不加$
4. let 必须放在最前面
#!/bin/bash
var1=10
var2=11
#let运算时可以加$也可以不加
let sum=$var1+var2
echo ${var3}

4. expr指令

格式:expr 表达式
1. 使用变量时必须加$
2. 算数运算的两侧一定要加空格
3. expr不支持自增自减
4. 会自动回显不支持幂运算
5. 特殊字符需要转义,如 . * > < 等等符号需要加\转义,如\*
6. 运算结果需要命令置换符获取
7. 支持更多的运算,可以使用man手册查看
8. 不存在逻辑短路现象
9. 

(1.数据运算

#!/bin/bash
var1=10
var2=11
expr $var1 + $var2
=============================
#!/bin/bash
var1=10
var2=11
#特殊字符需要转义,如 . * > < 等等符号需要加\转义,如\*
expr $var1 \* $var2
=============================
#!/bin/bash
var1=10
var2=11
#运算结果需要命令置换符获取
var3=`expr $var1 \* $var2`
=============================

支持的运算

ARG1 | ARG2       若ARG1 的值不为0,则返回ARG1,否则返回ARG2,arg1不能为空
ARG1 & ARG2       若两边的值都不为0,则返回ARG1,否则返回 0
ARG1 < ARG2       ARG1 小于ARG2
ARG1 <= ARG2      ARG1 小于或等于ARG2
ARG1 = ARG2       ARG1 等于ARG2
ARG1 != ARG2      ARG1 不等于ARG2
ARG1 >= ARG2      ARG1 大于或等于ARG2
ARG1 > ARG2       ARG1 大于ARG2
ARG1 + ARG2       计算 ARG1 与ARG2 相加之和
ARG1 - ARG2       计算 ARG1 与ARG2 相减之差
ARG1 * ARG2       计算 ARG1 与ARG2 相乘之积
ARG1 / ARG2       计算 ARG1 与ARG2 相除之商
ARG1 % ARG2       计算 ARG1 与ARG2 相除之余数

(3. 字符运算

expr match STRING REGEXP   
返回REG在STRING中,完全匹配的个数(从第一位开始匹配)             

expr substr STRING POS LENGTH
从string中pos下标的位置开始,截取长度为length的子串,下标从1开始


expr index STRING CHARS
返回多个字符中,最先在string出现的字符的位置

expr length STRING
求字符串的长度
=============================
#!/bin/bash
read net
pos1=`expr index $net '.'`  #找第一个.的位置
str1=`expr substr $net 1 $((pos1-1))`
len=`expr length $net` #求网址的长度
#新的字符串,不包括www.的字符串
temp=`expr substr $net $((pos1+1)) $len`
pos2=`expr index $temp '.'`  #找到新截取的子串中.的位置 
str2=`expr substr $temp 1 $((pos2-1))`
str3=`expr substr $temp $((pos2+1)) $len`
arr=($str1 $str2 $str3)
echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}

功能:

在这里插入图片描述

四、shell中的分支结构

1. if

(1. if单分支语句

#!/bin/bash
if [ 表达式 ] #表达式前后的表达式的空格是必须的

then #表示条件成立

else #表示条件不成立

fi #表示if条件语句结束
#有一个if就必须有一个then和fi

(2. if多分支语句

格式:
#!/bin/bash
if [ 表达式1 ] #表达式前后的表达式的空格是必须的

then #表示条件成立

elif [ 表达式2 ]

then
#表达式1不成立表达式2成立执行的语句块

else
#表达式1不成立表达式2也不成立执行的语句块

fi #表示if条件语句结束

2. test指令

test的作用相当于C中关系运算

(1. 对数据

操作数功能
-eq相等
-ne不相等
-ge大于等于
-gt大于
-le小于等于
-lt小于
-a逻辑与
-o逻辑或

例:求润平年

#!/bin/bash
read year
#在test内使用-a和-o判断,在test外面可以使用||和&&
if [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 ] || test $((year%400)) -eq 0
then
    echo "${year}是闰年"
else
    echo "${year}是平年"
fi

(2. 对字符串

操作数功能
-z判断字符串为空
-n判断字符串非空

(3. 对文件操作

操作数功能
-b存在且为块设备文件
-c存在且为字符设备文件
-e文件存在
-f文件存在且为普通文件
-d文件存在且为目录文件
-s文件存在且不为空
-S文件存在且为套接字文件
-h/-L文件存在且为链接文件
-x文件是否有可执行权限

思维导图

在这里插入图片描述

练习

1. 编写一个名为myfirstshell.sh的脚本,它包括以下内容

1、包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的
2、和当前用户说“hello 用户名
3、显示您的机器名 hostname
4、显示上一级目录中的所有文件的列表
5、显示变量PATHHOME的值
6、显示磁盘使用情况
7、用id命令打印出您的组ID
8、跟用户说“Good bye”
==============================================================
#!/bin/bash
#name:XH filename:shell01.sh function:Print parameters
buf1=(`id`)
pos1=`expr index ${buf1[0]} '\('`
pos2=`expr index ${buf1[0]} '\)'`
pos3=$[pos2-pos1-1]
user=`expr substr $buf1 $[${pos1}+1] $pos3`
echo "Hello $user"
echo  "device name: "$(hostname)
echo  "../: "$(ls ../)
echo  "PATH: "$PATH
echo  "HOME: "$HOME
buf2=(`df -h`)
echo "${buf2[*]}"
echo "${buf1[1]}"
echo "Goodbye $user"

2. 写一个shell脚本,获取当前用户名,用户id和工作路径

#!/bin/bash
buf1=(`id`)
pos1=`expr index ${buf1[0]} '\('`
pos2=`expr index ${buf1[0]} '\)'`
pos3=$[pos2-pos1-1]
user=`expr substr $buf1 $[${pos1}+1] $pos3`

pos1=`expr index ${buf1[0]} '\='`
pos2=`expr index ${buf1[0]} '\('`
pos3=$[pos2-pos1-1]
uid=`expr substr $buf1 $[${pos1}+1] $pos3`

echo "User: $user"
echo "Uid: $uid"
echo work:$(pwd)

3. 编写脚本,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

#!/bin/bash
buf1=`head -10 /etc/passwd | tail -1 | cut -d ":" -f "3"` #
buf2=`head -20 /etc/passwd | tail -1 | cut -d ":" -f "3"` #

echo $((buf1 + buf2))

4. 输入学生成绩,判断等级

#!/bin/bash
read -p "请输入学生成绩:" val1

if test $val1 -le 100 -a  $val1 -ge 90

then
echo "A"

elif test $val1 -lt 90 -a  $val1 -ge 80

then
echo "B"

elif test $val1 -lt 80 -a  $val1 -ge 70

then
echo "C"

elif test $val1 -lt 70 -a $val1 -ge 60

then
echo "D"

fi

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

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

相关文章

Flink 学习一 Flink 简介

Flink 学习一 https://flink.apache.org/ 1.快速认识Flink 1.1 离线批计算与实时流式计算 批计算&#xff1a;有界流 流式计算&#xff1a;无界流 批计算&#xff1a;针对有界流&#xff0c;在计算结果前可以看到整个数据集&#xff1b;流计算&#xff1a;针对无界流&…

Nacos的安装和部署

接下来的时间&#xff0c;我会将Nacos的安装部署&#xff0c;以及在微服务中将其作为配置中心&#xff0c;注册中心&#xff0c;以及它的高级应用会一一为大家分享&#xff0c;今天为大家分享的是Nacos的安装和部署&#xff0c;以windows为例。 1. 下载安装包 官网下载地址&a…

LaTeX在双栏文章里面放单栏或双栏图片【有图有代码】

LaTeX在双栏文章里面放单栏或双栏图片【有图有代码】 双栏文章双栏文章放单栏图片双栏文章放单栏图片 双栏文章 在需要双栏的地方加入\begin{multicols}{2}…\end{multicols} 一般我们可能会希望摘要部分是单栏的。 其余部分设置为双栏&#xff0c;如下&#xff1a; \begin{m…

wxPython 矩形选择框 测试

如下图&#xff0c;这种矩形选择框在图形软件里是必备操作&#xff0c;用python怎么实现&#xff1f;我用wxpython 做了一个例子。 代码如下&#xff1a; #!/usr/bin/env python # -*- coding: utf-8 -*-# Project: test # File : SelectRectang.py # Author : Long.Xu <…

违禁词管理

目录 一、添加违禁词 1.添加一个违禁词 2.批量添加违禁词 二、违禁词实时检测 三、查看违禁词 四、删除违禁词 1.删除一个违禁词 2.批量删除违禁词 五、清空违禁词 一、添加违禁词 1.添加一个违禁词 添加违禁词 ?([\s\S]*) b:$读 违禁词/%群号% a []$ 如果:%括号1% 请…

Java设计模式——策略模式

1. 策略模式简介 策略模式: 策略模式是一种行为型模式, 它将对象和行为分开, 将行为定义为一个行为接口和具体行为的实现 策略模式最大的特点是行为的变化, 行为之间可以相互替换 每个if判断都可以理解为一个策略. 本模式是的算法可独立于使用它的用户而变化 2. 模式结构 策略…

全屋智能家居搭建初级指南(装修用户)

环境&#xff1a; 小M等智能设备 新装修用户 稳定网络环境 规划好电路布局 问题描述&#xff1a; 全屋智能家居如何搭建&#xff0c;初级指南&#xff08;装修用户&#xff09; 下面部分内容摘自小M智能家居解决方案&#xff1a; 一、装修中需要注意什么&#xff1f; …

39 # events 模块的实现原理

观察者模式&#xff1a;会有两个类&#xff0c;观察者会被存储到被观察者中&#xff0c;如果被观察者状态变化&#xff0c;会主动通知观察者&#xff0c;调用观察者的更新方法 发布订阅好处&#xff1a;可以解耦合 const EventEmitter require("events");// 使用自…

提前预体验阿里大模型“通义千问”的方法来了!

随着AI大模型的浪潮席卷全球&#xff0c;如今的AI技术已经颠覆了大家对传统AI的认识&#xff0c;微软更是用浏览器与搜索引擎上的实践&#xff0c;证明了当今的AI技术具备打破行业格局的能力。 对于我们应用开发者来说&#xff0c;AI基建的建设与竞争是无法参与的&#xff0c;…

数据结构——查找

文章目录 **1 查找的基本概念****2 顺序查找和折半查找****2.1 顺序查找****2.2 折半查找****2.3 分块查找** **3 树型查找****3.1 二叉排序树BST****3.1.1 二叉排序树的定义****3.1.2 二叉排序树的查找****3.1.3 二叉排序树的插入****3.1.4 二叉排序树的构造****3.1.5 二叉排序…

C#提升(一、泛型)

一、什么是泛型 泛型&#xff0c;即“参数化类型” 我们来看以下代码&#xff0c;目的很明确&#xff0c;就是显示参数类型&#xff0c;这种类似的代码或者说只有参数类型不同&#xff0c;但是功能相同时&#xff0c;我们如何让代码写的更优雅&#xff1f; 在泛型没有出现的…

LaTeX花式引用章节、图片、公式【有图有代码】

LaTeX花式引用章节、图片、公式【有图有代码】 1 使用~\cite, ~\cref, ~\autoref~\cref~\autoref~\ref 1 使用~\cite, ~\cref, ~\autoref 为什么要使用~ 因为 ~ 符号起到限制换行的作用&#xff0c;通常情况下&#xff0c;LaTeX会根据需要自动确定在引用标签和编号之间的换行点…

Flink 学习二 Flink 编程基础API

Flink 学习二 Flink 编程基础API 1. 基础依赖引入 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.14.4</version></dependency><dependency><groupId>org.apa…

MacOS安装与卸载Zookeeper

文章目录 安装1.下载2.移动至/usr/local 目录下3.进入 ZooKeeper 目录4. 拷贝出一份新的配置文件5.启动 ZooKeeper 服务器6.验证 ZooKeeper 是否成功启动 关闭卸载参考 安装 1.下载 https://downloads.apache.org/zookeeper/zookeeper-3.7.1/ 2.移动至/usr/local 目录下 将…

驻波比理解

VSWR(Voltage Standing Wave Ratio)代表电压驻波比。要完全理解这个术语&#xff0c;需要知道什么是“驻波”。 假设两个波长相同的波以相反的方向传播&#xff0c;如下所示。一个波表示为蓝线&#xff0c;它朝着正确的方向旋转。另一个波用绿线表示&#xff0c;它在左方向旋转…

Android大图加载优化方案

我们在编写Android程序的时候经常要用到许多图片&#xff0c;不同图片总是会有不同的形状、不同的大小&#xff0c;但在大多数情况下&#xff0c;这些图片都会大于我们程序所需要的大小。比如微博长图&#xff0c;海报等等。所以我们就要对图片进行局部显示。 大图加载基本需求…

【QQ界面展示-监听键盘事件 Objective-C语言】

一、关于这个通知,我们就说到这里, 1.接下来,就看一下, 我们说了这么一堆,目的是为了什么, 目的是为了监听我们那个键盘的点击事件吧, 我们说了一堆,目的是为了监听我们这个键盘的弹出事件、不是点击事件, 当键盘弹出以后,我们是不是要做一件事儿, 那么,我们知道…

虚拟机网卡/网络配置,静态IP配置

文章目录 1. Vmvare设置 “编辑->虚拟机网络编辑”2. 新建一个虚拟机并给它设置网卡3. 配置eth0网卡为静态IP vim /etc/sysconfig/network-scripts/ifcfg-eth04、测试 1. Vmvare设置 “编辑->虚拟机网络编辑” 这里设置了3个虚拟网络(两个主机模式&#xff0c;这两个网络…

2023.6.20 GPIO子系统编写LED驱动

作业&#xff1a;通过GPIO子系统编写LED驱动&#xff0c;应用程序控制LED灯亮灭 &#xff08;1&#xff09;led.h #ifndef __LED_H__ #define __LED_H__ // typedef struct{ // unsigned int MODER; // unsigned int OTYPER; // unsigned int OSPEEDR; // un…