Shell输出、重定向与管道符

Shell输出、重定向与管道符

由于Shell脚本批处理的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此,使用重定向和管道进行执行信息的过滤和提取显得尤为重要

1、Shell输出

1.1、标准输入输出

在Shell中,交互式硬件设备标准输入(stdin)和标准输出(stdout)是非常重要的概念

类型 设备文件 文件描述编号/代码 默认设备 功能描述
标准输入 /dev/stdin 0 键盘 从该设备接收用户输入的数据
标准输出 /dev/stdout 1 显示器 通过该设备向用户输出数据
标准错误输出 /dev/stderr 2 显示器 通过该设备报告执行出错信息

以下是使用Shell标准输入输出的示例:

bash 复制代码
# 使用echo命令输出到stdout
echo "Hello, World!"
# 使用管道将前一个命令的stdout作为后一个命令的stdin
echo "Hello, World!" | grep "World"
cat file.txt | grep "World"
1.2、echo指令

echo是Shell中的一个内部指令,用于将指定字符串打印输出到屏幕(标准输出)

echo指令常用选项及说明如下:

选项 说明
-n 不追加换号输出(默认追加换行输出)
-e 启用对特殊字符的转义

以下是一些使用示例:

1)打印字符串文本

bash 复制代码
echo "Hello, World!"       # Hello, World!

2)打印变量值

bash 复制代码
name="Alice"
echo "He name is $name"    # He name is Alice

3)打印转义字符

bash 复制代码
echo "\"Hello, World!\""   # "Hello, World!"

4)打印特殊字符

bash 复制代码
# 开启转义:\n将被解释为换行,\c将被解释为不换行
echo -e "Hello \n"
echo "World"
bash 复制代码
# \n输出
Hello 

World
# \c输出
Hello World

5)打印命令执行结果

bash 复制代码
echo `date`                # Sat Aug 24 16:28:41 CST 2024
1.3、print与printf指令

printprintf是Shell中的两个标准格式输出指令,其中,printksh(Korn Shell)的内置命令,printfbash(Bourne Again Shell)的内置命令

print只是一个简单的打印命令,每个标准输出后自动换行;printf则是格式化输出指令,printf不会自动在每个标准输出后添加换行符,如果需要换行,需要手动添加\n

printf指令的语法如下:

bash 复制代码
printf fs args
  • fs:格式字符串(format-string
  • args:参数列表

常用的格式字符串有:

  • %s:字符串,%ns指定输出n个字符(默认右对齐,%-ns表示左对齐)
  • %i:整数,%ni指定输出n个数字(默认右对齐)
  • %c:字符
  • %d:十进制整数
  • %f:浮点数
  • %e:科学计数法表示的浮点数
  • %m.nf:浮点数,共输出m位数,保留n位小数

以下是一个示例:

bash 复制代码
printf %s\n 1 2 3
printf "%s 体重 %4.2f kg\n" Tom 68.6543
printf "%3s\n" 12 3

输出结果如下:

bash 复制代码
123
Tom 体重 68.65 kg
 12
  3

2、Shell重定向

Shell(输出)重定向是指不通过标准输出到显示器上,而是输出到指定的位置(文件)。重定向一般通过在命令间插入特定的操符号来实现

类型 操作符 功能
重定向输入 < 从指定文件读取数据,而非键盘输入
重定向输出 > 将输出结果保存到指定文件(覆盖原有内容)
重定向输出(追加) >> 将输出结果换行追加到指定文件尾部
重定向错误输出 2> 将错误信息保存到指定文件(覆盖原有内容)
重定向错误输出(追加) 2>> 将错误信息追加到指定文件尾部
混合输出 &> 将标准输出、标准错误的内容保存到同一个文件中

以下是一个示例:

1)输出到文件

bash 复制代码
# 如果文件存在,则覆盖内容
echo "Hello, World!" > file.txt

2)追加到文件

bash 复制代码
# 追加到文件末尾
echo "Hello, World!" >> file.txt

3、Shell管道符

在Shell中,可以使用|连接两个命令,Shell会将前后两个进程的输入输出用一个管道相连,以便达到进程间通信的目的

Shell管道符|将前一个命令的标准输出,作为后一个命令的标准输入

以下是一个示例:

bash 复制代码
cat file.txt | grep "World"
相关推荐
龙仔72539 分钟前
人大金仓OS_Core数据库自动备份实施笔记(银河麒麟Linux)
linux·数据库·笔记·备份·人大金仓
老杨聊技术1 小时前
CentOS 7 安装 MySQL 8 保姆级教程
linux·mysql·centos
xiaoye-duck2 小时前
《Linux系统编程》Linux 系统多线程(六):<线程同步与互斥>线程同步(下):POSIX 信号量与环形队列生产者消费者模型详解
linux·线程
三言老师2 小时前
CentOS7.9:Redis‑Cluster集群部署结构化实战教程
linux·运维·服务器·数据库
大鱼>4 小时前
eBPF内核编程:从TC到XDP的全栈可观测性
linux·服务器·php
sxstj4 小时前
老旧电脑 Linux 系统完整推荐(按内存分档,新手友好)
linux
Lyra_Infra5 小时前
OpenClaw 服务异常故障分析报告
linux·人工智能
ShineWinsu6 小时前
对于Linux:HTTP中cookie、session的解析
linux·网络·c++·网络协议·http·cookie·session
冷莫溪6 小时前
Zabbix——认识及部署Zabbix(基于Rocky9.7)
linux·运维·php·zabbix
风曦Kisaki6 小时前
Kubernetes(K8s)笔记Day03: Pod命名空间,标签,Pod 的调度,污点与容忍度,Pod 常见状态和重启策略,Pod 生命周期
linux·运维·笔记·docker·云原生·容器·kubernetes