shell 脚本编程学习(五) 输入输出重定向和环境变量

输入输出重定向

输入输出重定向在 shell 中经常使用,例如把一个命令的输出保存到文件或者通过管道将命令组合起来使用等,shell 脚本允许我们用 shell 实现更复杂的逻辑,所以有必要熟练掌握输入输出重定向机制。
我们知道在 linux 系统中“一切皆是文件”,而每次打开一个 shell 的时候,linux 都会打开 3 个文件供程序使用:

  • STDIN(标准输入)——通常是终端键盘
  • STDOUT(标准输出)——通常是终端显示器
  • STDERR(标准错误输出)——通常也是终端显示器

默认情况下程序从键盘获得输入再把结果和错误打印到屏幕上,但这不是程序工作的唯一方式,我们可以使用重定向操作符指定其它的输入和输出文件让程序使用。

# > 操作符将 STDOUT 重定向到一个文件
ls > out.txt 

# >> 操作符将 STDOUT 添加到一个文件的末尾
ls >> out.txt 

# < 操作符将 STDIN 重定向到一个文件
grep '\.txt' < in.txt 

# | 管道操作符,从一个程序或进程获得输出,然后作为输入发送给另一个程序或进程
ls | wc -l 

# << delimiter 把当前的输入流和 STDIN 关联起来直到到达指定的分隔符(delimiter)
# php 中也有这样的语法,当需要指定大量多行的文本输入时很有用
cat <<END
hello world!
line2
line3
END

由于 linux “一切皆是文件”的设计,通过重定向输入输出文件,我们可以让我们的程序从普通文件、管道文件、网络套接字、硬件设备等任何地方获得输入,也可以将程序结果输出到任何地方,这样就大大提高了程序的灵活性。最后还要注意输出重定向操作符的几个修饰标记,实践中经常会用到。

# 将输出发送给空设备,这么做可以实现舍弃程序输出的效果。
# 计划任务中那些需要反复执行又不想输出其结果的操作可以这样重定向。
sh script.sh > /dev/null 

# 将 STDERR 重定向到一个文件。
# 前面一直在说 STDIN 和 STDOUT 的重定向,其实想重定向 STDERR 只要在 > 操作符前加个 2 修饰就行了。
sh script.sh 2> error.txt 

# 在 > 操作符前加 & 修饰表示把 STDIN 和 STDOUT 都重定向到一个文件。
sh script.sh &> /dev/null 

# 这是另一种写法,即将 STDIN 重定向到一个文件,再将 STDERR 重定向到 STDIN,和上面的写法效果相同。
sh script.sh > /dev/null 2>&1 

# 也可以将 STDIN 和 STDOUT 重定向到不同的文件。
sh script.sh >out.txt 2>error.txt 

环境变量

在 shell 中直接设置的变量是只在当前 shell 中有效的。有时候我们会想让一些变量在子 shell 中也能使用的,例如想要传递变量给 shell 脚本的时候,这时应该使用 export 命令将变量导出,这种在子 shell 中也有效的变量也叫做环境变量。

# 导出 name 变量,以后在子 shell 中读取 name 变量也会得到数据 123
name=123
export name=123

# 设置并导出 PATH 环境变量让让它多包含一个目录
export PATH=$path:/home/my/shell 

环境变量的原理很简单,可以理解为当前 shell 会记录下用 export 导出的变量,当从当前 shell 开启子 shell 时(例如运行一段 shell 脚本)会为子 shell 预先设置好导出的变量。由此我们也知道 shell 导出的变量只对它的子 shell 有效 。

# export 测试1 导出变量对子 shell 有效
# test1.sh
echo $name1

# main shell
name1=jack
export name1
sh test1.sh 
# 输出 jack


# export 测试2 导出变量对父 shell 无效
# test2.sh
name2=jack
export name2

# main shell
sh test2.sh
echo $name2 
# 输出为空,即 name2 变量没有被设置

另外想查看当前 shell 中已经设置的变量,使用 set 命令。想删除一个变量可以用 unset 命令。

# 列出当前 shell 中所有已经设置的变量
set 

# 从当前 shell 中删除 name 变量
unset name 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章