输入/输出
的
重定向
.
<?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` ,将1到10展开
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及其子目录中的文件的其它用户的权限改为没有任何权限
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、列出当前目录下以a、x或者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、显示当前系统日期和时间,而后创建目录/tmp/lstest
2、切换工作目录至/tmp/lstest
3、创建目录a1d, b56e, 6test
4、创建空文件xy, x2y, 732
5、列出当前目录下以a、x或者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目录下共有多个文件,并显示出来
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
转载于:https://blog.51cto.com/weiweilinux/619869