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

这篇具有很好参考价值的文章主要介绍了Linux 学习记录37(C高级篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

一、常见的shell解析器

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

二、变量

1. shell脚本外部传参

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

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

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

功能:

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

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))"

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

2. $[ ]运算

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

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

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

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

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]}

功能:

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

四、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 文件是否有可执行权限

思维导图

Linux 学习记录37(C高级篇)文章来源地址https://www.toymoban.com/news/detail-500181.html

练习

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

到了这里,关于Linux 学习记录37(C高级篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux学习记录——사십사 高级IO(5)--- Epoll型服务器(2)(Reactor)

    本篇基于上篇代码继续改进,很长。关于Reactor的说明在后一篇 上面的代码在处理读事件时,用的request数组是临时的,如果有数据没读完,那么下次再来到这里,就没有这些数据了。所以得让每一个fd都有自己的缓冲区。建立一个Connection类,然后有一个map结构,让这个类和每

    2024年01月20日
    浏览(47)
  • Linux学习记录——사십사 高级IO(6)--- Epoll型服务器(3)(Reactor)

    看完前两篇再看这篇,本篇将会写Reactor EpollServer.hpp中创建一个函数HandlerRequest,用它来做Recver函数的数据处理,也就是数据分析。 改一下回调函数,不向外暴露Connection类。 Main.cc中就不需要两个函数,一个计算函数就可以 处理数据那里再加上最后的步骤 回到Recver函数,调用

    2024年01月20日
    浏览(38)
  • Linux学习记录——사십오 高级IO(6)--- Epoll型服务器(3)(Reactor)

    看完前两篇再看这篇,本篇将会写Reactor EpollServer.hpp中创建一个函数HandlerRequest,用它来做Recver函数的数据处理,也就是数据分析。 改一下回调函数,不向外暴露Connection类。 Main.cc中就不需要两个函数,一个计算函数就可以 处理数据那里再加上最后的步骤 回到Recver函数,调用

    2024年01月23日
    浏览(47)
  • Linux shell编程学习笔记37:readarray命令和mapfile命令

      目录   0 前言 1  readarray命令的格式和功能 1.1 命令格式 1.2 命令功能 1.3 注意事项 2 命令应用实例 2.1 从标准输入读取数据时不指定数组名,则数据会保存到MAPFILE数组中 2.2 从标准输入读取数据并存储到指定的数组 2.3 使用 -O 选项指定起始下标 2.4 用-n指定有效行数 2.5 

    2024年02月03日
    浏览(43)
  • Elasticsearch探秘:原理剖析、高级运用与实战经验【文末送书-37】

    Elasticsearch作为一个开源、分布式、实时搜索和分析引擎,被广泛应用于各行各业,为大数据处理和搜索提供了强大的支持。本文将深入探讨Elasticsearch的原理、进阶使用方法以及工程实践,帮助读者更全面地理解和应用这一强大的搜索引擎。 在深入学习Elasticsearch之前,我们首

    2024年03月14日
    浏览(80)
  • 算法记录 | Day37 贪心算法

    思路: 1.一旦出现strNum[i - 1] strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。 2.向后遍历 从前向后遍历的话,遇到strNum[i - 1] strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能

    2023年04月22日
    浏览(24)
  • 机器学习李宏毅学习笔记37

    ChatGPT简单原理介绍 Chatgpt以句子为输入,输出这个句子后面接的词汇的概率分布,给每一个可能的符号一个概率,根据这个分布进行sample,每次sample出来的词汇可能都是不一样的,所以答案每次也都不相同。把输出的词汇加在输入给gpt的句子后面,重复上面的过程,直到最后

    2024年02月16日
    浏览(29)
  • Linux6.37 Kubernetes 集群调度

    第三章 LINUX Kubernetes 集群调度 一、调度约束 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件,向

    2024年02月13日
    浏览(29)
  • linux驱动开发入门(学习记录)

    2023.7.6及7.7 、

    2024年02月15日
    浏览(32)
  • linux基础知识学习记录

    计算机组成:计算机主要硬件和软件2部分组成。 计算机软硬件的概念:硬件是可以看得见的物理实体,软件是运行在硬件上不可见的程序。 计算机软硬件的关系:没有硬件,程序就不会存在;没有软件,硬件就是破铜烂铁。 计算机硬件的组成:CPU(中央处理器)、内存、硬盘

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包