Bash作为一个编程语言,有很多奇怪的表达字符,有时候会让人感到很费解,其实,只要我们弄清楚bash面临的问题

就能够理解为啥要这么搞了,举个例子:

1、比较字符串"ab"和"bc"的大小:

#错误,a的ascii码比b小,这里应该为假,但却显示为真
[root@noi ~]# ls
alias.set a.out default.pass t t.c t.cpp t.sh wai.bat
[root@noi ~]# [ 'ab' > 'bc' ];echo $? [root@noi ~]# ls
#这里多了一个bc的文件
alias.set a.out bc default.pass t t.c t.cpp t.sh wai.bat
#错误的原因是>号被shell提前执行了,而不是作为参数传递给[,因为>在shell里是有意义的。>作为输出操作符,将test 'ab'的结果输出到文件bc中,这就是为啥多了一个bc的文件。

如果想要正确的执行比较运算,不可能修改test,因为test是一个独立的小程序,也不可能改变>在shell里面的用途,因为输出操作符,我们也常用。

最后,还是转义字符(\)粉墨登场来救急了,将>前面加上转义字符\,这样告诉shell,把它当作一个普通字符,就能够顺利的传递到test命令里面了。

#看,得到正确的答案了吧
[root@noi ~]# [ 'ab' \> 'bc' ];echo $?

通过以上例子了解到,Shell面临的是一个复杂的环境,每个小程序之间都是独立的,作为粘合剂的它是相当的难做啊!这就是为啥它的语法看起来有点

丑陋了吧,浑身都是坑,能不难看吗?但是,话又说回来了,它确实做到了。虽然哥浑身都是坑,但是,大坑我都填上了,剩下的小坑也可以找到办法

绕过去,你们还是好自为之,多多学习吧,呵呵。

最后,在写一个例子:

假如你要再判断某个目录是否存在,又想当然写成:

[root@noi ~]# [ -f exists.txt && -d exists_folder ]; echo $?
-bash: [: missing `]'

结果提示漏了右括号,那是因为 && 被 bash 预先解析了,而不是当成 test 的参数传递。

  • && 表示如果左边的命令正常执行了,那么继续执行右边的命令,相当于没有 else 部分的 if 语句简化版。

  • 而 || 表示如果左边的命令不是正常执行了,那么继续执行右边的命令,相当于没有 then 部分的 if 语句(或者 if not)。

从效果看也可以分别当成逻辑与和逻辑或的。

所以上面那条命令以 [ -f exists.txt 明显是个不完整命令,漏了个 [

修正如下:

[root@noi ~]# ls
alias.set default.pass exists.txt t.c t.sh
a.out exists_folder t t.cpp wai.bat
[root@noi ~]# [ -f exists.txt ] && [ -d exists_folder ]; echo $?

换成test的写法也可这样写:

[root@noi ~]# test -f exists.txt && test -d exists_folder; echo $?

Bash编程的难点的更多相关文章

  1. bash编程之多分支if 语句及for循环

    第十七章.bash编程之多分支if 语句及for循环 if语句三种格式 多分支if语句练习 for循环 17.1.if语句的三种格式 单分支if语句 if condition;then 条件为真执行的 ...

  2. bash编程总结

    bash应该是目前Linux上最流行的shell脚本解释程序了(还有个shell叫dash,我太讨厌这个东东了.),只要你在linux上工作,并且希望自己能够工作得更愉悦,那么你应该熟悉最基本的bas ...

  3. Linux中bash编程

    bash编程也叫shell编程 预定义变量         $? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确的执行:如果这个变量返回的值非0(具体是那个数,有命令自己来决定 ...

  4. bash编程基础

    bash变量 变量命名: 1.不能使用程序中的关键字(保留字) 2.只能使用数字.字母和下划线,且不能以数字开头 3.要见名知义 变量类型: 数值型:精确数值(整数),近似数值(浮点型) 字符型:ch ...

  5. bash编程之循环控制:

    bash编程之循环控制: for varName in LIST; do 循环体 done   while CONDITION; do 循环体 done   until CONDITION; do 循 ...

  6. [shell] Bash编程总结

    由于工作需要,之前的几个月写了一些Bash脚本,主要完成自动测试.打包.安装包等.虽然相比C++编程,要简单.傻瓜,但其在类Unix系统中可以大大提高工作的效率.所以在此对脚本编程过程中一些注意事项进 ...

  7. bash编程的信号捕获:

    bash编程的信号捕获: kill -l KILL无法捕捉:   trap 'COMMAND' SIGNAL,    信号捕捉用于:在中途中止时做一些清理操作.   一. trap捕捉到信号之后,可以 ...

  8. 怎样用 Bash 编程:逻辑操作符和 shell 扩展

    学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...

  9. 怎样用 Bash 编程:语法和工具

    让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇. Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的.每当用户或者系统管理员 ...

随机推荐

  1. JS操作小数运算,结果莫名其妙出现多位小数问题

    Number类型: Number类型是ECMAScript中最常用和最令人关注的类型了:这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被成为双精度数值),为支持各种数据类型 ...

  2. java中关于volatile的理解疑问?

    作者:xyzZ链接:https://www.zhihu.com/question/49656589/answer/117826278来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  3. JavaScript -- 清除缓存

    在客户端有一个HTML文件,用来提交输入信息,问题在于:每次按刷新时,发觉并不是整个页面重新被装载,好似是缓存中. 因为文本框中仍出现上次输入的值,只有在地址栏中按回车整个页面才重新装载,应当怎样避免 ...

  4. jquery ajax 中不能给变量赋值的原因及解决办法

    我们在用JQuery的Ajax从后台提取数据后想把它赋值给全局变量,但是却怎么都赋不进,为什么呢? 原因其实很简单,我们用的Ajax是异步操作,也就是说在你赋值的时候数据还没提取出来,你当然赋不进去, ...

  5. Linux下inotify的基本使用及注意事项

    最近在写一个云备份的项目,其中有一个模块是要监控计算机本地的文件,于是我翻了翻linux/unix系统编程手册发现了inotify这个用于文件监控的框架 1.概述 1)inotify机制可用于监控文件 ...

  6. phpcms v9 wap手机门户站点内容页添加上一篇、下一篇的方法

    PHP源码修改:打开 phpcms\modules\wap\index.php 文件找到if(!$r || $r['status'] != 99) showmessage(L('info_does_n ...

  7. Spring框架学习(3)spring中使用jdbc

    内容源自:spring中使用jdbc spring dao层中对jdbc进行了封装,使用模板模式的设计模式,通过ioc被动注入的方式将jdbcTemplate这个模板类注入到数据对象中,进行数据库操作 ...

  8. [Android Pro] 查看 keystore文件的签名信息 和 检查apk文件中的签名信息

    1: 查看 keystore文件的签名信息 keytool -list -v -keystore keystoreName -storepass keystorePassword 2: 检查apk文件 ...

  9. 图解aclocal、autoconf、automake、autoheader、configure

    http://www.laruence.com/2008/11/11/606.html 本文地址: http://www.laruence.com/2008/11/11/606.html 转载文章 原 ...

  10. CardLayout使用

    相对于BoxLayout,GridBugLayut等常用的Swing layout,CardLayout是特殊的,前者是一个容器内布置组件,而后者是在一个容器内放置很多页面(但一个时间只用显示一个). ...