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脚本的时候如果能够用的好 ...
随机推荐
- Linux PHP 编译参数详解(一)
Fast-CGI: ./configure --prefix=/usr/local/php --enable-fastcgi --enable-force-cgi-redirect --with-co ...
- 怎样打开查看mysql binlog
1 在my.ini(window)配置文件里面 [mysqld]log-bin=mysql-bin(名字可以随便起) 我们每次进行操作的时候,File_size都会增长 2.show binlog e ...
- Android从开源到碎片化 开发者叛离的真相
Android从诞生开始就受到热捧,并日益普及.它有别于以往的手机及移动终端操作系统,其独具的开源性.系统廉价性和提供给第三方大自由度的创新空间,以及不受硬件约束的优势,获得了广大开放社群的支持.但是 ...
- Spring WebSocket入门(一) 转载
本文转载自:http://www.jianshu.com/p/60799f1356c5 WebSocket是html5带来的一项重大的特性,使得浏览器与服务端之间真正长连接交互成为了可能,这篇文章会带 ...
- PostgreSQL配置文件--实时统计
7 实时统计 RUNTIME STATISTICS 7.1 Query/Index Statistics Collector 下面的参数控制是否搜集特定的数据库运行统计数据 7.1.1 track_a ...
- 16.同步类容器Collections.synchronized
voctor动态数组.同步类容器,底层实现基于:Collections.synchronized package demo5; import java.util.ArrayList; import j ...
- ylbtech-LanguageSamples-PythonSample
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-PythonSample 1.A,示例(Sample) 返回顶部 本示例演示如何使用 C ...
- [ToDo]Thrift学习
这里有较详细的Java项目配置过程: http://bglmmz.iteye.com/blog/2058785 下面有Java项目的示例介绍: http://www.tuicool.com/artic ...
- 字符编码,pyton中的encode,decode,unicode()
1.在计算机处理的程序中,对字符的处理有两种方式:编码或译码(encoding),解码(decoding) encoding:将字符串中的字符转换到对应编码字符集对应的代码点 ...
- SVN-项目 XXX 受源代码管理。向源代码管理注册此项目时出错。建议不要对此项目进行任何修改
错误描述: 项目 XXX 受源代码管理.向源代码管理注册此项目时出错.建议不要对此项目进行任何修改 解决办法: 使用记事本打开,项目csproj文件删除图中几行,重新打开解决方案就可以了 原因分析: ...