高级shell脚本编程之重定向、环境变量、shell函数
shell并不局限于简单地逐行执行命令,更为强大的功能之一是能够创建函数和函数库。希望自定义命令行交互的方式或者自动化文件处理任务。考虑用shell脚本。
1、输入和输出重定向
STDIN
STDOUT
STDERR
重定向操作符
> -------把STDOUT重定向到一个文件
< -------把STDIN重定向到一个文件
>> -------把STDOUT添加到一个文件的末尾
| -------从一个程序或者进程获取输出,然后发送给另一个程序或进程
<<delimiter 把当前的输入流和STDIN关联起来直到到达指定的分隔符。
[root@localhost shell]# cat << END
> the cat
> sat on the
> Mat.
> END
the cat
sat on the
Mat.
[root@localhost shell]# cat << END
> the cat
> sat on the
> Mat.
> END
the cat
sat on the
Mat.
>操作符有几个修饰标记,这些标记可以改变他的行为。
>& STDOUT和STDERR同时进行重定向。
>! 将迫使文件以append模式创建,或者以normal模式覆盖一个已经存在的文件。
>@ 将以二进制模式打开一个文件
2、命令替换:反引号和圆括号扩展
#!/bin/sh
Lines=`wc -l filelist`
echo $Lines
[root@localhost shell]# ./p206
28 filelist
Lines=$(wc -l filelist) //符号扩展
3、使用环境变量和shell变量
export命令用于修改shell变量,不带选项会显示很多环境变量。
export PATH=/bin
set命令可查看环境中已设置的shell变量
4、Shell函数
<1>、形式
name() {command;}
shell函数必须声明之后才能使用。还可以有返回值
#!/bin/sh
repeat(){
echo -en "I don't know $1 $2\n"
echo -en "hello\n"
return 0
}
repeat Your Name
<2>、嵌套函数和递归
#!/bin/sh
number_one(){
echo "this is first one func speaking..."
number_two
}
number_two(){
echo "this is second func speaking...."
}
number_one
<3>、作用域
作用域包括全局域和局部域:使用local关键字标识局部变量
#!/bin/sh
scope(){
local soc=1
gblsoc=2
echo "local soc in func = $soc"
echo "global gblsoc in func = $gblsoc"
}
scope
echo "local soc outside func = $soc"
echo "gblsoc outside in func =$gblsoc"
exit 0
补充:echo命令用法:
echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
该命令的一般格式为: echo [ -n ] 字符串
其中选项n表示输出文字后不换行;字符串能加引号,也能不加引号。用echo命令输出加引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割。
功能说明:显示文字。
语 法:echo [-ne][字符串]或 echo [--help][--version]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。
参 数:-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
–help 显示帮助
–version 显示版本信息