shell脚本

shell脚本()单括号和“反引号的区别

注意:编写shell脚本时,定义变量时不加$,使用时要加$,用以区别字符串。

首先,我们来看一个例子

#!/bin/bash
a=1
b=2
c=`date "+%Y-%m-%d"`
echo $c
c=$(date "+%Y-%m-%d")                                                       
echo $c

反引号这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。如例程中的date "+%Y-%m-%d"就是把这条命令的结果赋给变量C。

反引号是一个老的用法, ()c= (date “+%Y-%m-%d”) 。无论是在学习中,还是在实际工作中,$()都是被推荐的用法。

eval命令

eval可以读取一连串的参数,然后按照参数特性来执行。参数数目不限,彼此之间用分号隔开。

eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令;如果命令中含有变量的间接引用,则保证间接引用的语义。也就是说,eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。因此,eval命令适用于那些一次扫描无法实现其功能的变量。

eval 执行以下两个步骤:
第一步,执行变量替换,类似与C语言的宏替代;
第二步,执行替换后的命令串。
下面来看几个例子:
1.执行含有带字符串的命令
我们可以新建一个脚本文件test.sh将程序”按照”1+2+3+4+….+100“的形式输出结果”写入文件中,把cat test.sh赋值给变量NUM,如果我们echo $NUM并不能的到test中的内容;然而eval $NUM则能显示文件中的内容,因为eval命令对后面的命令进行了两次扫描,第一次将NUM替换为 cat test.sh,第二次执行cat test.sh。

shell脚本_第1张图片

这些需要进行两次扫描的变量有时被称为复杂变量。不过这些变量本身并不复杂。eval命令不仅可以回显复杂变量,也可以用于回显简单变量。

2. 回显简单变量

shell脚本_第2张图片

3.eval命令还可以获取传给shell的最后一个参数
如果我们知道参数个数,我们想要查看最后一个参数的内容可以使用echo直接显示,如输入one two两个参数我们可以用(echo $ 2)来查看最后一个参数;
但是,如果我们不知道参数个数还想查看最后一个参数内容怎么办,使用$$#为传给shell脚本的参数个数,但是上例中 “echo \ $$#”后显示的其实是参数个数,而使用”eval echo \$$#”才显示最后一个参数的内容。

这里写图片描述

这里写图片描述

4.条件筛选
在file文件中写入两列数据,第一列对应KEY 、第二列为VALUE,使用eval命令将KEY与VALUE的值对应起来,从文件中读取

shell脚本_第3张图片

注意:
1、eval 不能获得函数处理结果。
2、eval 嵌套无意义,在其他语言中可以通过 eval(eval(“code”)) ,来执行(执行动态生成的 code 的返回),而由于shell 中 eval 将后面的 eval 命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代。

截取字符串

假设有变量 var=http://www.aaa.com/123.htm
1. # 号截取,删除左边字符,保留右边字符

echo ${var#*//}

echo ${var#*//}
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符。

即删除 http://
结果是 :www.aaa.com/123.htm

2. ## 号截取,删除左边字符,保留右边字符

echo ${var##*/}

echo ${var##*/}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符。

即删除 http://www.aaa.com/
结果是 123.htm

3. %号截取,删除右边字符,保留左边字符

echo ${var%/*}

echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com

4. %% 号截取,删除右边字符,保留左边字符

echo ${var%%/*}

echo ${var%%/*}
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:

5. 从左边第几个字符开始,及字符的个数

echo ${var:0:5}

echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:

6. 从左边第几个字符开始,一直到结束

echo ${var:7}

echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm

7. 从右边第几个字符开始,及字符的个数

echo ${var:0-7:3}

echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123
8. 从右边第几个字符开始,一直到结束

echo ${var:0-7}

echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

你可能感兴趣的:(Linux知识库,linux程序,shell,脚本)