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

news2024/11/20 14:26:42

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/669420.html

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

相关文章

STM32单片机(七)ADC模拟数字转换器----第二节:ADC模数转换器练习(AD单通道和AD多通道)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

港科夜闻|香港科大(广州)INNOTECH创科嘉年华暨周年庆典隆重举行

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大(广州)INNOTECH创科嘉年华暨周年庆典隆重举行。6月16日&#xff0c;在《广州南沙深化面向世界的粤港澳全面合作总体方案》印发一周年之际&#xff0c;作为《南沙方案》发布后落成的第一个重大项目&#xff0c;香…

深入理解生成式AI技术原理:初识生成式AI

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; &#x1f38d;大家好&#xff0c;我是慕枫 &#x1f38d;前阿里巴巴高级工程师&#xff0c;InfoQ签约作者、阿里云专家博主&#xff0c;一直致力于用大白话讲解技术知识 &#x…

三菱plc编程协议开发记录

目录 1 协议介绍 2 测试报文 3 PLC服务端仿真 4 java测试代码 1 协议介绍 Fx_Serial 通过Fx编程口协议连接三菱FX0N、FX1N、FX2N、FX3U FX3G、FX3S系列PLC。协议的详细介绍文档见附件“FX编程口协议.pdf”。 2 测试报文 组装各种类型报文测试&#xff0c;见附件“报文.xls…

Spring MVC框架步骤

目录 前言1. 配置开发环境2. 创建一个新的Maven项目3. 配置Web.xml文件4. 创建控制器类5. 创建视图6. 配置视图解析器7. 运行应用程序8. 测试应用程序 前言 Spring MVC是一种基于Java的Web应用程序开发框架&#xff0c;它可以帮助开发人员构建灵活、健壮和可扩展的Web应用程序…

【MongoDB】三、使用Java连接MongoDB

【MongoDB】三、使用Java连接MongoDB 实验目的实验内容练习1、开启Eclipse&#xff0c;创建Java Project项目&#xff0c;命名为Mongo12、添加项目依赖的jar包3、创建类MongoDemo4、连接数据库5、查看集合6、创建集合7、删除集合8、查看文档9、插入文档10、更新文档11、删除文档…

hive/spark数据倾斜解决方案

Hive数据倾斜以及解决方案 1、什么是数据倾斜 数据倾斜主要表现在&#xff0c;mapreduce程序执行时&#xff0c;reduce节点大部分执行完毕&#xff0c;但是有一个或者几个reduce节点运行很慢&#xff0c;导致整个程序的处理时间很长&#xff0c;这是因为某一个key的条数比其他…

stm32驱动RFID高频读卡器读取IC卡

stm32驱动RFID读卡器读取IC卡 1.介绍RFID2.RFID控制指令2.1 读IC卡号2.2 读IC卡数据块2.3 写数据到IC卡数据块2.4 读取RFID读卡器用户数据2.5 向RFID读卡器写入用户数据 3.代码实例3.1 rfid.c 源文件3.2 rfid 头文件 4. 结语 1.介绍RFID RFID&#xff08;Radio-Frequency Iden…

篮球比赛管理系统的设计与实现(论文+源码)_kaic

摘要 迅猛发展并日益成熟的网络已经彻底的影响了我们的方方面面。人们也确实真切的体会到了网络带给我们的便捷。本网站的设计理念在于作为一个天津大学生台球联盟推广网&#xff0c;就是能够尽可能详细地展示、介绍台球联盟资讯信息&#xff0c;播放视频&#xff0c;同时为广…

关于Eclipse代码断点调试与相关快捷键

关于Eclipse代码断点调试与相关快捷键 功能快捷键 首先关于DeBug测试的快捷键&#xff1a; Debug F5&#xff1a;Step Into&#xff08;debug&#xff09; F6&#xff1a;Step over&#xff08;debug&#xff09; F7&#xff1a;Step return&#xff08;debug&#xff09; F8&a…

化妆品行业知识分享

目录 一、产品基本信息 1.产品的组成 2. 产品分类 3.常见术语 二、产品特性 1.生产特性 2.销售特性 3.采购特性 4.研发特性 三、行业痛点与解决方案 1.行业主要存在的痛点 2.日常业务解决方案&#xff1a; 3.供应商管理解决方案&#xff1a; 四、总结 一、产品基本信息 1.产品的…

C++基础(13)——STL(stack、queue、list)

前言 本文主要介绍C中STL中的stack、queue和list容器 7.5&#xff1a;stack容器 7.5.1&#xff1a;stack容器基本概念 栈中只有顶端元素才可以被外界调用&#xff0c;因此栈不允许有遍历的行为&#xff0c;其中string、vector、deque都可以遍历 7.5.2&#xff1a;栈的常用接…

AT32F437网络通信

网络时间长了ping不通&#xff0c;解决方法 https :// https://hjha.bar:8443/vod 123456789 /play/id/32052/sid/1/nid/1.html

PYTHON强制升级openpyxl方法--已验证有效

当执行for i, row in enumerate(worksheet.iter_rows(min_row1, max_rowworksheet.max_row,values_onlyTrue)) 出现以下错误时&#xff1a;TypeError: iter_rows() got an unexpected keyword argument ‘values_only’ 说明openpyxl版本过低&#xff0c;需要升级&#xff0c;当…

指令模板:采访大纲生成 | AIGC实践

最近收获了一些朋友的谬赞&#xff0c;说我“执行力太强了”&#xff0c;可以持续输出内容。 呃&#xff0c;其实吧&#xff0c;这些素材都是从我的实际工作和生活中来的&#xff0c;只是稍加整理而已。 要说起来&#xff0c;AIGC的出现已经完全改变了我的工作方式。在遇到问题…

《中国多媒体与网络教学学报》简介及投稿邮箱

《中国多媒体与网络教学学报》简介及投稿邮箱 中国多媒体与网络教学学报 创刊于2002年&#xff0c;是经国家新闻出版总署批准的中央级电子期刊,是国内最早以多媒体形式发表中小学信息化教学改革前沿成果的学术期刊群,是教育部重点成果的发表平台之一,由教育部主管、清华大学主…

谈找工作线上途径

谈找工作 目录概述需求&#xff1a; 设计思路实现思路分析1.51job2.拉勾网 猎聘网站智联招聘网站后记 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait…

DDOS攻击防御实战(威胁情报)

背景&#xff1a; 不知道大家最近有没有关注到&#xff0c;百度云CDN不支持免费了&#xff0c;网站安全问题越来越严重了…… 常见攻击 DDOS Distributed Denial of Service 分布式拒绝服务攻击可以使很多的计算机在同一时间遭受到攻击&#xff0c;使攻击的目标无法正常使用&…

C++基础(14)——STL(set、pair、map)

前言 本文主要介绍C中STL中的set、pair和map容器 7.8&#xff1a;set、multiset容器 7.8.1&#xff1a;set容器基本概念、构造函数和赋值&#xff08;、insert&#xff09; set容器中所有元素都会在插入的时候自动排序 set和multiset的区别 set不允许有重复的元素&#xff…

i5/i7该选谁?差距大不大?i5-13490F、i7-13790F深度测试

一、i5、i7还是性能差不多吗&#xff1f; 自从2017年Zen架构发布开始&#xff0c;Intel与AMD在CPU性能竞争上就进入了激烈的内卷。随着双方在产品竞争上日趋白热化&#xff0c;同世代不同档次CPU产品的性能差距被明显拉大。 那么&#xff0c;过去那种“i5、i7性能差不多&#x…