微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

shell学习十二--变量输入read

read shell变量除了可以直接赋值和脚本传参外,还可以使用read命令从标准输入获得。 read内置命令,通过help read查看帮助 作用:从标准输入中读取一行 语法 read [ -p ][ -r ][ -s ][ -u[ n ] ] [ VariableName?Prompt ] [ VariableName ... 描述 read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量,用 IFS(内部字段分隔符)变量中的字符作为分隔符。 VariableName参数指定 shell 变量的名称,shell 变量获取输入行一个字段的值 由VariableName 参数指定的第一个 shell 变量指定给第一个字段的值,由 VariableName 参数指定的第二个shell 变量指定给第二个字段的值,以此类推,直到最后一个字段。如果标准输入行的字段比相应的由 VariableName 参数指定的 shell 变量的个数多,把全部余下的字段的值赋给指定的最后的 shell 变量。如果比 shell 变量的个数少,则剩余的 shell 变量被设置为空字符串。 注意: 如果省略了 VariableName 参数,变量 REPLY 用作缺省变量名。 由 read 命令设置的 shell 变量影响当前 shell 执行环境。 注: -p 标志的文件结束符引起该进程的清除,因此产生另外一个进程。 -r 指定读取命令把一个 \ (反斜杠) 处理为输入行的一部分,而不把它作为一个控制字符。 -s 把输入作为一个命令保存在 Korn shell 的历史记录文件中。 -u [ n ] 读取一位数的文件描述符号码 n 作为输入。文件描述符可以用 ksh exec 内置命令打开。n 的缺省值是 0,表示的是键盘。值 2 表示标准错误。 -t 超时退出 例子1: [root@node01 day4]# read -t 5 -p "Pls input:" a Pls input:[root@node01 day4]# 5秒钟为输入,自动退出 [root@node01 day4]# read -t 5 -p "Pls input:" a Pls input:[root@node01 day4]# read -t 5 -p "Pls input:" a Pls input:22 [root@node01 day4]# echo $a 22 [root@node01 day4]# read -t 5 -p "Pls input:" a b Pls input:33 33 [root@node01 day4]# echo $b 33 [root@node01 day4]# echo $a 33 上面read -p的功能可以用echo和read实现 例子2: 把之前的计算器修改为read输入 [root@node01 day4]# vi read.sh #!/bin/sh #a=$1 #b=$2 read -t 10 -p "input 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))” echo “a%b =$(($a%$b))” [root@node01 day4]# sh read.sh input number:10 8 “a-b =2” “a+b =18” “a*b =80” “a/b =1” “a**b =100000000” “a%b =2” “a%b =2” 例子3: 开发shell脚本分别实现以定义变量,脚本传参以及read读入的方式比较2个整数大小,用条件表达式(禁止if) 进行判断并以屏幕输出的方式提醒用户比较结果。 注意:一共是3个脚本。当用脚本传参以及read读入的方式需要对变量是否为数字做判断。 [root@node01 day4]# vi read_01.sh #!/bin/bash read -p "Pls input two number:" a b #no1 #[ -z "$a" ] || [ -z "$b" ] &&{ [ -z "$a" ] || [ -z "$b" ] && { echo "Pls input two num again." exit 1 } #no2 expr $a + 10 &>/dev/null RETVAL1=$? expr $B + 10 &>/dev/null RETVAL2=$? test $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 ||{ echo "Pls input two no again." exit 2 } #no3 [ $a -lt $b ] &&{ echo "$a < $b" exit 0 } [ $a -eq $b ] &&{ echo "$a = $b" exit 0 } [ $a -gt $b ] &&{ echo "$a > $b" exit 0 } [root@node01 day4]# sh read_01.sh Pls input two number:1 2 1 < 2 [root@node01 day4]# sh read_01.sh Pls input two number:1 1 1 = 1 [root@node01 day4]# sh read_01.sh Pls input two number:1^H Pls input two num again. [root@node01 day4]# sh read_01.sh Pls input two number:1 0 1 > 0 换成传参方式 [root@node01 day4]# cp read_01.sh arg.sh [root@node01 day4]# vi arg.sh #!/bin/bash #read -p "Pls input two number:" a b a=$1 b=$2 #no1 #[ -z "$a" ] || [ -z "$b" ] &&{ [ -z "$a" ] || [ -z "$b" ] && { echo "Pls input two num again." exit 1 } #no2 expr $a + 10 &>/dev/null RETVAL1=$? expr $B + 10 &>/dev/null RETVAL2=$? test $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 ||{ echo "Pls input two no again." exit 2 } #no3 [ $a -lt $b ] &&{ echo "$a < $b" exit 0 } [ $a -eq $b ] &&{ echo "$a = $b" exit 0 } [ $a -gt $b ] &&{ echo "$a > $b" exit 0 "arg.sh" 39L,473C written [root@node01 day4]# sh arg.sh 1 2 1 < 2 [root@node01 day4]# sh arg.sh 1 3 1 < 3 [root@node01 day4]# sh arg.sh 1 1 1 = 1 [root@node01 day4]# sh arg.sh 2 1 2 > 1 [root@node01 day4]# sh arg.sh 2 Pls input two num again. [root@node01 day4]# sh arg.sh 2 df arg.sh: line 25: [: df: integer expression expected arg.sh: line 30: [: df: integer expression expected arg.sh: line 35: [: df: integer expression expected 如果使用传参的话,判断更简单 [root@node01 day4]# vi r.sh #!/bin/bash #read -p "Pls input two num:" a b a=$1 b=$2 #no1 #[ -z "$a" ] || [ -z "$b" ] && { [ $# -ne 2 ]&&{ $# 这个脚本的参数个数 #echo "Pls input two num again." echo "USAGE:$0 NUM01 NUM02" exit 1 } #no2 expr $a + 10 &>/dev/null RETVAL1=$? expr $b + 10 &>/dev/null RETVAL2=$? test $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 ||{ echo "pls input two "num" again." exit 2 } #num3 [ $a -lt $b ] &&{ echo "$a < $b" } #num4 [ $a -eq $b ] &&{ echo "$a = $b" } #num5 [ $a -gt $b ] &&{ echo "$a > $b" } echo "Usage: `basename $0` $script_parameters" Usage: 到这里都只是字符串,会直接显示成 Usage: `basename $0` 这句会先执行,然后把结果返回到这个echo 里面来 basename应该是一个方法,$0是传入到这个shellscript中的第一个参数 $script_parameters 另一个变量,放在字符串中,echo时会显示变量的值 例子4:制作一个菜单 [root@node01 day4]# vi menu1.sh #!/bin/bash cat <<END 1.first 2.tow END [root@node01 day4]# sh menu1.sh 1.first 2.tow [root@node01 day4]# [root@node01 day4]# vi menu2.sh #!/bin/bash menu(){ cat <<END 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[install redis] 5.[install MysqL] 6.[install mongodb] pls input the num you want: END } menu [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[install redis] 5.[install MysqL] 6.[install mongodb] pls input the num you want: [root@node01 day4]# vi menu2.sh read -t 15 a #!/bin/bash menu(){ cat <<END 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[install redis] 5.[install MysqL] 6.[install mongodb] pls input the num you want: END read -t 15 a } menu [ $a -eq 1 ]&&{ echo "installing jdk" sleep 3 echo "jdk is installed" menu } [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[install redis] 5.[install MysqL] 6.[install mongodb] pls input the num you want: 1 installing lamp lamp is installed 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[install redis] 5.[install MysqL] 6.[install mongodb] pls input the num you want: 2 [root@node01 day4]# [root@node01 day4]# cat menu2.sh #!/bin/bash menu(){ cat <<END 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: END #read -t 15 a } menu read -t 15 a [ $a -eq 1 ]&&{ echo "installing jdk" sleep 3 echo "jdk is installed" exit } [ $a -eq 2 ]&&{ echo "installing Nginx" sleep 3 echo "Nginx is installed" exit } [ $a -eq 1 ]&&{ echo "installing tomcat" sleep 3 echo "tomcat is installed" exit } [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: 1 installing jdk jdk is installed [root@node01 day4]# 加一个判断 [root@node01 day4]# vi menu2.sh #!/bin/bash menu(){ cat <<END 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: END #read -t 15 a } menu read -t 15 a [ $a -eq 1 ]&&{ echo "installing jdk" sleep 3 echo "jdk is installed" exit } [ $a -eq 2 ]&&{ echo "installing Nginx" sleep 3 echo "Nginx is installed" exit } [ $a -eq 1 ]&&{ echo "installing tomcat" sleep 3 echo "tomcat is installed" exit } [ ! $a -eq 1 -o ! $a -eq 2 -o ! $a -eq 3 ]&&{ 判断 echo "bye" exit } "menu2.sh" 34L,494C written [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: 1 installing jdk jdk is installed [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: 4 bye [root@node01 day4]# vi menu2.sh #!/bin/bash menu(){ cat <<END 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: END #read -t 15 a } menu read -t 15 a [ $a -eq 1 ]&&{ echo "installing jdk" sleep 3 echo "jdk is installed" exit } [ $a -eq 2 ]&&{ echo "installing Nginx" sleep 3 echo "Nginx is installed" exit } [ $a -eq 1 ]&&{ echo "installing tomcat" sleep 3 echo "tomcat is installed" exit } #[ ! $a -eq 1 -o ! $a -eq 2 -o ! $a -eq 3 ]&&{ [ "$a" != 1,2,3 ]&&{ 不等于也可以 echo "bye" exit } "menu2.sh" 35L,516C written [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: 4 bye [root@node01 day4]# 例子5:多级菜单 [root@node01 day4]# cat menu3.sh #!/bin/bash menu1(){ cat <<END ******************** 1.[install web] 2.[install db] 3.[exit] Pls input the num you want: ******************** END } menu2(){ cat <<END ******************** 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[exit] Pls input the menu2 num you want: ******************** END } menu1 read num [ $num -eq 1 ]&&{ menu2 read num2 [ $num2 -eq 1 ]&&{ echo "start installing jdk." exit } } [root@node01 day4]# [root@node01 day4]# sh menu3.sh ******************** 1.[install web] 2.[install db] 3.[exit] Pls input the num you want: ******************** 1 ******************** 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[exit] Pls input the menu2 num you want: ******************** 1 start installing jdk. [root@node01 day4]#

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2280端口映射到公网,发现经常被暴力破解,自己写了个临时封禁ip功能的脚本,实现5分钟内同一个ip登录密码错误10次就封禁这个ip5分钟,并且进行邮件通知使用步骤openwrt为19.07.03版本,其他版本没有测试过安装bashmsmtpopkg
#!/bin/bashcommand1&command2&wait从Shell脚本并行运行多个程序–杨河老李(kviccn.github.io)
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/phpls-ls 2.编辑修改.bash_profile文件(没有.bash_profile文件的情况下回自动创建)sudovim~/.bash_profile在文件的最后输入以下信息,然后保存退出exportPATH="/Applications/MAMP/bin/php/php7.2.20/b
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如zh_CN之类的语言包,进行中文语言包装:apt-getinstalllanguage-pack-zh-hans3、安装好后我们可以进行临时修改:然后添加中文支持: locale-genzh_CN.UTF-8临时修改> export LC_ALL='zh_CN.utf8'> locale永久
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexadecimalbash2#[0~1]0[0~7]0x[0~f]or0X[0~f]perl0b[0~1]0[0~7]0x[0~f]tcl0b[0~1]0o[0~7]0x[0~f]bashdifferentbaserepresntationreference2.StringlengthLanguageStr
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全命令补全方法:yum-yinstallbash-completionsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)echo"source<(kubectlcompletionbash)">>~/.bashrc 
参考这里启动jar包shell脚本修改过来的#!/bin/bash#默认应用名称defaultAppName='./gadmin'appName=''if[[$1&&$1!=0]]thenappName=$1elseappName=$defaultAppNamefiecho">>>>>>本次重启的应用:$appName<
#一个数字的行#!/bin/bashwhilereadlinedon=`echo$line|sed's/[^0-9]//g'|wc-L`if[$n-eq1]thenecho$linefidone<1.txt#日志切割归档#!/bin/bashcd/data/logslog=1.logmv_log(){[-f$1]&&mv$1$2
#文件增加内容#!/bin/bashn=0cat1.txt|whilereadlinedon=[$n+1]if[$n-eq5]thenecho$lineecho-e"#Thisisatestfile.\n#Testinsertlineintothisfile."elseecho$linefidone#备份/etc目录#
# su - oraclesu: /usr/bin/ksh: No such file or directory根据报错信息:显示无法找到文件 /usr/bin/ksh果然没有该文件,但是发现存在文件/bin/ksh,于是创建了一个软连接,可以规避问题,可以成功切换到用户下,但无法执行系统自带命令。$. .bash_profile-ksh: .: .b