1.Shell
Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式
称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一 个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条
一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释
执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把
脚本中的命令一行一 行敲到Shell提示符下执行。
shell脚本是一个文本文件,不能被操作系统识别,但是可以执行,是因为有中间解释器。
运行shell脚本时先加载解释器,解释器读取文本参数进行运行。
shell运行原理:
1.命令中转(创建子进程,分析执行,返回结果)
2.创建进程完成任务
3.父进程不受子进程错误影响
运行过程
test.sh将其内容以命令行参数传递给子bash,子bash再fork孙bash执行命令,将结果返回给子bash。
shell脚本:
1 #!/bin/bash
2
3 echo "hello bit"
在脚本中第一行必须为:告知解释器及版本,#!
运行shell脚本的方法:
1> bash或sh+文件名.sh
2>/bin/bash或sh+文件名.sh
3>chmod u+x test.sh 后直接运行./test.sh
cd与export 是比较特殊的命令,不会创建子进程,直接在当前环境下运行,这类命令被称为内置命令。
举个例子:
1 #!/bin/bash
4 sleep 1
5 pwd
6 sleep 1
7 cd ..
8 sleep 1
9 pwd
10
每隔一秒依次执行命令
结果:
还有一个 .表示当前路径,由当前的bash解释命令。
2.shell变量可以分为环境变量和本地变量
环境变量可以从父进程传给子进程,本地变量只存在于当前shell进程。
printenv显示环境变量,set设置本地变量和环境变量,环境变量是任何进程都有的,而本地变量是shell特有的。
3.eval
eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时被称为复杂变量。不过这些变量本身并不复杂。e v a l命令也可以用于回显简单变量,不一定是复杂变量。
例子:
1>显示test.sh内容
从结果看出使用eval命令不但可以置换该变量,还能够执行相应的命令。第一次扫描进行了file变量置换,第二次扫描执行了该字符串中所包含的命令cat test.sh。
2>还可以用来显示出传递给脚本的最后一个参数
在test.sh 脚本中写入 eval echo \$$#, 运行test.sh。结果如下:
3>.给每个值一个变量名
希望一个文件中的第一列成为变量名,第二列成为该变量的值
打开一个test写入
name dandan
age 21
在file.sh中写入
1 #!/bin/bash
2
3 while read NAME VALUE
4 do
5 eval "${NAME}=${VALUE}"
6 done <test
7 echo "$name $age"
运行file.sh,结果如下:
4>用eval命令创建指向变量的“指针"
4. ``与$()的区别和联系
举一个例子:
1. 1 #!/bin/bash
2
3 echo `echo \$HOSTNAME`
4 echo $(echo \$HOSTNAME)
我们可以使用sh -x test.sh来分析bash是如何来解释这个脚本的,返回的信息如下:
1>反引号中\$并没有将$的特殊意义转换 反引号包含的内容 echo \$hostname 仍然被解释
为一个echo $HOSTNAME 取到了这个变量的值并输出所以反引号返回的值为 localhost
2>$()则正好相反,$明显被\转义成了一个普通字符,所以并没有取到变量值,而是返回了
字符串本身的意思,故而返回了$HOSTNAME。
这说明反引号对反斜杠(\)有特殊的转化,至少我们看到当我们直接用1个\时,它本身
并不会起到转义的作用。
2.再给程序中多加一个\,运行结果:
这次结果与上次运行结果差不多正好相反。
反引号反而输出了$HOSTNAME的字面意思
$()如我们所愿的取到了变量值,并理所应当的输出了一个被转义的字符串\
3.若将代码改为
echo `echo \\\\`
echo $(echo \\\\)
运行结果:
4.若将代码改为
echo `echo \\\\\\\\`
echo $(echo \\\\\\\\)
运行结果:
由以上测试得出结论:
反引号其本身就对\进行了转义,保留了其本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。
所以我们可以简单的想象成反引号中: \\ = \
$()中则不需要考虑\的问题,与我们平常使用的一样:\ = \
不过一般情况下使用$()。
5.crond定时任务
crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而linux任务调度的工作主要分为以下两类:
1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置