Bash编程的难点
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编程的难点的更多相关文章
- bash编程之多分支if 语句及for循环
第十七章.bash编程之多分支if 语句及for循环 if语句三种格式 多分支if语句练习 for循环 17.1.if语句的三种格式 单分支if语句 if condition;then 条件为真执行的 ...
- bash编程总结
bash应该是目前Linux上最流行的shell脚本解释程序了(还有个shell叫dash,我太讨厌这个东东了.),只要你在linux上工作,并且希望自己能够工作得更愉悦,那么你应该熟悉最基本的bas ...
- Linux中bash编程
bash编程也叫shell编程 预定义变量 $? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确的执行:如果这个变量返回的值非0(具体是那个数,有命令自己来决定 ...
- bash编程基础
bash变量 变量命名: 1.不能使用程序中的关键字(保留字) 2.只能使用数字.字母和下划线,且不能以数字开头 3.要见名知义 变量类型: 数值型:精确数值(整数),近似数值(浮点型) 字符型:ch ...
- bash编程之循环控制:
bash编程之循环控制: for varName in LIST; do 循环体 done while CONDITION; do 循环体 done until CONDITION; do 循 ...
- [shell] Bash编程总结
由于工作需要,之前的几个月写了一些Bash脚本,主要完成自动测试.打包.安装包等.虽然相比C++编程,要简单.傻瓜,但其在类Unix系统中可以大大提高工作的效率.所以在此对脚本编程过程中一些注意事项进 ...
- bash编程的信号捕获:
bash编程的信号捕获: kill -l KILL无法捕捉: trap 'COMMAND' SIGNAL, 信号捕捉用于:在中途中止时做一些清理操作. 一. trap捕捉到信号之后,可以 ...
- 怎样用 Bash 编程:逻辑操作符和 shell 扩展
学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...
- 怎样用 Bash 编程:语法和工具
让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇. Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的.每当用户或者系统管理员 ...
随机推荐
- HDU 4665 Unshuffle (2013多校6 1011 )
Unshuffle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- .net 程式進階除錯教學 - 使用WinDbg
https://caryhsu.blogspot.com/2011/11/net-windbg.html 從以前一直研究基金方面的資訊,但由於沒有多於的時間常常觀看,再加上碩士時在我 ...
- [EF]使用EF简单增删改查
目录 认识EF 添加数据 删除数据 修改数据 查询数据 总结 认识EF ADO.NET Entity Framework 是微软以ADO.NET为基础所发展出来的对象关系对伊(O/R Mapping) ...
- css/js(工作中遇到的问题)-5
后端换行符处理 问题描述 // Windows new line support (CR+LF, \r\n) str = str.replace(/\r\n/g, "\n"); 遍 ...
- html之marquee会移动的文字
该标签不是HTML3.2的一部分,并且只支持MSIE3以后内核,所以如果你使用非IE内核浏览器(如:Netscape)可能无法看到下面一些很有意思的效果 该标签是个容器标签 语法: <marqu ...
- CKFinder的_thumbs缓存文件夹
<CKFinder2.0.2的使用与破解> 作者: 宓晨 说下背景,发下牢骚! 由于网站需要支持对图片的上传以及操作的管理,还有文字+图片的组合上传.问了一下同 ...
- iOS:quartz2D绘图(画一些简单的图形,如直线、三角形、圆、矩形、文字等)
前一篇几乎已经详细介绍了Quartz2D的所有知识,这一篇以及后面就不废话了,主要是用具体的实例来演示绘图效果. 这里我们先来绘制一些简单的图形(如直线.三角形.圆.矩形.文字.图像),它有两种方式可 ...
- URLScan参数说明
本文分步说明如何配置 URLScan 工具以防止 Web 服务器受到攻击和利用. 修改 URLScan.ini 文件 URLScan 的所有配置都是通过 URLScan.ini 文件执行的,此文件位于 ...
- powerdesigner里建物理模型图时choose DBMS为空怎么办?
RT 出现如下对话框,是因为需要“DBMS”的规则文件夹 点击下图文件图标,浏览,找到安装目录里面PowerDesigner 15\Resource Files\DBMS,就可以了. 在此记录一下,希 ...
- Style对象之一
<html> <style type="text/css"> body{ background-color="#FFCC80"; bac ...