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脚本的时候如果能够用的好 ...
随机推荐
- c/c++代码的unit-test中覆盖率的统计
gcov lcov genhtml工具 gcov伴随gcc 发布.gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信 ...
- linux之rootfs (UBIFS)
转:http://www.360doc.com/content/11/1208/15/3700464_170655736.shtml 大大小小事情一堆,好久不更新了,这次记录下移植ubifs文件系统步 ...
- appium+python自动化46-安装app三种方式
前言 adb安装 1.在app自动化之前,首先手机上有要被测试的app,如何把电脑本地上的app安装到手机上呢?可以在运行自动化代码前,在cmd输入adb指令,把电脑app安装到手机上 adb ins ...
- 给ul下的li加click时间
$('.province ul li').click(function() {//方法 });
- Mybatis数据库操作的返回值
mybatis配置 <!-- 配置mybatis --> <bean id="sqlSessionFactory" class="org.mybatis ...
- codeforces#277.5 C. Given Length and Sum of Digits
C. Given Length and Sum of Digits... time limit per test 1 second memory limit per test 256 megabyte ...
- js调用高德地图的搜索api
var city = $('#city')[0].value; AMap.plugin(['AMap.Autocomplete'],function(){ var autoOptions = { ci ...
- 从项目上一个子查询扩展学习开来:mysql的查询、子查询及连接查询
上面这样的数据,想要的结果是:如果matchResult为2的话,代表是黑名单.同一个softId,version,pcInfoId的代表是同一个软件,需要去重:同时,如果相同软件里面只要有一个mat ...
- centos6.8服务器配置之SVN配置
version 1.6.11 一.安装:因对版本要求不高,所以采用yum安装 yum install -y svn 二.配置 1.创建仓库,以后所有代码都放在这个下面,创建成功后在svn下面多了几个文 ...
- Sense编辑器(Sense Editor)
Sense编辑器(Sense Editor) 学习了:https://blog.csdn.net/AbnerGong/article/details/50776605 Sense是一个方便的控制台,用 ...