首页 > 系统相关 >Shell编程——函数 和 输入/输出重定向

Shell编程——函数 和 输入/输出重定向

时间:2024-08-03 14:26:06浏览次数:12  
标签:输出 Shell 重定向 文件 编程 参数 输入 函数

文章目录

Shell函数

  • shell中函数的定义格式如下:
[ function ] funname [()]
{
	action:
	[return int;]
}
  • 参数说明:
    • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
    • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
  • 实例1:定义了一个函数并进行调用
#!/bin/sh
demoFun(){
	echo "这是我的第一个shell函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
# -----函数开始执行-----
# 这是我的第一个shell函数!
# -----函数执行完毕-----
  • 实例2:定义一个带有return语句的函数
funwithReturn(){
	echo "这个函数会对输入的两个数字进行相加运算..."
	echo "输入第一个数字:"
	read aNum
	echo "输入第二个数字:"
	read anotherNum
	echo "两个数字分别为 $aNum 和 $anotherNum !"
	return $(($aNum+$anotherNum))
}
funwithReturn
echo "输入的两个数之和为 $? !"
# 这个函数会对输入的两个数字进行相加运算...
# 输入第一个数字:
# 1
# 输入第二个数字:
# 2
# 两个数字分别为 1 和 2 !
# 输入的两个数之和为 3 !
  • 函数返回值在调用该函数后通过 $? 来获得。
  • 注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
  • 函数参数
    • 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
  • 实例:带参数的函数
funwithParam(){
	ehco "第一个参数为 $1 !"
	ehco "第二个参数为 $2 !"
	ehco "第十个参数为 $10 !"
	ehco "第十个参数为 $1 !"
	ehco "第十一个参数为 $1 !"
	ehco "参数总数有 $# 个!"
	echo "作为一个字符串输出所有的参数 $* !"
}
funwithParam 1 2 3 4 5 6 7 8 9 18 22
# 第一个参数为 1
# 第二个参数为 2
# 第十个参数为 10
# 第十个参数为 18
# 第十一个参数为 22
# 参数总数有 11 个!
# 作为一个字符串输出所有的参数 1 2 3 4 5 6 7 8 9 18 22 !
  • 注意
    • $10 不能获取第十个参数
    • 获取第十个参数需要${10}
    • 当n>=10时,需要使用${n}来获取参数。
  • 几个特殊字符用来处理参数
    在这里插入图片描述

Shell 输入/输出重定向

  • 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
  • 重定向命令列表如下:
    在这里插入图片描述
    需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输(STDERR)。

输出重定向

重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

command1 > file1

上面这个命令执行command1然后将输出的内容存入file1。
注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。

  • 实例:
    执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users):
$ who > users

执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。
你可以使用 cat 命令查看文件内容:

$ cat users

输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

command1 < file1

这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
注意:输出重定向是大于号(>),输入重定向是小于号(<)。

  • 实例:
    接着以上实例,我们需要统计 users 文件的行数,执行以下命令:
$ wc -1 users
# 2 users
  • 也可以将输入重定向到 users 文件:
$ wc -1 < users
# 2

注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容

  • 同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
command1 < infile > outfile

重定向深入讲解

  • 一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
    • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据
    • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据
    • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息
  • 默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
  • 如果希望 stderr 重定向到 file,可以这样写:
$ command 2>file
  • 如果希望 stderr 追加到 file 文件末尾,可以这样写:
$ command 2>>file
  • 2 表示标准错误文件(stderr)。
  • 如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
$ command > file 2>&1
# 或者
$ command >> file 2>&1
  • 如果希望对 stdin 和 stdout 都重定向,可以这样写:
$ command < file1 >file2
# command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。

/dev/null 文件

  • 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,
  • 那么可以将输出重定向到 /dev/null:
$ command > /dev/null
  • /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

  • 如果希望屏蔽 stdout 和 stderr,可以这样写:

$ command > /dev/null 2>&1
  • 注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
  • 这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。

标签:输出,Shell,重定向,文件,编程,参数,输入,函数
From: https://blog.csdn.net/weixin_73504499/article/details/140865921

相关文章

  • coreseek4.1使用sphinx做索引的索引控制shell脚本及逻辑 及 linux安装coreseek4.1的sp
    一、coreseek4.1使用sphinx做索引的索引控制shell脚本及逻辑    sphinx做索引时索引数据来源可以有多种方式,比如数据库mysql,pgsql,mssql,odbc,也可以是python脚本,也可以是xml数据文件,xmlpipe(publish:November1,2017-Wednesday)。    一般来说,如果索引的数据比较简单,......
  • 编程小白如何成为大神?大学新生最详细学习攻略
    对于渴望在编程领域大展身手的大学新生而言,这里呈上一份精心打造的入门指南,助力你在编程的探索之旅中稳健前行。一、编程语言的抉择在开启编程学习的征程时,首要任务便是挑选适宜的编程语言。对于初涉此领域的你们,以下几种语言值得考虑:Python语言,以其简洁明了的语法结构......
  • shell获取敏感词接口json数据更新时重启nginx+lua环境、一个逐步删除服务器上文件夹的
    一、shell获取敏感词接口json数据如有更新重启nginx+lua环境    因为工作需要,需要写一个shell脚本获取对应接口的数据(其它管理后台控制的敏感词库)。因为当前平台是nginx+lua脚本,重装加载敏感词需要重启nginx.实现起来也很简单,第一点,需要对获取的json数据进行分析,shell......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(5)
    目录写在前面101110131006100810021005写在最后写在前面补题地址:https://acm.hdu.edu.cn/listproblem.php?vol=65,题号7481~7493。以下按个人难度向排序。比较顺利的一场,今天双人双题环节没有卡太久,赢!置顶广告:中南大学ACM集训队绝赞招新中!有信息奥赛基础,获得NOIP省一等......
  • Linux软件编程
    8月1日学习了最后的标准IO,流的偏移。然后进入了文件IO的学习,包括文件的打开、读写、关闭以及偏移。之后又学习了剩余的一些函数接口,可以对文件进行一些其余操作。8月2日学习了目录文件和链接文件的操作。目录文件的操作包括目录的创建、删除以及获取当前目录的路径和改变当前......
  • PTA—基础编程题目集(7-13)
    7-12日K蜡烛图 题目描述股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(5)
    Preface唉感觉最近把把红温负作用啊,这场就中期写05被卡常了就红温了一整场,放着更简单的题不写就疯狂乱搞结果不出所料地被打爆了,只能说是好似,赛后发现甚至有个题是去年一轮的原,结果比赛的时候没一个人看题意,属实绷不住了感觉现在每场的策略和心态都有很大问题啊,不把这些问题......
  • SQLite库笔记:命令行shell
    SQLite项目提供了一个简单的命令行程序sqlite3,它允许用户对SQLite数据库手动输入和执行SQL语句。更多详情可参考官网(https://www.sqlite.org/cli.html)。help        SQLiteshell命令的help信息如下:.authON|OFFShowauthorizercallbacks.backup......
  • 编程技巧:如何优雅地合并两个有序数组?
    目录题目引用描述1.直接合并排序2.指针3.后逆向双指针进阶:你可以设计实现一个时间复杂度为O(m+n)的算法解决此问题吗?总结题目来自力扣引用合并两个有序数组给你两个按**非递减顺序**排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1......
  • Linux系统编程-open,close,重载和变参
    open函数open的用法第一个参数是待打开的文件名,第二个参数是位图。flags(位图)必须包含以下三项:只读,只写,读写。0个或多个文件的创建选项和文件的状态选项,可以以按位或的方式放到文件中去。第一个为只读。第二个为读写。第三个为只写,并且文件不存在的话要创建,而且文件......