当前位置: 首页 > java >正文

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.xdnf.cn/news/18896.html

相关文章:

  • GraphRAG——v0.3.6版本使用详细教程、GraphRAG数据写入Neo4j图数据库、GraphRAG与Dify集成
  • 图像增强和评价
  • 脑电分析——学习笔记
  • 【系统架构设计(一)】系统工程与信息系统基础上:系统工程基础概念
  • 【Ubuntu系统实战】一站式部署与管理MySQL、MongoDB、Redis三大数据库
  • 负载均衡之平滑加权轮询(Smooth Weighted Round Robin)详解与实现
  • MIME类型与文件上传漏洞 - 网络安全视角
  • AI解决生活小事系列——用AI给我的电脑做一次“深度体检”
  • Windows下的异步IO通知模型
  • 一款基于 .NET 开源、功能强大的 Windows 搜索工具
  • C# .NET支持多线程并发的压缩组件
  • 2026 济南玉米深加工展:探索淀粉技术突破与可持续发展解决方案
  • 你真的了解操作系统吗?
  • Feign 调用为服务报 `HardCodedTarget(type=xxxClient, name=xxxfile, url=http://file)`异常
  • 大模型入门实战 | 基于 YOLO 数据集微调 Qwen2.5-VL-3B-Instruct 的目标检测任务
  • YggJS RButton 按钮组件 v1.0.0 使用教程
  • 【vue eslint】报错:Component name “xxxx“ should always be multi-word
  • 云上“安全管家”|移动云以云安全中心为企业数字化升级保驾护航
  • 科技信息差(8.26)
  • 【软考论文】论静态测试方法及其应用
  • PortSwigger靶场之Blind SQL injection with out-of-band interaction通关秘籍
  • 软考-系统架构设计师 计算机系统基础知识详细讲解
  • 【46页PPT】AI智能中台用ABC+IOT重新定义制造(附下载方式)
  • 相机Camera日志实例分析之十五:相机Camx【照片后置HDR拍照】单帧流程日志详解
  • 2-5 倍性能提升,30% 成本降低,阿里云 SelectDB 存算分离架构助力波司登集团实现降本增效
  • 支持向量机核心知识总结
  • Java大厂面试实战:从Spring Boot到微服务架构的深度剖析
  • 宠物智能,是「养宠自由」还是「焦虑税」?
  • 【分享开题答辩过程】一辆摩托车带来的通关副本攻略----《摩托车网上销售系统》开题答辩!!
  • Stream流中的Map与flatMap的区别