shell脚本知识梳理(五)输出

2018/12/6 posted in  shell脚本

echo

printf 格式化输出

[TOC]
- 区别一
print不会自动换行
echo 会自动换行

  • 区别二 print 用于格式打印 echo 用于标准的输出
printf "%-4s%-8s%-4s\n" 姓名 性别 体重
printf "%-4s%-8s%-4s\n" raoraoraorao 男 120
printf "%-4s%-8s%-4s\n" jun 女 130
printf "%-4s%-8s%-4s\n" bo 女 140

格式化输出 "s"表示字符串,一个宽度是10的字符,如果超出也显示,不足10用空白不齐,”-“表示左对齐。

管道

将一个命令的输出做威另一个命令的输入

重定向输出

原来是重定向到控制台输出,现在是重定向输出到文件

文件重定向
以控制台为参照
系统已经存在的文件描述符0(标准输入即键盘),1(标准输出即控制台),2(标准错误),其他是可自定义的文件描述符

白话理解cat命令行重定向
原来是从键盘输入,现在是从文件输入
cat 命令直接输入cat命令,从键盘输入,然后在控制台输出。
cat file 采用cat接收一个非STDIN文件输入,即将输入变成从文件读取
特别说明

重定向不限制于cat命令,任何命令都可以。
就是将一个命令的输出重定向到其他文件或者标准输出。在一个命令的输入时,也可以从一个文件或者标准输入作为输入,即输入重定向

“> ” 重定向输出到一个文件
">>" 重定向输出到一个文件并且是追加到后面

命令行里的输入与输出重定向

案例一:重定向错误输出到一个文件中
当我们的命令发生错误时,shell并不会将错误重定向到输出的重定向文件。重定向时要写上文件描述符

ls -al fileC 2> errfile.sh 

案例二:将正确信息重定向到一个文件,将错误信息重定向到一个文件

ls -al fileA.sh fileC.sh 2> errfile.sh 1> fileD.sh

案例三:将正确与错误输入到同一个文件

ls -al fileA.sh fileC.sh &>  fileD.sh 

脚本文件里的输入与输出重定向

要想在脚本文件里指定文件的输入与输出重定向,需要对这个要输出的内容做标记。告诉要输入或者输出到哪个文件。那么这个文件的描述符就需要在脚本里写出

  • 临时重定向 这里的&2是一种标记,标记其内容将会进入那个重定向,因为只起到临时标记的作用。所以叫临时重定向。这里的临时,永久是在脚本文件里告诉,命令的输入与输入。也就是在脚本文件里告诉有输出,有输入的一个流。
# 临时重定向 在一个shell脚本里,将一个输出设置成临时重定向

echo "hello owrk" >&2;
echo "你好" >&2;
  • 永久重定向 这里的永久重定向,说白点就是一次性标记。
exec 1> fileContent.sh
echo "hello world"
echo "你好"

# 更改为重定向
exec 2> errorfile.sh
echo "我报错了" >&2   
# 将我报错了进行标记 
exec 0< fileContent.sh
# 读物文件的所有行
count=1;
while read line  
do
echo "读取的内容${line},行数${count}";
count=`expr $count + 1`;
done

自定义文件描述符

  • 创建文件读写描述符号示例
#创建文件的读写描述符
exec 3<> fileContent.sh

#读取文件中的一行数据
read line <&3

#打印数据
echo "读取数据:"$line;
echo "哈哈,看写入文件了没wwwww有" >&3
  • 关闭文件描述符 关闭文件描述符后,不能写入文件

exec 3>&-

  • 恢复文件描述符(这个很难理解,实际上是一个暂存)
# 创建一个文件描述符3,执行原有文件描述符1,也就是是控制台输出
exec 3>&1;

# 创建文件描述符1,重定向到一个文件
exec 1> fileContent.sh

echo "工作1";

echo "工作2";

# 将1重定向到预先保存的控制台输出,所左这之后会输出都屏幕,也就是恢复了
exec 1>&3
echo "完成了";

修改输入并恢复输入
exec 6<&0;
exec 0< fileContent.sh

# 系统还是会从0所指向的文件进行读取,输出还是原有的输出
while read line 
do
 echo "文件内容${line}"
done

exec 0<&6;

echo "读取完成";

总结

0,1,2,是系统默认已经指定了的文件描述符,分别指向键盘文件,控台台文件,错误文件。exec的本质是在一个进程里创建一个文件描述符。在shell脚本里可以创建文件描述符指定特定的文件进行输入与输出。
文件描述符的理解,文件描述符只是一个符号