shell脚本:数据批量处理,任务批量处理
shell脚本文件以.sh为后缀,其实际无意义。
shell运行原理:
1.命令中转(创建子进程,分析执行,返回结果)
2.创建进程完成任务
3.父进程不受子进程错误影响
file /bin/bash,为二进制文件,shell的解释器(不是shell脚本)
bash与shell的关系:王婆与媒婆
在脚本中第一行必须为:告知解释器及版本,#!称为shebang#!bin/bash
bash test.sh
test.sh被当作参数传给可执行文件即子bash,
运行过程如下图:
运行方式有:
cd,export这类命令没有创建子进程,当前环境直接运行,这种命令叫内置命令。即通过bash:二进制内函数调用。
.表示
1.当前路径
2. . ./test.sh为在当前shell下执行脚本文件
不是内置命令会创子进程,execv程序替换
注:source和.的用处一样
printenv和env可打印出当前shell的环境变量。
env:打印环境变量。
set:打印本地变量和环境变量,范围更大
即例子如下
取消变量设置为unset:删除已定义的环境变量或本地变量.
在定义变量时不需$,取变量值时要用$。Shell变量不需要明确定义
类 型,事实上Shell变量的值都是字符串,例如我们定义VAR=45,其实VAR的值是字符串45不是整数。 Shell变量不需要先定义后使用,如果对一个没有定义的变量取值,则值为空字符串。
如下例子:
即vblef无法显示(未找到),需加{vbl}df;
也可以两条命令msg=$(cat file | grep 'hello bit')
算术代换:$((val)+$(val1))
不加$,其中一个加,两个都加都可以执行整数加法。
重要概念:
1.$(与`的区别与联系
联系:二者都可用于命令替换作用一样。
区别:对于命令替换来说, $(COMMAND)形式已经取代了后置引用`COMMAND`
(1) Bash中的后置引用 `COMMAND`会将命令中的\\转义为\再执行,而$(COMMAND)则不会进行转义
eg:
echo `echo '\\'`
输出:
\
echo $(echo '\\')
输出
\\
(2) $(...)形式的命令替换是允许嵌套的
在多层次的复合替换中,反引号须要额外的跳脱( /` )处理,而 $( ) 则比较直观。例如:`com1`com2`` 你这么写就是错的。需要`com1/`com2/``如果有多个命令嵌套就比较复杂了。而用$()就比较直观比如$(com1$(com2$(com3))) 不过,$( ) 并不是没有劣势的...反引号 基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高。而 $() 并不见的每一种 shell 都能使用.
2.eval命令
eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时被称为复杂变量。不过这些变量本身并不复杂。e v a l命令也可以用于回显简单变量,不一定是复杂变量。显示简单变量
显示复杂变量
eg:新建hello.txt写入hello world
从上面的结果可以看出,使用eval命令不但可以置换该变量,还能够执行相应的命令。第一次扫描进行了变量置换,第二次扫描执行了该字符串中所包含的命令cat hello.txt。
3.还可以用来显示出传递给脚本的最后一个参数
(1)eval echo \$$# 取得最后一个参数
如:cat last
eval echo \$$#
./last one two three four
four
第一遍扫描后,shell把反斜杠去掉了。当shell再次扫描该行时,它替换了$4的值,并执行echo命令
(2)$ cat test1
#!/bin/bash
echo "Last argument os "$(eval echo \$$#)""
$ ./test1 value bank test last
Last argument os last
在上面的脚本中,eval命令首先把$ $ #解析为当前shell的参数个数,然后在第二次扫描时
得出最后一个参数。
4.给每个值一个变量名
可以给一个值一个变量名。假定有一个名为test2的文件:
你希望该文件中的第一列成为变量名,第二列成为该变量的值,这样就可以:
[neau@mail ~]$ cat test2
COMMANY TQ
LANGUE ENGLISH
LIKE YES
[neau@mail ~]$ cat test3
#!/bin/bash
while read NAME VALUE
do
eval "${NAME}=${VALUE}"
done
echo "$COMMANY $LANGUE $LIKE"
[neau@mail ~]$ ./test3
TQ ENGLISH YES
5.以下示意如何用eval命令创建指向变量的“指针”:
3.crond定时任务
crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而linux任务调度的工作主要分为以下两类:
1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置