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

测试效果:

当然还有很多其他方法等等。

shell read变量的读入的更多相关文章

  1. shell与变量的声明的操作

    1.给命令起别名:alias 执行下面命令后,可以使用dir代替ls –l 命令,显示目录中的文件详细信息: 还可以用一个别名表示几个命令 的结合: 2.ps:显示当前登录会话的所有活动进程: 3.更 ...

  2. shell之变量与read

    环境变量 set 环境变量可供shell以外的程序使用 shell变量 env shell变量仅供shell内部使用 set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell ...

  3. 【Linux】之shell特殊变量整理

    目录 1. 特殊变量列表 2. 特殊说明 在shell中变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即p ...

  4. (转载)shell变量基础—shell自定义变量

    (转载)http://see.xidian.edu.cn/cpp/html/1494.html 一.Shell定义变量需要遵循的规则 Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下 ...

  5. shell基础——变量定义

    快速参考: 变量定义格式: 变量名=值 str1="hello world" # define a string var str2=hello # define a string ...

  6. shell的变量处理

    shell的变量处理 一.删除 删除(删除某一段) # 从前向后删除 % 从后向前删除 删除(删除某一部分) $(var:nu1:nu2) nu1表示开始位置 nu2表示删除长度 示例如下 file= ...

  7. shell 环境变量的相关配置文件和配置方法

    shell 环境变量的相关配置文件和配置方法: bash 的配置文件: 全局配置: /etc/profile, /etc/profile.d/*.sh, /etc/bashrc 个人配置 ~/.bas ...

  8. Linux编程 12 (默认shell环境变量, PATH变量重要讲解)

    一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash  shell支持的Bourne变量 Bo ...

  9. shell模板变量替换

    我们经常使用一些模板语言来处理一些变量替换.比如jsp,php,velocity,freemarker,thymeleaf等.那对于shell来说,应该怎样替换变量呢.有一种很简单的办法可以做到. 先 ...

随机推荐

  1. TensorFlow的图切割模块——Graph Partitioner

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在经过TensorFlow的Placer策略模块调整之后,下一步就是根据Pla ...

  2. Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken

    前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...

  3. [转]图解Docker容器和镜像

    本文转自:https://www.cnblogs.com/wangqiaomei/p/5818636.html 图解Docker容器和镜像 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器 ...

  4. C# Parallel用法

    1.Parallel.Invoke 主要用于任务的并行 这个函数的功能和Task有些相似,就是并发执行一系列任务,然后等待所有完成.和Task比起来,省略了Task.WaitAll这一步,自然也缺少了 ...

  5. C#基础知识总结(六)

    摘要 方法的总结:其中包含方法的解释.方法参数.方法返回值,方法重载,out.ref.in的用法一.C#面向过程方面的总结 顺序结构:程序按照程序代码的顺序执行 分支结构:if-else.switch ...

  6. 条件分支SQL语句<一> Case When

    SELECT END ) AS MoneyIn, END ) AS MoneyOut, END ) AS BetMoney, END ) AS PctMoney, END ) AS WinMoney, ...

  7. 推送GitHub报错 fatal: Out of memory, malloc failed 解决办法

    现象: 推送GitHub时,出现如下报错 fatal: Out of memory, malloc failed (tried to allocate XXXXXX bytes)error: fail ...

  8. [android] listview入门

    Listview组件非常重要,4分之一的时间都是在搞这个,还是通过上一节的数据库,写个for循环,插入50条数据. 先使用笨方法显示数据,根布局LinearLayout 定义一个id,在activit ...

  9. 【Java每日一题】20170303

    20170302问题解析请点击今日问题下方的“[Java每日一题]20170303”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  10. C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】

    一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简 ...