一、Shell和大多是的编程语言都一样都有输出输入重定向。
#!/bin/bash
:<<EOF
Shell的输入输出重定向
常用命令:
command>file 将输出重定向到file
command>>file 将输出以追加的方式重定向到file
command<file 将输入重定向到file
n > file 将文件描述为n的文件重定向到file
n >> file 将文件描述为n的文件以追加的形式重定向daofile
n > & m 将输出文件m和n合并
n < & m 将输入文件m和n合并
<< tag 将开始标记为tag和结束标记之间的内容作为输入
文件描述:
0通常时标准的输入,1是标准的输出,2是标准的错误输出
EOF
# 输出重定向
command1 > file1
# 查询输出重定向在文件夹中
$ who > users # 执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。
# 输入重定向
command1 < file1
# 统计文件行数
$wc -1 filename # filename为统计的文件名
# 使用wc将输入重定向到文件中
$ wc -1 < filename
# 将一个文件的输出输入到另一个文件中
command1 < infilename1 > outfilename # infilename为输入文件名,outfilename为输出文件名
:<<EOF
重定向深入讲解:
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
默认情况下,command > filename 将 stdout 重定向到 file,command < filename 将stdin重定向到 filename。
EOF
# 如果希望 stderr 重定向到 filename,可以这样写
$ command 2 > filename
# 如果希望 stderr 追加到 filename 文件末尾,可以这样写
$ command 2 > filename
# 表示标准错误文件(stderr)
# 如果希望将 stdout 和 stderr 合并后重定向到 filename
$ command > filename 2>&1 # command >> filename 2>&1
# 如果希望对 stdin 和 stdout 都重定向,可以这样写
$ command < filename1 >filename2
:<<EOF
Shell高级重定向方式Here Document,用于将输入重定向到一个交互式Shell脚本或程序
command << delimiter
document
delimiter
作用是将两个delimter之间的内容作为输出传递给command
*
结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
开始的delimiter前后的空格会被忽略掉。
EOF
# 在命令行中通过 wc -l 命令计算 Here Document 的行数
$ wc -1 <<EOF
xiaobai
SHELL
HELOO Liunx
EOF
# 命令行输出 3
cat << EOF
欢迎学习SHELL
小白学习SHELL
EOF
# 命令行输出: 欢迎学习SHELL
# 小白学习SHELL
# 如果不需要输出在屏幕上那么我们可以用 $ command > /dev/null
:<<EOF
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;
如果尝试从该文件读取内容,那么什么也读不到。
但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效
EOF
# 如果希望屏蔽stdout和stderr
$ command > /dev/null 2>&1
有一部分命令在命令行窗口执行
二、shell文件包含,其它编程语言叫引入。例如:python、java、php、C#、C++、C等编程语言
#!/bin/bash
:<<EOF
SHELL文件包含
和其它语言一样,Shell也可以包含外部脚本。这样方便封装一些公用代码作为一个独立文件
. filename # 注意点号(.)和文件名中间有一空格
或者
source filename
EOF
:<<EOF
./test.sh
name="Shell"
EOF
. ./test.sh # 引入test文件
# 或者使用source ./test.sh
echo "Hello ${name}"