shell脚本知识

1.Shell

     Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式

称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一 个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条

一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释

执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把

脚本中的命令一行一 行敲到Shell提示符下执行。

 shell脚本是一个文本文件,不能被操作系统识别,但是可以执行,是因为有中间解释器。

运行shell脚本时先加载解释器,解释器读取文本参数进行运行。

 shell运行原理:

    1.命令中转(创建子进程,分析执行,返回结果)

    2.创建进程完成任务

    3.父进程不受子进程错误影响

运行过程

shell脚本知识

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

shell脚本知识

cd与export 是比较特殊的命令,不会创建子进程,直接在当前环境下运行,这类命令被称为内置命令。

举个例子:

  1    #!/bin/bash

  4    sleep 1

  5    pwd

  6    sleep 1

  7    cd ..

  8    sleep 1

  9    pwd

 10 

  每隔一秒依次执行命令

  结果:

shell脚本知识


   还有一个 .表示当前路径,由当前的bash解释命令。

2.shell变量可以分为环境变量本地变量

 环境变量可以从父进程传给子进程,本地变量只存在于当前shell进程。

 printenv显示环境变量,set设置本地变量和环境变量,环境变量是任何进程都有的,而本地变量是shell特有的。

3.eval

 eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时被称为复杂变量。不过这些变量本身并不复杂。e v a l命令也可以用于回显简单变量,不一定是复杂变量

例子:

1>显示test.sh内容

shell脚本知识

从结果看出使用eval命令不但可以置换该变量,还能够执行相应的命令。第一次扫描进行了file变量置换,第二次扫描执行了该字符串中所包含的命令cat test.sh。

2>还可以用来显示出传递给脚本的最后一个参数

  在test.sh 脚本中写入 eval echo  \$$#, 运行test.sh。结果如下:

  shell脚本知识

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,结果如下:

shell脚本知识

4>用eval命令创建指向变量的“指针"

shell脚本知识

4.  ``与$()的区别和联系

举一个例子:

 1. 1 #!/bin/bash

  2 

  3 echo `echo \$HOSTNAME`

  4 echo $(echo \$HOSTNAME)

我们可以使用sh -x test.sh来分析bash是如何来解释这个脚本的,返回的信息如下:

shell脚本知识

1>反引号中\$并没有将$的特殊意义转换 反引号包含的内容 echo \$hostname 仍然被解释

为一个echo $HOSTNAME 取到了这个变量的值并输出所以反引号返回的值为 localhost

 2>$()则正好相反,$明显被\转义成了一个普通字符,所以并没有取到变量值,而是返回了


字符串本身的意思,故而返回了$HOSTNAME。


    这说明反引号对反斜杠(\)有特殊的转化,至少我们看到当我们直接用1个\时,它本身

并不会起到转义的作用。

 2.再给程序中多加一个\,运行结果:

shell脚本知识

这次结果与上次运行结果差不多正好相反。

反引号反而输出了$HOSTNAME的字面意思


$()如我们所愿的取到了变量值,并理所应当的输出了一个被转义的字符串\


3.若将代码改为

 echo `echo \\\\`

echo $(echo \\\\)

运行结果:

shell脚本知识


4.若将代码改为

 echo `echo \\\\\\\\`

echo $(echo \\\\\\\\)

运行结果:


shell脚本知识

由以上测试得出结论:

    反引号其本身就对\进行了转义,保留了其本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。

所以我们可以简单的想象成反引号中: \\ = \

  1. $()中则不需要考虑\的问题,与我们平常使用的一样:\ = \

不过一般情况下使用$()。

5.crond定时任务

crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而linux任务调度的工作主要分为以下两类:

1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存

2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置