shell read变量的读入
shell变量的输入:
shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入获取,read为bash内置命令,可以通过help read查看帮助。
语法格式:
read 【参数】 【变量名】
常用参数:
-p :设置提示信息
-t :设置输入等待的时间,单位默认为秒。
测试:read的基本读入
read -t 5 -p "Pls input two number:" a1 a2 #超时5秒后退出
例如:我们可以写一个加减乘除计算脚本,以read方式读入整数变量:
简单脚本:
[root@bqh-117 scripts]# cat js.sh
#!bin/sh
read -t 15 -p "input two number:" a b
echo $a-$b=$(($a-$b))
echo $a+$b=$(($a+$b))
echo $a*$b=$(($a*$b))
echo $a/$b=$(($a/$b))
echo $a**$b=$(($a**$b))
echo $a%$b=$(($a%$b))
[root@bqh-117 scripts]# sh js.sh
input two number:8 4
8-4=4
8+4=12
8*4=32
8/4=2
8**4=4096
8%4=0
定义变量是也可以:
read –t 15 –p ” please input two number:” num1 num2
a=$num1
b=$num2
利用echo命令替代read –p的功能:
echo -n ” please input two number:” a b
read a b
思考:如果前面的范例脚本中读入的不是整数或者输入的数字个数不是2个,执行脚本会什么结果?如何解决?
解答:
上述程序可以如下思考解决:
可以模拟打游戏过关的思路,设置关卡,满足一项要求则过关,否则,game over!
第一关:用户按要求输入了为两个值则过关,否则,game over。
编程提示:可以用变量的字符串长度判断,例如:${#bqh}
第二关:用户输入的内容均为整数才过关,否则 game over
编程提示:用expr特殊技巧进行判断
第三关:当读入的参数符合个数和整数条件后,进行计算。
----------------------------------------------------------------------------------------------------------------------
方法一:read读入
[root@bqh-117 scripts]# vim read_js.sh #/bin/sh
read -t 8 -p "please input two number:" a b #a前面要有空格
#no.1
[ -z "$a" ]&&{ echo "first number must be int."
exit 1
}
[ -z "$b" ]&&{ echo "second number must be int."
exit 2
}
#no.2
expr $a + $b + 1 &>/dev/null
[ $? -ne 0 ]&&{ echo "the number you input must be int."
exit 3
}
#no.3
echo "$a-$b =$(($a-$b))"
echo "$a+$b =$(($a+$b))"
echo "$a*$b =$(($a*$b))"
if [ $b -eq 0 ];then
echo "fenmu can not be 0,s0 /,% can not yunsuan."
else
echo "$a/$b =$(($a/$b))"
echo "$a%$b =$(($a%$b))"
fi
echo "$a**$b =$(($a**$b))"
测试效果如下:
方法二:read读入
[root@bqh-117 scripts]# vim read_js1.sh
#!/bin/sh
while true
do
read -t 8 -p "pls input two number:" a b
expr $a + 0 >/dev/null 2>&1
[ $? -ne 0 ]&& continue
expr $b + 0 >/dev/null 2>&1
[ $? -ne 0 ]&& continue || break
done
echo "$a-$b =$(($a-$b))"
echo "$a+$b =$(($a+$b))"
echo "$a*$b =$(($a*$b))"
echo "$a/$b =$(($a/$b))"
echo "$a**$b =$(($a**$b))"
echo "$a%$b =$(($a%$b))"
测试效果:
思考:如何将上述read读入改成脚本传参的方式实现?
解答:
方法一:
[root@bqh-117 scripts]# vim read_js3.sh
#!/bin/sh
a=$1
b=$2
Usage() {
echo "USAGE: number 1 number 2"
exit 1
}
if [ $# -ne 2 ];then
Usage
fi
[ "`echo "$a"|sed -r 's#[^0-9]##g'`" = "$a" ]||{
echo "number 1 must be int."
exit 2
}
[ "`echo "$b"|sed -r 's#[^0-9]##g'`" = "$b" ]||{
echo "number 2 must be int."
exit 3
}
echo "$a-$b =$(($a-$b))"
echo "$a+$b =$(($a+$b))"
echo "$a*$b =$(($a*$b))"
echo "$a/$b =$(($a/$b))"
echo "$a**$b =$(($a**$b))"
echo "$a%$b =$(($a%$b))"
测试效果:
方法二:
[root@bqh-117 scripts]# vim read_js2.sh
#!/bin/sh
a=$1
b=$2
Usage() {
echo "USAGE: number 1 number 2"
exit 1
}
if [ $# -ne 2 ];then
Usage
fi
expr $a + 0 &>/dev/null
fetval1=$?
expr $b + 0 &>/dev/null
fetval2=$?
test $fetval1 -eq 0 -a $fetval2 -eq 0 ||{
echo "pls input two number 1 and number 2 must be int."
Usage
}
echo "$a-$b =$(($a-$b))"
echo "$a+$b =$(($a+$b))"
echo "$a*$b =$(($a*$b))"
echo "$a/$b =$(($a/$b))"
echo "$a**$b =$(($a**$b))"
echo "$a%$b =$(($a%$b))"
测试效果:
当然还有很多其他方法等等。
最新文章
- TFS API : 四、工作项查询
- Jquery 基本知识(二)
- BZOJ4342 : CF348 Pilgrims
- OC基础(19)
- 玄机网C#论坛测试小游戏
- [转贴]C语言复习笔记-17种小算法-解决实际问题
- makefile 单独编译一个文件
- python 魔法方法之:__getitem__ __setitem__ __delitem__
- enum 用法
- JavaWeb 后端 <;二>; 之 Servlet 学习笔记
- 前端必须收藏的CSS3动效库!!!
- Android开发之漫漫长途 XI——从I到X的小结
- Android测试(一):在Android中测试App
- python之路--操作系统介绍,进程的创建
- henrylee2cn简单的rpc服务
- 移动端触屏滑动,JS事件
- WordPress已占全球网站平台18.9%的份额
- 12 python json&;pickle&;shelve模块
- 关于onConfigurationChanged
- PyQt:eg4
热门文章
- Java基础系列--throw、throws关键字
- javase基础回顾(三) 动态代理
- DLCI 简介
- backbond Model实现
- 用python实现红包机制
- ASP.NET WEB API简介
- JPA、Hibernate、Spring data jpa之间的关系,终于明白了
- Oracle时间与系统不同步,TimeStampService
- Git Extensions 和 Tortoisegit 到底是什么?Git For VS(Git For Visual Studio)(Visual Studio 中使用 Git)
- asp.net-基础-20180321