文件标识符是从0到9结束的整数,指明了与进程有关的特定数据流源。当Linux系统启动一个进程(该进程可能用于执行Shell命令)时,将自动为该进程打开三个文件:标准输入、标准输出和标准错误输出,分别由文件标识符0、1、2标识,如果进程要打开其他的输入和输出文件,则从3开始标识。另外3-9是保留的标识符,可以把这些标识符指定为标准输入、标准输出和标准错误输出的临时连接。通常这样可以解决好多复杂的重定向请求。
下面举一些由管道符连接的重定向的例子:
1.ls -l | sed -n '1,5p'--列出当前目录的子目录或文件,并由sed命令打印前五个目录或文件
2.more /etc/passwd | sed -n '/root/p' --查看passwd文件的内容,并由sed匹配文件中包含root字符串的行
3.more /etc/passwd | sed -n '/root/p' | sed -n '/login/p' --查看以root登录的用户
4.var1="Hello world"
var2="Beijing"
echo $var1 | sed "s/world/$var2/g" --输出将var1中的world替换为var2对应的值的内容(这里不能使用单引号,因为它不能进行变量引用)
5.var1="Hello world"
echo $var1|awk '{print length($0)}' --输出变量的长度
6.var1="Hello world"
echo $var1 | awk 'print length($1)' --输出变量中第一个域的长度
7.var1."Hello world"
echo $var1 | awk '{print substr($0,1,5)}' --输出变量中的1至5个子字符串
echo $var1 | awk '{print substr($0,7)}' --输出变量中从第七个字符串开始的子字符串
8.awk -F ':' '{print $1 | "sort"}' /etc/passwd --文件passwd中的内容以冒号作为分隔符,打印第一个经过排序的域
9.awk 'BEGIN{while (("ls /usr" | getline d)>0) print d}' --命令执行结果通过getline方式获取,并传给变量d,如果变量d的值存在,就打印该值
10.who | tee /tmp/who.sh --将当前用户信息通过tee重定向到who.sh文件中,这里可以通过tee -a追加内容到文件中。
IO重定向符号意义
cmd1 | cmd2 --cmd1的输出作为cmd2的输入
>filename --将输出写入到filename
<filename --将文件内容读入到标准输入中
>>filename --将输出写入到filename,如果文件有内容,将会以追加形式写入
>| filename --覆盖filename的内容
n > filename --将标识符为n的内容写入到filename
n < filename --将文件内容读入到标识符n中
n >> filename --将标识符n追加到filename中
例子:
cat > filename --以标准输入方式编辑文件的内容,直到ctrl+d结束
ls -l | grep ".*.sh" >> filename --将搜索到符合扩展名为rc的文件名追加到filename中
ls -l | grep ".*.sh" >| filename --强制覆盖内容
ls -l z* 2>filename 假设当前目录没有以z开头的文件,将标准错误输出重定向到filename中
代码块重定向是指在代码块内将标准输入或标准输出重定向到文件,而在代码块之外还是保留默认状态。
代码块输入重定向符号是<,输出重定向符号是>。
例子.while代码块:
#!/bin/bash
#将ls /etc的结果写到a.txt文件中
ls /etc > a.txt
#搜索a.txt文件中与rc.d所匹配的行,输出匹配行的行数
while [ "$filename" != "rc.d" ]
do
#按行读取a.txt内容
read filename
let "count"+=1
done < a.txt
echo "$count times read"
#测试循环体外面的标准输入是否被重定向
echo -n "---------Pls.Input Data:---------"
read test
echo $test
例子.for代码块
#!/bin/bash
#将ls /etc的结果写到a.txt文件中
ls /etc >a.txt
#计算a.txt文件的最大行数,并赋给maxline变量
maxline=$(wc -l < a.txt)
for filename in `seq $maxline` #利用seq产生循环参数
do
read filename
#for 循环中需要有if语句指定跳出循环的条件
if [ "$filename" = "rc.d" ]
then
break
else
let "count+=1"
fi
done < a.txt #将输入内容复制到文件a.txt
echo "$count times read"
#测试循环体外面的标准输入是否被重定向
echo -n "----Pls. Input Data:----"
read test
echo $test
shell中eval的使用情况:
如果变量中包含任何需要Shell直接在命令中看到的字符,就需要使用eval命令。命令结束符(;,|,&)、IO重定向符(<,>)和引号这些对Shell具有特殊意义的符号,必须直接出现在命令行中。
例子:
#!/bin/bash
#NAME变量保存每行的第1列,VALUE变量保存每行的第2列
while read NAME VALUE
do
eval "${NAME}=${VALUE}"
done < evalsource.sh
#测试变量的值
echo "var1=$var1"
echo "var2=$var2"
echo "var3=$var3"