Linux笔记10——shell编程基础-4

补充

  • $#——取参数个数
  • “$n”,有值取值,无值取空字符,一般都会加引号,在某些情况下避免报语法错误

一、read接收键盘输入

[root@localhost ~]# cat demo.sh 
#!/bin/bash
echo -n "请输入你的姓名:"
read nameecho "你的名字是:"$name
[root@localhost ~]# bash demo.sh 
请输入你的姓名:zhangsan
你的名字是:zhangsan
[root@localhost ~]# 

语法:read [选项] [变量名]

  • -p:提示信息,在read等待时输入的信息
  • -t:秒数,read等待的秒数
  • -s:隐藏输入信息
  • -n:字符数,read最多能接收的字符数(达标即执行)

实验一:测试各选项的用法

#!/bin/bash
#-p:提示信息
read -p "请输入你的姓名:" name
#-s:隐藏年龄
read -p "请输入你的年龄:" -s age
#-t:输入时间只有10秒
read -p "请输入你的性别:" -t 10 sex
#-n:电话号码最多只能输十一位
read -p "请输入你的电话号码:" -n 11 numberecho "输入你的信息:"$name $age $sex $number

实验二:可以同时接收多个参数,分别放在多个变量里

[root@localhost ~]# cat test2.sh 
#!/bin/bash
read -p "请输入你的姓名、性别、年龄、电话号码:" name sex age number
echo "输入你的信息:"$name $age $sex $number
[root@localhost ~]# bash test2.sh
请输入你的姓名、性别、年龄、电话号码:zhangsna man 32 123456789
输入你的信息:zhangsna 32 man 123456789
[root@localhost ~]# 

实验三:尝试修改接收参数个数,再看运行效果(某些特殊选项会出现不自动换行的bug,所以这里用echo来换行)

[root@localhost ~]# cat test2.sh 
#!/bin/bash
echo "请输入你的姓名、性别、年龄、电话号码:"
read name sex age number
echo "输入你的信息:"$name $age $sex $number
[root@localhost ~]# bash test2.sh
请输入你的姓名、性别、年龄、电话号码:
zhangsan man 32 123456 你好吗?我是谁?
输入你的信息:zhangsan 32 man 123456 你好吗?我是谁?
[root@localhost ~]# 

结论

  • 如果只提供了一个变量名,则整个输入全部赋予该变量
  • 如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有值

二、shell常用运算符

1.声明指定类型的变量

注:数值运算需要使用declare声明变量类型

类型分类

  • 整数型
  • 数组型
  • 环境变量
  • 只读变量

实验一:查看变量类型

[root@localhost ~]# name=lisi
[root@localhost ~]# declare -p name
declare -- name="lisi"

实验二:整数型(shell中变量默认类型是字符串,两个字符串相加的效果是字符拼接)

[root@localhost ~]# n1=10
[root@localhost ~]# n2=20
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
10+20#整型
[root@localhost ~]# declare -i a=100 b=200
[root@localhost ~]# declare -i num=$a+$b
[root@localhost ~]# echo $num
300

注:变量类型——字符串(--)、数值(-i)、数组(-a)

2.命令:declare [+-][选项] [变量]

  • -:给变量设置类型
  • +:取消变量类型
  • -i:将变量声明成整数型
  • -a:将变量声明成数组型
  • -x:将变量声明成环境变量
  • -r:将变量声明成只读
  • -p:显示指定变量的类型和内容

注:若使用echo输出数值运算,则输出结果只会是字符串拼接,不是数值运算的结果

#变量n是字符
[root@localhost ~]# declare -i n1=10
[root@localhost ~]# declare -i n2=20
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
10+20
#变量n是整型
[root@localhost ~]# declare -i n
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
30
#变量n是整型,n3和n4都是字符串
[root@localhost ~]# n3=10
[root@localhost ~]# n4=20
[root@localhost ~]# n=$n3+$n4
[root@localhost ~]# echo $n
30

即:

  • 字符串=数值+数值——字符串的拼接
  • 数值=数值+数值——数值的运算
  • 数值=字符串+字符串——数值的运算

结论:变量名的类型要更加重要一些

三、数值的运算

方法一:定义一个数值类型的变量作为结果

#定义n为整型,计算n1+n2的值
[root@localhost ~]# declare -i n
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
30

方法二:使用expr进行数值运算

[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# expr $x + $y
300
[root@localhost ~]# expr $x * $y
expr: 语法错误:未预期的参数 “anaconda-ks.cfg”
[root@localhost ~]# expr $x \* $y
20000
[root@localhost ~]# 

注:运算符左右两端得有空格;乘号需要使用转义符取消特殊含义

方法三:使用let进行数值计算

  • 运算符左右不需要空格,但需要声明一个新变量用于接收计算结果
  • let还能进行自增减,或指定增加量或减少量
[root@localhost ~]# let he=$x+$y
[root@localhost ~]# echo $he
300
[root@localhost ~]# n=10
[root@localhost ~]# let n++
[root@localhost ~]# echo $n
11
[root@localhost ~]# let n=$n+1
[root@localhost ~]# echo $n
12
[root@localhost ~]# let n+=5
[root@localhost ~]# echo $n
17
[root@localhost ~]# 

方法四:使用$(())或$[]进行数值运算

[root@localhost ~]# unset x;unset y
[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# echo $(($x+$y))
300
[root@localhost ~]# echo $[$x+$y]
300

补充

#测试运算符的顺序
[root@localhost ~]# echo $((16/5))
3
[root@localhost ~]# echo $((-16/5))
-3
[root@localhost ~]# echo $((-16/-5))
3
[root@localhost ~]# echo $((16/-5))
-3
#a%b,取余结果的符号和a一致
[root@localhost ~]# echo $((16%5))
1
[root@localhost ~]# echo $((-16%5))
-1
[root@localhost ~]# echo $((-16%-5))
-1
#对一个数n取余,余数是有范围的,即[0-(n-1)]
------------
#指定范围的随机数,默认范围是[0,32767]
$ echo $RANDOM
#在0~10之间产生一个随机数
$ echo $(($RANDOM%11))
#在1~100之间产生一个随机数
$ echo $(($RANDOM%100+1))
#表格中的优先级是乘除优先于加减,但是若加减被()调用,则括号内的优先级高于乘除
[root@localhost ~]# n1=$(((11+22)*33/44))
[root@localhost ~]# echo $n1
24
#逻辑与(一般单独使用)
[root@localhost ~]# echo $((0&&0))
0
[root@localhost ~]# echo $((0&&1))
0
[root@localhost ~]# echo $((1&&0))
0
[root@localhost ~]# echo $((1&&1))
1
-----------
#shell中处理的数值都是整数类型,若处理小数用bc
5、Shell的环境变量配置
5-1、登录环境变量的配置文件
[root@localhost ~]# yum -y install bc
[root@localhost ~]# echo "2.5+3.5"|bc
6.0
[root@localhost ~]# echo "2.3*3"|bc
6.9

注:$变量名取值;$(命令)取命令的值;$(())取运算表达式的值

四、数组

定义:名=(值1 值2 值3....)

[root@localhost ~]# name=(zhangsan lisi wangwu)
[root@localhost ~]# echo $name    #默认情况下只能取第一个值
zhangsan
[root@localhost ~]# echo ${name[1]}    #根据下标取值
lisi
--------------
#随机取数值name中的值
[root@localhost ~]# echo ${name[$RANDOM%3]}
zhangsan
或
[root@localhost ~]# echo ${name[$(($RANDOM%3))]}
zhangsan
--------------
[root@localhost ~]# echo ${name[*]}
zhangsan lisi wangwu
[root@localhost ~]# echo ${name[@]}
zhangsan lisi wangwu
--------------
[root@localhost ~]# echo ${#name[@]}    #取 值的个数,即数组的长度
3
[root@localhost ~]# echo ${#name[0]}    #取的是一个值的字符串长度
8
[root@localhost ~]# 
---------------
改:
[root@localhost ~]# name[1]=lisiis
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu
增:
[root@localhost ~]# name[3]=laoliu
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu laoliu
删:
[root@localhost ~]# unset name[3]
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu
[root@localhost ~]# unset name
[root@localhost ~]# echo ${name[@]}[root@localhost ~]# 

五、知识点补充

字符串判断

测试选项作用
-z 字符串判断字符串是否为空(为空返回真)
-n 字符串判断字符串是否为非空(非空返回真)
字符串1 == 字符串2判断字符串是否相等(相等返回真)
字符串1 != 字符串2判断字符串是否不相等(不相等返回真)

练习1:写一个脚本,计算1到100的值

[root@localhost ~]# cat he.sh 
#!/bin/bash
n=0
for i in {1..100}
don=`expr $n + $i`
done
echo $nn1=0
for i in {1..100}
dolet n1+=$i
done
echo $n1n2=0
for i in {1..100}
don2=$((n2+=$i))
done
echo $n2
[root@localhost ~]# bash he.sh 
5050
5050
5050
[root@localhost ~]# 

练习2:写一个脚本,给脚本传输一个值,计算从1到这个值的和

[root@localhost ~]# cat demo1.sh 
#!/bin/bashecho -n "input start number:" $1
echo -n "input end number:" $2
let n=$2-$1+1
echo "count:"$(($n*($1+$2)/2))
[root@localhost ~]# bash demo1.sh 1 5
input start number: 1input end number: 5count:15
[root@localhost ~]# 

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

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

相关文章

(Redis)过期删除策略

1. 背景Redis 支持为 Key 设置过期时间(TTL),让数据在一定时间后自动失效。 例如:SET session:1001 "userA" EX 60 # 60 秒后过期但是问题来了:Key 到期后,Redis 什么时候、如何删除它&#xf…

nodejs 集成mongodb实现增删改查

初始化项目: npm init -y npm install mongoose -save 安装mongoose 插件 mongoose 链接数据库语法: mongodb://[username:password]host1[:poert1],host2[:port2]…/[databsase]?[options…] userame: 用户名 passwrod: 密码 host1:port1,host2:port…

音视频学习(五十八):STAP-A模式

什么是 STAP-A? STAP-A 是一种特殊的 RTP 封装机制,专为 H.264 和 H.265 这类视频编码协议设计。它的核心目的只有一个:将多个小的 NALU(网络抽象层单元)打包进一个 RTP 包中,以此来减少网络开销&#xff0…

管理型交换机通过VLAN划分实现不同IP跨网段通信配置方法

管理型交换机应用场景丰富,如果要实现不同IP跨网段通信(比如172.22.106.X和192.168.100.X实现通信),通过VLAN划分是可以满足,下面分享基于弱三层交换机RTL9301方案核心模块SW-24G4F-301EM配置方法! 1. 一般结合交换机的应用场景&a…

什么是高防服务器?如何进行防御?

高防服务器是指能为用户提供防御网络攻击,是主要针对DDOS等流量型攻击能力的服务器,通过部署专业的硬件设备与软件系统,具备高带宽、大流量清洗能力,能有效抵御各类恶意流量冲击,确保服务器稳定运行,保障网…

SW - 增加导出STL数据中的三角面数,增加别人逆向建模的难度

文章目录SW - 增加导出STL数据中的三角面数,增加别人逆向建模的难度概述笔记SW版本导出时,选择STL的导出选项默认导出(精细)导出粗糙自定义导出 - 将误差和角度改为最大自定义导出 - 将误差,角度,三角面数改为最大备注这几天的感想关于我不参考人家零件&…

四十一、【高级特性篇】API 文档驱动:OpenAPI/Swagger 一键导入测试用例

四十一、【高级特性篇】API 文档驱动:OpenAPI/Swagger 一键导入测试用例 前言 准备工作 第一部分:后端实现 - OpenAPI 解析与批量创建 API 1. 创建 OpenAPI 解析服务 2. 创建批量用例导入 API 3. 注册新 API 路由 第二部分:前端实现 - OpenAPI 导入界面 1. 更新 `api/testca…

K8S-Service资源对象

一、概述在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。为了解决这个问题,kubernetes提供了Service资源&…

【STM32】CubeMX(十三):RT-THREAD

本篇博客描述的是 RT-Thread STM32 CubeMX 的使用方法。本文也为大家提供了基于 STM32 使用 CubeMX 添加 RT-Thread 并创建闪烁 LED 任务 的操作流程。 便于您更好的理解。 一、RT-Thread 是什么? RT-Thread 是一个开源、轻量级的实时操作系统,适用于…

基于Ubuntu22.04系统PaddleX和PaddleClas训练推理MMAFEDB人脸表情识别数据集(详细教程)

目录 基于Ubuntu22.04系统PaddleX和PaddleClas训练推理MMAFEDB人脸表情识别数据集(详细教程) 超实用的Paddle图像分类训练推理教程,助力深度学习研究! 1、环境准备(重要⭐⭐⭐) 构建虚拟环境 安装PaddlePaddle 安装PaddleX 安装PaddleClas插件 2…

Mistral AI音频大模型Voxtral解读

1. 引言 传统的语音处理系统(如OpenAI的Whisper)在ASR任务上取得了巨大成功,能将语音高精度地转换为文本。但这只是第一步。真正的“语音理解”意味着: 内容推理:不仅知道说了什么,还能理解话语背后的含义、情感和意图。 长篇摘要:能够听完一段长达数十分钟的播客或会议…

使用Docker+WordPress部署个人博客

一、通过docker compose 自动一键部署WordPress 1. 准备工作 安装 Docker 和 Docker Compose确保服务器有公网 IP(如果需要外部访问)域名(可选,用于绑定网站) 2. 创建 Docker Compose 配置文件 创建一个docker-compose…

http与https配置

Web 服务详解:HTTP 与 HTTPS 配置 一、HTTP 服务概述 HTTP(Hypertext Transfer Protocol,超文本传输协议)是用于在网络上传输网页数据的基础协议,默认使用80 端口,以明文形式传输数据。常见的 HTTP 服务软件…

Python爬虫实战:研究amazon-scrapy,构建亚马逊电商数据采集和分析系统

1 引言 1.1 研究背景 电子商务的高速发展使电商平台成为数据价值的核心载体。亚马逊作为全球领先的电商生态,截至 2024 年第二季度,其平台商品总量突破 1.5 亿,日均活跃用户超 3 亿,每日产生 PB 级的交易数据与用户行为记录。这些数据包含商品特征(价格、规格、品牌)、…

基于ERNIE 4.5的多智能体协作的自动化视频舆情分析报告生成器

多智能体协作的自动化视频舆情分析报告生成器 1. 项目的意义与价值 从“非结构化视频”中挖掘“结构化洞察”的通用挑战 在当今的数字生态中,视频已成为信息传播、知识分享和消费者意见表达的核心媒介。从企业内部的会议录屏、技术培训,到外部的市场宣传…

Java全栈开发面试实录:从基础到实战的深度解析

Java全栈开发面试实录:从基础到实战的深度解析 面试官与应聘者的对话记录 第一轮:基础问题与项目背景 面试官(中年男性,穿着整洁): 你好,欢迎来到我们公司。我是今天的面试官,可以先…

如何清除webview138、139版本软键盘占用的区域

好的,这个问题非常具体且关键。在 Android System WebView 的 138 和 139 版本(基于 Chromium 113)的上下文中,“清除软键盘占用的区域”通常意味着:在软键盘收起后,WebView 的布局或视口没有正确恢复&…

深度学习:卷积神经网络(CNN)

文章目录一、CNN 基础认知1.1 图像在计算机中的存储形式1.2 图像识别的核心需求:画面不变性1.3 传统神经网络的局限二、CNN 核心原理:三大核心层与关键操作2.1 卷积层(1)什么是卷积操作?(2)卷积…

iOS 26 正式版即将发布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 运行支持

在之前的 《Flutter 又双叒叕可以在 iOS 26 的真机上 hotload》 和 《Flutter 在 iOS 真机 Debug 运行出现 Timed out *** to update》 我们聊过,由于 iOS 26 开始,Apple 正式禁止了 Debug 时 mprotect 的 RX 权限,导致了 Flutter 在 Debug 运…

机器学习全流程拆解 _ 从数据到模型的科学之道

-—— 避开80%项目失败的隐形成本,掌握高效建模方法论*📌 一、明确目标:成败的起点 1. 问题定位 分类任务:区分二分类/多分类/多标签分类预测任务:标量预测(如房价)vs 向量预测(如股…