eval命令.单中括号[]和双中括号[[]]

一.eval命令

语法:eval cmdLine

eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描后,cmdLine是个普通命令,则执行此命令;如果cmdLine中含有变量的间接引用,则保证间接引用的语义。

例如:

为了输出最后一个参数有如下程序:

其中echo $4是在知道总共有4个数的情况下,直接输出第4个;当不知道总共有多少个数的情况下尝试使用echo "\$$#"输出最后一个数,结果并没有达到想要的结果;而 eval echo "\$$#"在不知道总数的情况下就能找到最后一个数。



二.单中括号[]和双中括号[[]]

(1)单中括号[]

1.[]用于条件测试,是一个命令,]用于关闭条件判断,这个命令把它的参数作为比较表达式或者文件参数,并且根据比较的结果来返回一个退出状态码。如果为真则退出码为0,为假则退出码为1。

[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不能用于整数比较。整数比较只能使用-gt(大于).-lt(小于).-eq(等于).-ge(大于等于).-le(小于等于)来进行比较。

当比较字符串时,注意给比较运算符两边加上相同的字符,这样的话,当输入为空的时候也可以进行比较。同时,[和]与中间的表达式必须有空格,比较运算符与表达式也最好加上空格。程序如下:

执行结果:

2.[]可用作正则表达式的一部分,描述一个匹配的字符范围;

3.在一个array结构的上下文中,[]用来引用数组中每个元素的编号。

(2)双中括号[[]]

1.[[]]不是命令,是关键字。[[]]比[]结构更加通用,在[[和]]之间的所有字符都不会发生文件名扩展或是单词分割,但是会发生参数扩展或是命令替换。

2.使用[[]]条件判断结构,能够防止脚本中的许多逻辑错误。比如,&&,||,<和>操作符能够正常存在于[[]]条件判断结构中([[]]中不支持">="和"<="),如果出现在[]中会报错(在[]中想要进行与,或的判断的时候,需要用到-a(与)和-o(或)来进行连接)。

程序如下:

执行结果:

时间: 2024-10-04 16:33:18

eval命令.单中括号[]和双中括号[[]]的相关文章

shell if条件判断中:双中括号与单中括号的区别

电脑重装了系统,登录虚拟机的shell脚本需重写,在为编写的脚本命名时发现存在同名脚本,才想起来是连接公司服务器的登录脚本,不想写俩脚本,怕记混了,那就整合一下.代码如下: #!/bin/bash#zxl.sh 脚本名 if [ $1 == 1 ] then        ssh a.a.a.a else        ssh b.b.b.b fi so easy,运行脚本  ./zxl.sh  1  和  ./zxl.sh  2  成功登录了公司服务器和虚拟机.今天登录的时候,却出问题了. 我

shell条件判断中单个中括号和霜中括号有什么需要

1.单中括号 [] ①bash 的内部命令,[和test是等同的.如果我们不用绝对路径指明,通常我们用的都是bash自带的命令.if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的.这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码.if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样. ②Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt

shell解析命令行的过程以及eval命令

本文说明的是一条linux命令在执行时大致要经过哪些过程?以及这些过程的大致顺序. 1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e "some files:" ~/i* "\nThe date:$(date +%F)\n$name's age is $((a+4))" >/tmp/a.log 假设在执行该命令前,已赋值变量"name=longshuai"和"a=

shell如何解析命令行以及eval命令

1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e "some files:" ~/i* "\nThe date:$(date +%F)\n$name's age is $((a+4))" >/tmp/a.log 假设在执行该命令前,已赋值变量"name=longshuai"和"a=24",于是重定向到/tmp/a.log中的结果为: some files

Linux里的eval命令

这个命令之前没有用过,在网上查了一下资料,觉得人家写的很好,所以复制过来了. 标题:linux命令eval的用法 链接:http://blog.chinaunix.net/uid-21411227-id-1826706.html 标题:linux shell中的eval 链接:http://www.2cto.com/os/201311/255577.html 语法:eval cmdLine eval会对后面的cmdLine进行两遍扫描,如果在第一遍扫面后cmdLine是一个普通命令,则执行此命令

Shell下的命令代换与eval命令

在shell中,如果想获得一个命令的返回值,如果为整数,可以直接用$?获取其退出码. 但如果一条命令的返回值不是整数,怎么实现? 不得不提shell下的命令代换功能! 两种方式实现命令代换 假设我们某个变量需要获得当前时间,则可以这样实现: date=`date` echo $date 或者也可以这样 date=$(date) echo $date 这两种方式都可以实现命令代换的功能,那么他们有何不同? 两种命令代换方式的区别 1.$()看起来比较简洁,而``很容易与''进行混淆. 2.在多层替

转载 关于include尖括号和双引号的区别。

对于使用尖括号( < >),预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而对于使用双引号(“ ”),cpp在当前目录中搜寻头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找.在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径. 通常用 < >包含的是标准库的头文件,而用""包含的是用户自己定义的类库的头文件.&quo

DOS命令行中的双引号

在DOS命令窗口下,运行C:\Program Files\WinRAR\WinRAR.exe,提示如下错误: 因为C:\Program Files\WinRAR\WinRAR.exe中含有空格,它被分成了两个部分:C:\Program和Files\WinRAR\WinRAR.exe.DOS命令窗口会把C:\Program当做C:\Program.exe或C:\Program.bat,而把Files\WinRAR\WinRAR.exe当做命令行参数传递给C:\Program.exe或C:\Prog

shell中的eval命令

在shell的学习中,我们会遇到这两种符号:反引号(` `)和$(),那么它们之间有什么区别和联系呢? 我们都知道在bash中,反引号和$()都是用来做命令替换的,命令替换就是用来重组命令行,先完成引号里面的命令,然后将其结果替换出来,再重组成新的命令行.也就是在执行一条命令时,会现将其中的` `,或者是$()中的语句当做命令执行一遍,再将结果加入到原命令中重新执行,例如: 从上面我们可以看到,当我们echo反引号里面的ls命令时,和我们直接执行ls命令是一样的,也就正应里我们前面说的,也就是在