输入/输出 的 重定向 . <?xml:namespace prefix = o />

 标准输入设备: 对应设备文件:

     /dev/stdin, (0)为设备的描述符 默认"KEYBOARD"

 标准输出设备:

     /dev/stdout, 1 ,  默认"MONITOR"

 错误输出:

     /dev/stderr, 2     默认"MONITOR"

重定向;

 输入重定向:  表示

 输出重定向:  表示 覆盖,会覆盖原有内容

               >> 表示追加重定向

   错误 输出 : 2>  表示

( 输出流与错误输出流 是 不同 的数据流 )

  合并错误标准输出流 &>   但 不支持&>>

为 避免手误:

 set -c,不允许覆盖现有文件

       ,禁用覆盖重定向

  可使用  " >|  " 强制覆盖重定向

例 : ls /var >> /file 2>> /file2 正确信息 错误信息分别存放

管道:: “|”

  COMMAND | COMMAND | COMMAND

第一个命令的输出结果,当成后一个命令的输入,

例 : echo “123456” | passwd --stdin redhat   --stdin   ( 接受 )

tee:一个输入流分成两流

例 : ls /etc | tee /tmp/ls.out | less

多个命令的输出保存至同一文件

自定义输出重定向:0,1,2,3

定义:3> 3>>  3<

例 :  exec 3> /tmp/myout.out   使 文件 保持 打开,避免反复打开 一个文件降低系统性能

     ls /var >&3

撤销: exec 3>&-

> /dev/null

" &> /dev/null  " 数据黑洞 所有数据丢弃

程序执行流:

 顺序执行

 选择分支

 循环执行:

循环 ::

 for I (变量) in 1 2 3 4 5 (LIST) ; do

    statement1

    statement2

  done

 for (变量) in `seq 1 10`; do   =for I in 1 2 3 4 5 6 7 8 9 10; do

  useradd user$I

  echo user$I | passwd --stdin user$I

done

`seq 1 10` ,110展开

for I in `seq 1 10`; do  =  for I in {1..10}; do

简单列表 1 2 3 4 5 

复杂列表: This is Tom\'s cat

变量 `seq 1 $LINS`

命令 `ls /var`

通配符 for I in /var/*

for LINE in `cat /etc/passwd`; do

默认空格被当成分隔符 , 还有换行符  

echo $IFS :内置内建字段换行符

IFS=$'\n' :只换行符

 
练习 ::

写一个脚本:
1、创建目录/tmp/scripts
2、切换工作目录至此目录中
3、复制/etc/pam.d目录至当前目录,并重命令为test
4、将当前目录中的test及其里面的文件和子目录的属主改为redhat
5、将test及其子目录中的文件的其它用户的权限改为没有任何权限


#!/bin/bash

#

 mkdir -p /tmp/scripts

 cd /tmp/scripts/

 cp -r /etc/pam.d /tmp/scripts/test

 chown redhat:redhat /tmp/scripts/test -R

 chmod o=--- -R /tmp/scripts/test

写一个脚本:
1、显示当前系统日期和时间,而后创建目录/tmp/lstest
2、切换工作目录至/tmp/lstest
3、创建目录a1d, b56e, 6test
4、创建空文件xy, x2y, 732
5、列出当前目录下以ax或者6开头的文件或目录;
6、列出当前目录下以字母开头,后跟一个任意数字,而后跟任意长度字符的文件或目录;
#!/bin/bash
#
date
mkdir /tmp/lstest
cd /tmp/lstest
mkdir ald b56e 6test
touch xy x2y 732
ls -ldh [ax6]*
ls -ldh [[:alpha:]][0-9]* 

写一个脚本:
1、切换工作目录至/var
2、依次向/var目录中的每个文件或子目录问好,形如:
 (提示:for FILE in /var/*; for FILE in `ls /var`; 
 Hello, log
 Hello, run
3、统计/var目录下共有多个文件,并显示出来

#!/bin/bash

#

cd /var

A=0

f or FILE in /var/*; do

A=$[$A+1]

echo "Hello,$FILE"   

done

 echo "There are $A files" 

 echo "They are :"

 ls /var

unset A