热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

shell脚本编程处理输入输出

一、读取用户输入(1)基本的读取命令  read命令接受从标准输入或文件描述符的输入,并将接收到的数据赋值到一个变量。1$catread.sh2#!binbash3#testthe

一、读取用户输入

(1)基本的读取命令
    read命令接受从标准输入或文件描述符的输入,并将接收到的数据赋值到一个变量。
1 $ cat read.sh 
2 #!/bin/bash
3 # test the read command
4 echo -n "please input your name: "
5 read name
6 echo "Hello $name"
    read命令的-p选项,可以直接在read命令行指定提示符,如上一例子可以写为
read -p "please input your name: " name
    read可以接收多个用户输入值,并赋值到多个变量,如果变量表在数据之前用完,则剩下的数据就会分配到最后一个变量
read -p "please input your name: " first last
echo "Hello $first.$last"
    如果在read命令行不指定变量,read命令将会把用户输入的数据放入特殊环境变量REPLY中。
(2)读取超时
    read命令使用时,如果用户没有输入会一直等待;使用-t选项可以指定超时时间,单位为秒。
    读取超时后,read命令会返回一个非0的状态退出码。如:
read -t 5 -p "please input your name: " name
    可以使用-n选项指定读取的字符数,read命令读取到相应字符后会自动退出,不需回车。
(3)隐藏方式读取
    需要读取用户输入,但不希望输入显示在屏幕上,可以使用-s选项。
read -t 5 -s -p "please input your passwd: " passwd

二、输入输出重定向

(1)标准文件描述符
    linux系统将每个对象当作文件来处理,使用文件描述符来标识每个文件对象。文件描述符是一个非负数,可以唯一标识回话中打开的文件。每个过程最多可以有9个文件描述符。bash shell保留了3个文件描述符0、1和2。
        0 — STDIN     — 标准输入
        1 — STDOUT — 标准输出
        2 — STDERR  — 标准错误
    一般命令的标准输入是键盘,标准输出和标准错误的输出是屏幕。
    使用 <重定向标准输入,使用 > 重定向标准输出。
(2)重定向错误
    使用重定向时,若产生错误,如
ls -l badfile > test
ls: 无法访问badfile: 没有那个文件或目录
    错误提示输出到屏幕上,test文件被创建,但是为空。
    如果希望将错误提示输出到文件中,需要在重定向符号>前加上标准错误的描述符2
ls -l badfile 2> test
$ cat test 
ls: 无法访问badfile: 没有那个文件或目录
    如果需要将标准输出和标准错误都重定向到文件,需要分开处理,如:
ls -l goodfile badfile 2> test_err 1> test
    这样可以将错误提示和标准输出重定向到不同的文件中。
    bash shell提供了特殊的重定向符&> 可以将STDERR和STDOUT的输出重定向到同一文件中。
(3)在脚本中重定向输出
    临时重定型:如果需要将STDOUT的消息转换成STDERR的输出,可以通过在输出的行后加 <&2
echo "this is a error message" >&2
    这样这行命令的输出则会显示在STDERR文件描述符所指向的任何位置,而不再是STDOUR。
    永久重定向:可以通过exec命令告诉shell脚本执行期间重定向某个特定的文件描述符。
1 #!/bin/bash
2 #redirecting alloutput
3 exec 1>testfile
4 echo "this is a test of redirecting alloutput"
(4)在脚本中重定向输入
    exec命令允许将STDIN重定向到文件中,如:
        exec 1
    这个命令告诉shell需要从file中获取输入,而不是STDIN。
1 #!/bin/bash
2 #redirecting file input
3 exec 0< testfile
4 count=1
5 while read line; do
6     echo "Line #$count: $line"
7     count=$[ $count + 1 ]
8 done
    当运行read命令时,不再需要用户通过键盘输入,而是直接从testfile文件中读取数据。

推荐阅读
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Linux Shell脚步的格式
    Shell脚步等多个命令的组合,可以做成一个shell文件(1.sh)赋权执行执行命令的方式前两张新的进程中执行,对当前进程不产生影响(cdtmp;pwds ... [详细]
  • 随着我司的应用都开始容器化,相应的ETL流程也需要迁移到容器中。常规的SQL和shell脚本迁移之后执行基本没有问题,主要的问题在于数据接入使用kettle的场景下,kettle启 ... [详细]
  • MySQL5.6.40在CentOS764下安装过程 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • docker容器的数据管理一:数据卷实现数据的永久化,完全独立于容 ... [详细]
  • mysql自动打开文件_让docker中的mysql启动时自动执行sql文件
    本文提要本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动My ... [详细]
  • Shell编程(三)bash数学运算
    本文介绍shell中的expr和bash自带的 ... [详细]
author-avatar
经典调剂行570
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有