Shell 快速入门(十八):特殊符号的使用
在 Shell 语言中,经常会看到中括号和括号组成的特殊标识,例如:[]
、[[]]
、(())
、$(())
、()
。这些符号经常使我们非常迷惑,弄清楚它们之间的作用和区别非常必要。
在开始之前,我们先来学习一个 test 命令。
test命令
test 命令主要是用来做表达式的判断,其语法结构如下:
1 |
test {EXPRESSION} |
例如:
1 |
if test "a" == "a" |
[]
其实 [] 符号的作用与 test 命令一样,都用于判断表达式的真假。只不过 [] 将表达式括起来了,更加易读。上面的例子用 [] 重写就会变成这样:
1 |
if [ "a" == "a" ] |
让我们来看一个更加复杂点的例子:
1 |
a=12 |
[[]]
[[]]
符号与 []
符号的区别是,在 [[]]
符号里,我们引用变量时可以不再用 $ 符号了,而且还可以使用 && 和 || 运算符。
像上面判断变量 a 的范围,我们在 []
符号中,只能使用 -gt
、-a
、-lt
等操作符。但如果用[[]]
实现,我们就可以用上&&
和||
操作符:
1 |
a=12 |
但你会发现我们做算术比较还需要写-lt
、-gt
之类的东西,非常恶心。那么我们可以用下面这个符号。
let 命令
我们在进行算术运算时,我们可以使用 let 命令进行运算:
1 |
a=10 |
在 let 命令中的变量,不需要使用 $ 符号就可以使用。像上面的 a 变量,其实一个变量,但是在第 2 行的 let 语句不需要使用 $ 符号也能成功运算。
(())
这组符号的作用与 let 命令相似,用在算数运算上,是 bash 的内建功能。所以,在执行效率上会比使用 let命令要好许多。
在这个符号里,我们可以进行整数运算,它的作用和 let 命令一样。
1 |
a=10 |
或者我们可以将计算结果作为表达式,如果结果是 0 表示假,其余全部是真。
1 |
a=10 |
又或者是:
1 |
a=10 |
$(())
这玩意和上面的差不多,但是不会像命令一样有返回值,而是会像变量一样把运算结果替换出来。例如:
1 |
a=10 |
输出:1
。
1 |
a=10 |
输出:0
。
因此如果要让它作为一个表达式的话,就要结合 []
符号。例如:
1 |
a=10 |
对于 (())
符号而言只有 bash 这个 Shell 有,而 $(())
则是所有 Shell 都有,更为通用。
()
()
符号表示括号中作为一个子 Shell 运行,运行结果不干扰外层的 Shell。
看看下面这个例子:
1 |
a=2 |
输出是:2
。
因为括号括起来是一个子 Shell,不影响外层 Shell 的运行,所以对 a 赋值为 1 不影响外层结果,外层的 a 变量还是 2。
利用上面子 Shell 这个特性,我们在写 Shell 脚本的时候可以做到不切换当前目录而在其他目录干点事儿。例如:
1 |
(cd hello; echo "Hello Shell" > hello.txt); pwd; cat hello/hello.txt |
上面我进入了子目录 hello,并创建了一个 hello.txt 文档。输出结果是:
1 |
/Users/yurongchan/Yosemite/shell-practice/practice |
可以看到我当前目录没有改变,但是文档已经创建成功了。
{ } 大括号 (Block of code)
这种用法与上面介绍的命令群组非常相似,但有个不同点,它在当前的 shell 执行,不会产生 subshell。 单纯只使用大括号时,作用就像是个没有指定名称的函数一般。
1 |
a=2 |
上面输出:1
。
这个用法和 ()
用法的区别有两个:
- 大括号
{}
里的运算是在当前 Shell 运行,会影响外层结果,而括号()
的不会。 - 大括号里最后一个语句必须要用
;
分号结束,否则出错,而括号()
的并没有这个要求。
Shell 快速入门(十八):特殊符号的使用的更多相关文章
- Linux Bash Shell 快速入门
BASH 的基本语法 最简单的例子 —— Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1 ...
- Linux Bash Shell快速入门 (三)
forfor 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是: for $var in dostatmentsdone 其中 $var 是循环控制变量, 是 $var 需要 ...
- shell 快速入门
1: 脚本开始行 #!/bin/bash 这一行表明,不管用户选择的是那种交互式shell,该脚本需要使用bash shell来运行. 由于每种shell的语法大不相同,所以这句非常重要. 2:变量 ...
- Shell的常用十八条命令
Shell的18条常用命令整理 1. ls: 类似于dos下的dir命令 ls最常用的参数有三个: -a -l -F. ls –a Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看 ...
- shell快速入门
$? 表示上一个命令退出的状态,0表示执行正常,不等于0表示执行不正常. $$ 表示当前进程编号 $ 表示当前脚本名称 $# 表示参数的个数,常用于循环 $*和$@ 都表示参数列表 $n 表示n位置的 ...
- Linux Bash Shell快速入门 (二)
BASH 中的变量介绍BASH 中的变量都是不能含有保留字,不能含有 "-" 等保留字符,也不能含有空格. 简单变量在 BASH 中变量定义是不需要的,没有 "int i ...
- Linux Bash Shell快速入门(一)
BASH 的基本语法· 最简单的例子 —— Hello World! · 关于输入.输出和错误输出 · BASH 中对变量的规定(与 C 语言的异同) · BASH 中的基本流程控制语法 · 函数的使 ...
- [译]Kinect for Windows SDK开发入门(十八):Kinect Interaction交互控件
本文译自 http://dotneteers.net/blogs/vbandi/archive/2013/03/25/kinect-interactions-with-wpf-part-i-getti ...
- 1.shell快速入门
shell是什么?shell是一个命令行解释器,它提供了一个像linux内核发送请求以便运行程序的界面系统程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序.说白了,shell就是用来和内 ...
随机推荐
- (综合)P2089 烤鸡
题解: 错误的: #include<stdio.h>int n,ret=0,a[10000][10];int p(int c,int s){ int i; for(i=1;i<=3; ...
- JavaScript—面向对象小例子
什么是面向对象 要是以前别人问我.随口道来,封装继承多态,万物皆对象...一大推.说的自己都以为自己掌握了面向对象.呵呵一笑.确实掌握了 只是不会用..... 什么是面向对象编程 以前 学.Net 虽 ...
- mysql字符集配置&mysql中文乱码
问题描述 这两天重置了下自己的电脑系统,一个ubuntu,另外一个当然就是windows. 不过在运行程序的时候发现,出现了很多的"????",也就是乱码字符.毫无疑问,这定然是m ...
- java查看简单GC日志
测试代码: public class GCtest { public static void main(String[] args) { for (int i = 0; i < 10000; i ...
- 干货 | 调用AI api 实现网页文字朗读
京东云上提供了足够多的人工智能api,并且都使用了http的方式进行了封装,用户可以方便在自己的系统中接入京东云的ai能力.今天就是介绍一下如何编写很少的代码就能使用京东云的语音合成api在网页中实现 ...
- 01 语言基础+高级:1-5 常用API第二部分_day01.【Object类、常用API: Date类、System类、StringBuilder类】
day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 java.lang.O ...
- tif图片压缩
tif图片在ImageIo.read获取时,返回为空,导致无法使用,百度了很久,很多人说jai可以,便去看了下,总结如下: public static void CompressPic(String ...
- goweb-go语言基础
go语言基础 虽然这本书是讲goweb,但还是吧go语言基础过了一遍,由于我之前已经对go语言基础做了一遍系统的学习,这里就当简单回顾一下,不再写过多笔记了,之前的写的博客都有基础知识,O(∩_∩)O ...
- 嵌入式c语言编码规范
学习嵌入式的同学应该首先掌握嵌入式编码规范,这样才能更好的嵌入式系统. 下面就从这几个方面讲解一下嵌入式c编码规范. 注释风格.排版风格.头文件风格.变量定义.宏定义.函数 1 注释风格 1.1 注 ...
- Ubuntu18.04 离线安装 docker
Ubuntu18.04 离线安装 dockerhttps://blog.csdn.net/u012814856/article/details/804231851. 将下载下来的文件夹中的 4 个文件 ...