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

news/2025/2/11 13:20:53/

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 "请输入第二个参数" var2echo "两数和:$((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
thenecho "${year}是闰年"
elseecho "${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 "请输入学生成绩:" val1if test $val1 -le 100 -a  $val1 -ge 90then
echo "A"elif test $val1 -lt 90 -a  $val1 -ge 80then
echo "B"elif test $val1 -lt 80 -a  $val1 -ge 70then
echo "C"elif test $val1 -lt 70 -a $val1 -ge 60then
echo "D"fi

http://www.ppmy.cn/news/495526.html

相关文章

火萤视频壁纸(让你的桌面丰富多彩)

本文是众多使用技巧中其中的一篇, 全部使用技巧点击链接查看, 或直接查看本专栏其他文章, 保证你收获满满 我主页中的思维导图中内容大多从我的笔记中整理而来,相应技巧可在笔记中查找原题, 有兴趣的可以去 我的主页 了解更多计算机学科的精品思维导图整理 本文可以转载&…

kpw4换壁纸_kindle 篇五:kindle paperwhite4使用30天总结

kindle 篇五:kindle paperwhite4使用30天总结 2020-02-19 09:25:48 19点赞 52收藏 28评论 绝大多数人经过深思熟虑之后终于入手了一台Kindle阅读器,之后就会想到一些问题,譬如要不要贴个膜,避免屏幕被刮花;要不要买个原装充电器,那样会显得格外有bigger;今天是我入手kpw…

win10壁纸不能幻灯片放映_教大家Windows10幻灯片壁纸与无序播放怎么设置的方法...

今天小编来给大家针对这个教大家Windows10幻灯片壁纸与无序播放怎么设置的方法的问题来进行一个介绍&#xff0c;毕竟当下也是有诸多的小伙伴对于教大家Windows10幻灯片壁纸与无序播放怎么设置的方法这个问题非常的重视的&#xff0c;下面大家可以看下具体的详情 1. 创建相册 W…

计算机桌面常用图标,电脑常用软件图标 常用的电脑软件图标

我以前在太平洋下过.很漂亮的3D软件图标. 你查找看. 怎么把电脑桌面的应用软件图标变大 1、下图中原本的桌面图标的初始状态比较小。 2、选中其中的一个桌面图标,或者全选所有的桌面图标也可以。 3、按下键盘的Ctrl键不动。 4、然后用鼠标上的滚轮,向上滚动鼠标滑轮。 5、…

wallpaper代码_五行Python代码自动换你的电脑桌面壁纸(内附源码和exe)

很多行友问行哥,Python能不能自动更换电脑壁纸呀,今天它来了 只需要一行代码,指定图片地址即可更换电脑桌面。加上壁纸文件夹路径,让你随机更换电脑桌面,带来不期而遇的新鲜。使用爬虫技术,自动下载壁纸自动更换壁纸,让你的电脑每天都有焕然一新的感觉。 星标行哥,为你…

太秀了,Python自动化更换 “电脑壁纸” ,电脑彻底 “解放双手” 了!

前言 最近看了一个讲解win的视频&#xff0c;我觉得内容还不错&#xff0c;于是就写了这一篇博文&#xff0c;希望大家喜欢。 本文章分为两个阶段&#xff0c;第一个阶段是下载电脑壁纸&#xff0c;因为小编没有图片壁纸&#xff0c;所以我写了一个爬取彼岸壁纸的爬虫&#x…

用计算机弹出古诗,电脑屏保不断变化的诗句

win10屏幕保护在哪里打开win10开始菜单&#xff0c;找到 设置 进入windows系统设置界面&#xff0c;如箭头所示点击[个性化] 设置主页里面&#xff0c;找到 锁屏设置 方法2&#xff0c;要查找屏幕保护也很简单&#xff0c;开始菜单调出小娜 输入屏幕保护&#xff0c;会自动链接…

计算机网络笔记:内部网关协议RIP

文章目录 1.协议RIP的工作原理2.距离向量算法3.坏消息传播得慢 1.协议RIP的工作原理 RIP的地位&#xff1a;RIP是内部网关协议IGP中最先得到广泛使用的协议&#xff0c;其中文译名为路由信息协议。 RIP概述&#xff1a; RIP是一种分布式的基于距离向量的路由选择协议&#x…