您的位置:首页 > 运维架构 > Shell

第二章 shell程序设计(1)

2014-01-03 21:49 253 查看
1.shell有很多种类,比如有csh、sh、tcsh和bash等。一般较为常用的是bash,位于/bin/bash路径下。
# /bin/bash --version
查看bash的版本
2.重定向
(1)重定向输出
# ls –l > lsoutput.txt
这条命令将ls命令的输出保存到文件lsoutput.txt中。
# ps >>lsoutput.txt
这条命令会将ps命令的输出附加到指定文件的尾部。
说明:文件描述符0表示一个程序的标准输入,文件描述符1表示标准输出,文件描述符2表示标准错误输出。
如果想对标准错误输出进行重定向,只需要把想要重定向的文件描述符编号加在>操作符的前面。
# kill –HUP 1234 >killout.txt2>lillerr.txt
将标准输出和标准错误输出分别重定向到不同的文件中。
kill   -HUP 是用来向指定进程发送一个HUP信号,许多程序在收到HUP信号时,会重新读取配置文件,这也就是为什么修改了配置后通常要用kill   -HUP的原因。

# kill -l 1234 >killouterr.txt2>&1
将标准输出和标准错误输出都重定向到同一个文件中
# kill –l 1234 >/dev/null2>&1
将输出信息放到Linux的通用回收站/dev/null中以便有效丢弃所有的输出信息
3.管道
可以用管道操作符‘|’来连接进程。在Linux下通过管道连接的进程可以同时运行,并且随着数据流在它们之间的传递可以自动地进行协调。
# ps > psout.txt
# sort psout.txt > pssort.out
等同于
# ps | sort > pssort.out
假如想查看系统中运行的所有进程的名字,但是不包括shell本身,那么可以使用下面的命令:
# ps –xo comm | sort | uniq | grep –v sh | more
这个命令首先按字母顺序排序ps命令的输出,再用uniq命令去除名字相同的进程,然后用grep –vsh命令删除名为sh的进程,最终将结果分页显示在屏幕上。
注意:如果有一系列的命令需要被执行,相应的输出文件是在这一组命令被创建的同时立刻被创建或写入的,所以决不要再命令流中重复使用相同的文件名。例如:
# cat mydata.txt | sort | uniq >mydata.txt
这样只能得到一个空文件,因为在读取文件mydata.txt之前就已经覆盖这个文件的内容了。
4.shell中的特殊符号
#!:告诉系统本行后面的参数是用来执行本文件的程序
#:程序中的注释
5.变量
(1)不需定义,都是按字符串存储(被赋值为数值时也是如此,shell会在使用的时候自动实现数字的转换),区分大小写。
(2)变量的赋值直接用变量名,取得变量的值需要在变量前加上$符号。
(3)变量名中如果包含空格,就必须用双引号将变量名括起来(赋值时等号右端也是如此),变量赋值时等号两边不能有空格。
(4)可以使用read命令将用户输入的值赋给变量。例如:# read salutation
6.环境变量
环境变量一般都用大写字母做名字(如PATH),脚本程序里面的变量一般都用小写字母做名字。
$PATH:以冒号分隔的用来搜索命令的目录列表。
$HOME:当前用户的HOME目录
$PS1:命令提示符,通常是$字符,但是在bash当中,可以是一些更复杂的值。
例如:[\u@\h \W]$
它给出了用户名、机器名和当前目录名以及一个$符号。
具体的示例如:root@tocore-desktop:/#
$PS2:二级提示符,一般为‘>’字符
$IFS:输入分隔符。可以是空格、制表符和换行符。
$0:shell脚本的名字
$#:传递给脚本的参数个数
$$:shell脚本的进程号
注:可以使用echo “$0”来打印出环境变量
7.参数变量
如果脚本程序在调用时带有参数,一些额外的变量就会被创建。即使没有传递任何参数,环境变量$#(传递给脚本的参数个数)也依然存在,只不过它的值是0而已。
$1,$2……:脚本程序的参数
$*:在一个变量中列出所有的参数,各个参数之间使用环境变量IFS中的第一个字符分隔开。如果IFS被修改了,那么$*将命令行分隔开。
$@:是$*的一种精巧的变体,它不使用IFS环境变量,所以即使IFS为空,参数也不会挤在一起。
# set foo bar bam
这条命令之后,$1的值变为foo,$2的值变为bar,依次类推。
8.条件判断命令
[或者test命令,使用[命令时还需要]来结尾
例如:if test –f test.c
then
echo “test.c is exist.”
else
……
fi
等同于写在同一行的:if test –f test.c; then echo “test.c isexist.”;else ……;fi
也等同于
if [ -f test.c ]
then
echo “test.c is exist.”
fi
注意:[前后的空格和]前面的空格都是必不可少的!test命令可以使用的条件类型归为3类:字符串比较、算术比较和与文件有关的条件测试。
9.控制结构
(1)if语句
if condition
then
statements
else
statements
fi
注意:condition的判定条件如果有变量的,使用双引号将变量引起来。
例如:if [ “$time” = “yes” ]
等号前后的空格是多余的,shell会忽略,只是为了更易阅读。
(2)elif语句
if condition
then
statements
elif
statements
else
statements
fi
(3)for语句
for结构用来处理一组值,这组值可以是任意字符串的集合。
for variable in values
do
statements
done
例如:for foo in bar fud 43
上面这个例子创建了一个变量foo,然后在for循环里面每次给它赋一个不同的值。这里是将bar fud43字符串直接列出,更常见的做法是使用shell的文件名扩展结果。
例如:for file in $(ls f*.sh)
可以打印当前目录中所有以字母f开头的脚本文件,并且这些脚本程序都是以.sh结尾。
(4)while语句
while condition
do
statements
done
(5)until语句
until condition
do
statements
done
注:与while循环很相似,只是把条件测试反过来了。循环将反复执行知道条件为真,而不是在条件为真时反复执行。
# sleep 10
实现睡眠10秒再次返回到终端。
(5)case语句
case variable in
pattern [ | pattern] ...) statements;;
pattern [ | pattern] ...) statements;;
...
esac
注意:双分号结尾。[]起的作用是表示其中的内容是一个参数项。
示例一
case “$time” in
yes) echo “1111”;;
no ) echo “2222”;;
* ) echo“0000”;;
esac
示例二
case “$time” in
yes | y | Yes | YES) echo“1111”;;
n* | N*) echo “2222”;;
*) echo “0000”;;
esac
示例三
case “$time” in
yes | y | Yes | YES )
echo “Good Morning”
echo “Up bright”
;;
[nN]*) echo “Good Afternoon”
;;
*) echo “11111”;;
esac
补充:为了让case的匹配功能更加强大,可以使用如下的模式:
[yY] | [Yy][Ee][Ss] )
语句中的|相当于或作用。
10.AND、OR以及语句块
AND
只有在前面所有的命令都执行成功的情况下才执行后一条命令,只有所有的执行成功AND才算执行成功。
示例:statement1 &&statement2 && statement3
注:touch file的作用是检查文件是否存在,如果不存在就创建它。
OR
持续执行一系列命令直到有一条命令成功为止,其后的命令将不再执行。
示例:statement1 || statement2 || statement3
语句块
如果你想在某些只允许使用单个语句的地方使用多条语句,可以将这些语句放在花括号{}中来构成一个语句块。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: