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脚本的时候如果能够用的好 ...
随机推荐
- FFT算法的完整DSP实现
傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's Guide to Digita ...
- rocketmq持久化方式
推荐看下RocketMQ,使用文件做持久化, 并支持分布式事务(虽然可能造成较多的写脏), 异步刷盘,内存预分配, 高可用采用了同步双写及异步复制的方式, 通信是用netty做的,基本上所有耗时的操作 ...
- 使用moment.js管理时间
如果在nodejs下 npm install moment 引用模块: var moment = require('moment'); 用法: 当前时间:2015-11-07 18:00:51 mom ...
- ocx控件打印之基础篇
Visual C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实 ...
- JavaMail入门:创建纯文本、HTML格式的邮件
转自:http://haolloyin.blog.51cto.com/1177454/353849/ 在 http://java.sun.com/products/javamail/ 下载了 Java ...
- unity 实时间接光照 解决方案
https://www.youtube.com/watch?v=D7LjsabD4V4 这个很强 他runtime bake lightprobe 之后走assetbundle加载 Place Pro ...
- ES集群Master节点配置问题
ES集群的主节点发现机制采用单播形式,主要配置有三行,如下: discovery.zen.minimum_master_nodes: discovery.zen.ping.multicast.enab ...
- XP如何找到网上邻居
右击桌面,点击属性,切换到桌面,自定义桌面,勾选网上邻居即可.
- Git库搭建好之后,当要提交一个新的文件,需要做的是3个步骤
Git库搭建好之后,当要提交一个新的文件,需要做的是3个步骤 1.git add new.txt 2.git commit -m "add a new file" 3.git pu ...
- poj 1274 The Perfact Stall
click here ~~ ***The Perfect Stall*** Description Farmer John completed his new barn just last week, ...