execv shell_shell脚本学习

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分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值