Bash中的括号(一)
初学Bash脚本编程,里面的各种括号,绝对是一个大坑,为了救人救己,以防再度入坑,特记录如下:
一、单小括号:
1、创建子Shell。单个小括号用来创建一个子shell,子shell允许你在不影响当前shell的环境下去执行操作。例如:
pwd
/root
(cd /tmp;pwd)
/tmp
又如,你在 home 目录,cd 到 /tmp 目录,sleep 5 秒,最后 cd 回 home,但是你会在 sleep 的过程中按 Ctrl + c 中断。命令如下:
~$ cd /tmp/; sleep ; cd ~
^C
/tmp$
你会留在 /tmp 目录中,因为最后的 cd ~ 根本没执行。所以如果你希望临时切换别的目录执行某些命令,但又希望中断后回到原来的目录,这个方法就不凑效了。
但是如果你加上小括号:
~$ ( cd /tmp/; sleep ; )
^C
~$
这里没有最后的 cd ~,因为多此一举,subshell 有自己的工作目录,相当于你另外开一个终端而已,这样避免一些环境变量被某些代码弄乱。
2、小括号还有命令替换的功能,result=$(command)与result=`command`有同样的效果。
var=$(pwd)
echo $var
/root
3、用于初始化数组。如: array=(a b c d)
二、单方括号:
1、[和test是等同的,均是shell的内置命令,使用type测试一下:
[root@noi ~]# type [
[ is a shell builtin
[root@noi ~]# type test
test is a shell builtin
2、Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
举个例子(坑了我好一阵子,才弄明白):
#3比1大,返回0表示真,正确
[root@noi ~]# [ \> ];echo $? #3比10小,返回0,错误,原因是[和test默认均是比较的字符串,而字符''比字符''(字符串“”的第一个字符)大,所以返回真。
[root@noi ~]# [ \> ];echo $?
上面的例子中 [ \> ] 实际上shell执行的是 [ '' \> '' ] 这样写就清楚多了,呵呵。
3、需要注意的是:[]中每个字符之间必须由空格隔开,否则shell就会报错。
4、如果真想比较数字,可以用:-gt(大于),-lt(小于),-ge(大于等于),-le(小于等于),-eq(等于),-ne(不能于)
[root@noi ~]# [ -gt ];echo $? [root@noi ~]# [ -gt ];echo $? [root@noi ~]# [ -lt ];echo $? [root@noi ~]# [ -gt ];echo $?
5、最后一个坑,在[和test测试中,用0表示真(助记0表示没有错误),用1表示假(助记1表示有错误),之所以要这样搞,和c程序反着,
就是因为,shell负责接收其他程序的返回值,而返回值正确(对应一种情况),返回值错误(各种各样的原因导致很多错误类型,需要用不同数值表示),
这样的话,用0(表真)和其他值(表假)可以完美解决这个问题。可以这样理解,除了返回0是正确的以外,返回其他值都是有问题的,呵呵。
以上是常规的用法,但是光这些还不够啊,所以需要用到其他的表达式写法,我先保存下,下篇接着写。
Bash中的括号(一)的更多相关文章
- Bash中的括号(三)
1.两个小括号用来对整数进行算术运算和逻辑运算,比如. 例如给变量赋值: $ a=+; echo $a + $ (( b = + )); echo $b 1+1 只是一个字符串,而 b 就是一个算术表 ...
- bash 中 小括号的作用
单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格. ...
- Bash中的括号(二)
双方括号[[]]的用法: 1.先举个例子说明: 假如你要再判断某个目录是否存在,又想当然写成: $ [ -f exists.txt && -d exists_folder ]; ech ...
- shell中各种括号的作用()、(())、[]、[[]]、{}
一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有 ...
- (转载)Bash 中的特殊字符大全
转自:https://linux.cn/article-5657-1.html Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是she ...
- Bash中的变量
Bash中的变量1.用户定义的变量变量的定义 用户定义的变量有字母数字及下划线组成,并且变量名的第一个字符不能为数字. 与其它UNIX名字一样,变量名是大小写敏感的. 对于变量 ...
- bash中(),{},(()),[],[[]]的区别
前言:在bash中遇到各种括号,同时在进行字符数值比较判定时,总是不断出现问题,于是通过参考<advanced bash-scripting guide>,同时在centos 6.7版本上 ...
- shell 中各种括号的作用()、(())、[]、[[]]、{}
一.小括号,圆括号 () 1.单小括号 () 命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...
- Bash 中的特殊字符大全【转】
Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好 ...
随机推荐
- Endnote在latex中的应用的两种方法
从endnote中向latex文档批量插入参考文献的两种方法 一.若是latex模板中参考文献编写的命令是: \begin{thebibliography} \bibitem{lab1}LIU M L ...
- mydate97的时间格式设置
<script type="text/javascript" src="./WdatePicker.js"></script> < ...
- [转]sa不能远程连接sql server 2008的解决办法
本文转自:http://www.cnblogs.com/chendaoyin/archive/2012/08/25/2656900.html 方法: 开始->Microsoft SQL Serv ...
- 完美解决“find: 路径必须在表达式之前:”
使用find命令查找文件的时候会有如题的提示,只需略作修改即可.两种方法: ①可cd到其它目录再查找(当前目录下存在要查找的目标文件时会出现此类错误,换到其它目录下再执行相同的命令即可): ②如果目标 ...
- QT5.11下载与安装教程
一.QT软件下载 Qt 5.9 之后的安装包与之前相比,不再区分 VS 版本和 MinGW 版本,而是全都整合到了一个安装包中.因此,与之前的安装包相比,体积也是大了不少,以前是 1G 多,现在是 2 ...
- .NET Fframework
.NET框架示意图: 该框架是微软推出的完全面向对象的软件开发与运行平台.其有两个主要 组将:CLR:公共语言运行库(Common Language Runtime,简称CLR)和.NET Frame ...
- unity 拿shadowmap/ sample shadow map/拿_ShadowMapTexture
https://gamedev.stackexchange.com/questions/96051/unity-5-how-to-get-a-shadowmap UNITY_DECLARE_SHADO ...
- Spark Streaming updateStateByKey和mapWithState源码解密
本篇从二个方面进行源码分析: 一.updateStateByKey解密 二.mapWithState解密 通过对Spark研究角度来研究jvm.分布式.图计算.架构设计.软件工程思想,可以学到很多东西 ...
- [置顶] (奇迹冬瓜)坦克大战[MFC框架]
经过二次整合 重新放出MFC框架下的坦克大战 采用小窗口 多线程 双缓冲 动画帧化 碰撞检测 接口封装 混音 事件延迟等 力求做到代码与美工的双向化 开场动画 界面一 界面二 游戏界面 结束动画 零积 ...
- 在 TDA 工具里看到 Java Thread State 的第一反应是
转载:http://itindex.net/detail/43158-tda-%E5%B7%A5%E5%85%B7-java 使用 TDA 工具,看到大量 Java Thread State 的第 ...