2012年(24)
分类: Python/Ruby
2012-09-06 09:37:20
第三章 Shell输入和输出
3.1.1 echo
echo 命令可以显示文本行或变量,或者把字符串输入到文件
echo [option] string
- -e 解析转义字符
- -n 回车不换行,linux系统默认回车换行
-转义符(\c,\f,\t,\n)
\c回车不换行
\f 禁止
\t Tab
\n回车换行
3.2.1 read
read语句可以从键盘或文件的某一行文本中读入信息,并将其赋给一个变量
read varible1 varible2 ...
如果只指定了一个变量,那么read将会把所有的输入赋给该变量,直至遇到
第一个文件结束符或回车;如果给出来多个变量,它们按顺序分别被赋予不同
的变量。shell将用空格作为变量之间的分隔符。
3.3.2 cat
cat是一个简单而通用的命令,可以用它来显示文件内容,创建文件,还可以用
它来显示控制字符。
cat [options] filename2 ... filename2 ...
- -v显示控制字符
- 使用cat命令时要注意,它不会在文件分页符处停下来;它会一下显示完整个
文件。如果希望每次显示一页,可以使用more命令或把cat命令的输出通过管道
传递到另外一个具有分页功能的命令中(more,less).
- man cat
cat myfile1
cat myfile1 myfile2 myfile3
cat myfile1 myfile2 myfile3 >myfile
cat myfile
3.4.1 管道
可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示
格式:命令1|命令2
df -k | awk '{print $1}' | grep -v "Filesystem"
3.5.1 tee
tee命令把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中
tee -a files
如果系统在看到输出的同时,也将其存入一个文件,那么这个命令再合适不过了
一般用于管道之后
-a 把内容追加到文件中,如果没有-a,将覆盖文件内容
3.6.1 标准输入、输出和错误
在shell中执行命令时,每个进程都和三个打开的文件相联系,并使用文件描述符
来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。
文件 文件描述符
输入文件——标准输入 0(缺省是键盘,也可以是文件或其他命令的输出)
输出文件——标准输出 1(缺省是屏幕,也可以是文件)
错误输出文件——表示错误 2(缺省是屏幕,也可以是文件)
系统中实际上有12个文件描述符,可以任意使用文件描述符3到9
3.7.1 文件重定向
改变程序运行的输入来源和输出地点
command > filename 把标准输出重定向到一个新文件中(会覆盖原文件)
command >> filename 把标准输出重定向到一个文件中(追加)
command 1 > filename 把标准输出重定向到一个文件中
command>filename 2 >&1 把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把标准错误重定向到一个文件中
command 2 >> filename 把标准错误重定向到一个文件中(追加)
command >>filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
command
以filename2文件作为标准输出
command < filename command命令以filename文件作为标准输入
command << delimiter 在标准输入中读入,直到遇到dilimiter分界符
command < &m 把文件描述符m作为标准输入
command > &m 把标准输出重定向到文件描述符m中
command < &- 关闭标准输入
重定向标准输出
cat file | sort 1>sort.out
cat file | sort >sort.out 这两个命令等同
pwd >>path.out
>nullfile.txt 创建0字节的文件
重定向标准输入
sort
[root@localhost shell]# cat >> term.txt << SHELL
> hello,there I am using a $TERM terminal
> and my username is $LOGNAME
> bye ...
> SHELL
[root@localhost shell]# cat term.txt
hello,there I am using a vt100 terminal
and my username is root
bye ...
标准错误
[root@localhost shell]# grep "trident" miss 2> errmsg
[root@localhost shell]# cat errmsg
grep: miss: 没有那个文件或目录
3.8.1 结合使用标准输出和标准错误
[root@localhost shell]# cat myfile.txt abbb 1>accounts.out 2>accounts.err
[root@localhost shell]# cat accounts.out
aa
ccc
vvvv
nnn
dd
sss
[root@localhost shell]# cat accounts.err
cat: abbb: 没有那个文件或目录
3.9.1
合并标准输出和标准错误
合并标准输出和标准错误的时候,切记shell是从左至右分析相应的命令
grep "standard" standart.txt > grep.out 2>&1
在文件standart.txt查找standard内容输出到grep.out中,如果遇到错误输出到
屏幕中,屏幕的内容输出到grep.out中
正确输出和错误输出结果都会输出到grep.out文件中
[root@localhost shell]# grep "standard" standart.txt > grep.out 2>&1
[root@localhost shell]# cat grep.out
grep: standart.txt: 没有那个文件或目录
3.10.1 exec
exec命令可以用来替代当前shell;换句话说,并没有启动子shell,使用这一命令
时任何现有环境将会被清空,并重新启动一个shell。
exec command
其中的command通常是一个shell脚本。
对文件描述符进行操作的时候(也只有在这时),它不会覆盖你当前的shell
3.11.1文件描述符
3-9文件描述符可以供我们使用,0-2是系统默认的
exec与文件描述符的结合
[root@localhost shell]# cat file_desc
#!/bin/bash
#file_desc
exec 3<&0 0
read line2
exec 0<&3
echo $line1
echo $line2
[root@localhost shell]# ./file_desc
aaaa
ddfd
第四章 控制流结构
4.1 if语句
if 条件1 如果条件1成立
then 那么
命令1 执行命令1
elif 条件2 如果条件1不成立
then 那么
命令2 执行命令2
else 如过条件1,2均不成立
命令3 那么执行命令3
fi 完成
if 条件1
then 命令
fi
if [ "10" -lt "12" ]
then echo "Yes,10 is less than 12"
#yes 10 is less than 12
fi
if [ "10" -lt "12" ]
then
#yes 10 is less than 12
echo "Yes,10 is less than 12"
fi
if [ "13" -lt "12" ]
then
echo "Yes,13 is less than 12"
#yes 10 is less than 12
else
echo "NO,1 is greater than 12"
fi
#!/bin/bash
#if test3
echo -n "Enter you name:"
read NAME
#did the user just hit return
if [ "$NAME" == "" ]
then
echo "You did not enter you name"
else
echo "You Name is ${NAME}"
fi
#!/bin/bash
#if elif else fi
echo -n "Enter you name:"
read NAME
if [ -z $NAME ] || [ "$NAME" = "" ];then
echo "You did not enter you name"
elif [ "$NAME" = "root" ];then
echo "Hello root"
elif [ "$NAME" = "aaa" ];then
echo "Hellp aaa"
else
echo "You are not root or aaa,but hi,$NAME"
fi
4.2.1 case语句
case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配
成功,执行相匹配的命令。
case 值 in
模式1)
命令1
;;
模式2)
命令2
;;
esac
case取值后面必须为单词in,每一模式必须以右括号结束,取值可以为变量或常量
。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。模式匹配符*
表示任意字符,?表示任意单字符,[..]表示类或范围中的任意字符。
#!/bin/bash
#case select
echo -n "Enter a number from 1 to 3:"
read NUM
case $NUM in
1)
echo "You select 1"
;;
2)
echo "You select 2"
;;
3)
echo "You select 3"
;;
*)
echo "`basename $0`:This is not between 1 and 3">&2
exit;
;;
esac
4.3.1 for循环
for循环的一般格式为:
for 变量名 in 列表
do
命令
命令1
done
当变量值在列表里,for循环即执行一次所有命令,使用变量名访问列表中取值。
命令可为任何有效的shell命令和语句。变量名为任何单词。in列表用法是可选
的,如果不用它,for循环使用命令行的位置参数。in列表可以包含替换、字符串
和文件名
#!/bin/bash
#fortest1\
for loop in 1 2 3 4 5
do
echo $loop
done
#!/bin/bash
#fortest2
for loop in "oranger red bue grey"
do
echo $loop
done
#!/bin/bash
#fortest2
for loop in oranger red bue grey
do
echo $loop
done
4.4.1 until循环
until循环一般格式为:
until 条件
do
命令1
命令2
...
done
注:条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次
`df | grep /backup | awk '{print $5}' | sed 's/%//g'`
4.5.1 while循环
while循环一般格式为:
while 命令
do
命令1
命令2
...
done
注:在while和do之间虽然通常只使用一个命令,但可以放几个命令,命令
通常用作测试条件。
#!/bin/bash
#while test 从键盘输入内容
echo "按住
while echo -n "输入你最喜欢的电影:";read FILM
do
echo "Yeah,${FILM}是一部好电影!"
done
#!/bin/bash
#while read 从文件中读取内容
while read LINE
do
echo $LINE
done
4.6.1 break和continue
break[n]
退出循环
如果是在一个嵌入循环里,可以指定n来跳出的循环个数,默认是1
conitnue
跳出循环步
注:continue命令类似于break命令,只有一点重要区别,它不会跳出循环,