shell ---- ` ,$(),[[...]],[...],eval的用法

一、反引号【 `` 】和 $() 的区别与联系

‘$‘(参数替换)和‘`‘(命令替换)

反引号【 `` 】和 $() 的用法是一样的。在执行一条命令时,会先将其中的 ``,或者是$() 中的语句当作命令执行一遍,再将结果加入到原命令中重新执行

例如:
    echo `ls`     #会先执行 ls 得到xx.sh等,再替换原命令为:
    echo xx.sh
    最后执行结果为:             xx.sh
    平时我们遇到的把一堆命令的执行结果输出到一个变量中,需要用这个命令替换符括起来,但是根据POSIX规范,要求系统工程师采用的是 $(命令)的形式。所以,我们最好还是遵循这个规范,少用``,多用$()。

二、[[...]] 与 [...] 的区别与联系

1、[...]

1) 单中括号 " [ "是一个可执行程序,路径是"/usr/bin/[",是bash的内部命令。它与可执行程序"test"是等价的。

如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。

2)  Test和[]中可用的比较运算符只有 == 和 != ,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。

3)  字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。

4)  在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。

2、[ [... ...] ]

1)   双中括号  " [[ "是脚本解释程序(bash,sh等)的关键字,并不是一个命令。[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换

2)  支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

3)  使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。

4)   bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

三、eval 的使用用法

如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval。命令行结束符(; |&),I/o重定向符(< >)和引号就属于对shell具有特殊意义的符号,必须直接出现在命令行中。

1. eval command-line

eval主要用在对参数的特殊处理上面的,一般的命令行,shell处理参数就只执行一遍,像转义和变量转变;但加上eval后就可以对参数经行两遍处理。一个eval只能使shell对参数多一次处理,因此有几个eval就可以多加几次,即eval eval command-line 这样就能对参数进行三次编译,但此时应特别注意参数的转义,下面有例子说明。

eval最常见的用法是将动态生成的命令行计算并执行。 eval命令会计算(evalue)它的参数,这些参数作为表达式计算后重新组合为一个字符串,然后作为一个命令被执行。

pipe="|"
eval ls $pipe wc -l

shell第1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了。

2. eval echo \$$# 取得最后一个参数

(1)

第一遍扫描后,shell把反斜杠去掉了。当shell再次扫描该行时,它替换了$4的值,并执行echo命令。

(2)对三重的支持

注意 这里的参数转义,第一遍处理后参数应该是:\$$aabbcc,第二次是:$alibaba,第三次就正好是:hello world。

3.eval命令创建指向变量的“指针”:

x=100
ptrx=x
eval echo \$$ptrx            #指向ptrx
100             #打印100
eval $ptrx=50        # 将50存到ptrx指向的变量中。
echo $x
50         #打印50

时间: 2024-10-05 18:18:12

shell ---- ` ,$(),[[...]],[...],eval的用法的相关文章

eval()函数用法详解

eval()函数用法详解:此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eval()函数的用法.语法结构: eval(str) 此函数可以接受一个字符串str作为参数,并把此str当做一段javascript代码去执行,如果str执行结果是一个值则返回此值,否则返回undefined.如果参数不是一个字符串,则直接返回该参数,实例如下: eval("var a=1");//声明一个变量a并赋值1. eval("2+3");//执行加运

Shell中eval的用法示例

功能说明:告知shell取出eval的参数,重新运算求出参数的内容. 语 法:eval [参数]补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行. 参 数:参数不限数目,彼此之间用分号分开.1.执行命令行之前扫描它两次,再次运算求出参数的内容. 复制代码 代码如下: [[email protected] blue]# a="ls |more" [[email protected] blue]# $a                                   

Python eval的用法及注意事项

eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果.想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果. python中eval函数的用法十分的灵活,但也十分危险,安全性是其最大的缺点.本文从灵活性和危险性两方面介绍eval. 1.强大之处 举几个例子感受一下,字符串与list.tuple.dict的转化. a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]&

获取前一天时间及shell的${!3}和eval的用法

例子1: [[email protected] opt]# cat a.sh  #!/bin/bash source /opt/b.txt aa=${!1} echo $aa [[email protected] opt]# cat b.txt  abc=1 [[email protected] opt]# sh a.sh abc 1 例子2: [[email protected] opt]# cat a.sh  #!/bin/bash a=1 b=a echo ${b} echo ${!b}

linux命令eval的用法

1. eval command-line 其中command-line是在终端上键入的一条普通命令行.然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次.如: pipe="|" eval ls $pipe wc -l shell第1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了. 如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval.命令行结束符(: | &

javvscript中的eval()函数用法

<script  type="text/javascript" > //eval()求值函数:1.用来计算字符串例如:eval('1+3')      alert(eval("1+6"));//输出7    //2.用来将json字符串转换成json对象    var json ='{a:"hello",b:3}';    alert(eval("("+json+")"));//输出 [obje

php中eval函数用法介绍

黑客用得最多的一句了,可以解析php.很多木马文件都是这样做的, 上面是一个php大马文件, eval() 函数把字符串按照 PHP 代码来计算. 该字符串必须是合法的 PHP 代码,且必须以分号结尾. 如果没有在代码字符串中调用 return 语句,则返回 NULL.如果代码中存在解析错误,则 eval() 函数返回 false. 由于安全原因,不建议大家在开发中使用. 下面一句最简单的代码,风险超级高,我们有时会看到自己的网站有这么一句: eval($_POST[cmd]);#这个就是php

【转】eval()函数用法

eval 功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法: eval(source[, globals[, locals]]) -> value 参数: source:一个Python表达式或函数compile()返回的代码对象 globals:可选.必须是dictionary locals:可选.任意map对象 实例展示: 1 可以把list,tuple,dict和string相互转化. 2 ##########################################

十五、python沉淀之路--eval()的用法

一.eval函数 python eval() 函数的功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法:eval(source[, globals[, locals]]) -> value 参数: source:一个Python表达式或函数compile()返回的代码对象 globals:可选.必须是dictionary locals:可选.任意map对象 如果提供了globals参数,那么它必须是dictionary类型:如果提供了locals参数,那么它可以是任意的map对象.