shell十三问之7:()与{}差在哪?

嗯,这次轻松一下,不讲太多... ^_^

先说一下,为何要用()或者{}好了。

许多时候,我们在shell操作上,需要在
一定的条件下执行多个命令,也就是说,
要么不执行,要么就全执行,而不是每次
依序的判断是否要执行下一个命令。

或者,要从一些命令执行的先后次序中得到结果,
如算术运算的2*(3+4)那样...

这时候,我们就可以引入"命令群组"(command group)
的概念:将许多命令集中处理。

在shell command line中,一般人或许不太计较()
{}这两对符号的差异,虽然两者都可以将多个命令当作群组处理,
但若从技术细节上,却是很不一样的:

  • ()command group置于sub-shell(子shell)中去执行,也称 nested sub-shell
  • {} 则是在同一个shell内完成,也称non-named command group

若你对上一章的fork与source的概念还记得的话,
那就不难理解两者的差异了。

要是在 command group中扯上变量及其他环境的修改,
我们可以根据不同的需求来使用(){}
通常而言, 若所作的修改是临时的,且不想影响原有或以后的设定,
那我们就使用nested sub-shell, 即();
反之,则用non-named command group, 即{}

是的,光从command line来看,(){}差别就讲完了,够轻松吧~~~, ^_^

然而,这两个meta用在其他command meta或领域中(如Regular Expression),
还是有很多差别的。
只是,我不打算再去说明了,留给读者慢慢发掘好了...

我这里只想补充一个概念,就是function
所谓function,就是用一个名字去命名一个command group,
然后再调用这个名字去执行command group

non-named command group来推断,
大概你也可以推测到我要说的是{}了吧?(yes! 你真聪明 ^_^)

在bash中,function的定义方式有两种:

  • 方式一:
    function function_name {
      command1
      command2
      command3
      .....
    }
  • 方式二:
    function_name () {
      command1
      command2
      command3
      ......
    }

用哪一种方式无所谓,
只是碰到所定义的名称与现有的命令或者别名冲突的话,
方式二或许会失败。
但方式二起码可以少打个function这一串英文字符,
对懒人来说(如我),有何乐而不为呢?...^_^

function 在一定程度上来说,也可以称为"函数",
但请不要与传统编程所使用的"函数"(library)搞混了,
毕竟两者差异很大。
唯一相同的是,我们都可以随时用"已定义的名称"来调用它们...

若我们在shell操作中,需要不断地重复某些命令,
我们首先想到的,或许是将命令写成shell脚本(shell script)。
不过,我们也可以写成function,
然后在command line中打上function_name就可当一般的shell script使用了。

若只是你在shell中定义的function,
除了用unset function_name取消外,
一旦你退出shell, function也跟着消失。
然而,在script中使用function却有许多好处,
除了提高整体script的执行性能外(因为已经载入),
还可以节省许多重复的代码......

简单而言,若你会将多个命令写成script以供调用的话,
那你可以将function看成script中script。... ^_^

而且通过上一章节介绍的source命令,
我们可以自行定义许许多多好用的function,
在集中写在特定文件中,
然后,在其他的script中用source将它们载入,并反复执行。

若你是RedHat Linux的使用者,
或许,已经猜出 /etc/rc.d/init.d/functions这个文件时啥作用了~~~ ^_^

okay,说要轻松点的嘛,那这次就暂时写到这吧。
祝大家学习愉快,^_^

如何查看docker镜像里的文件

发布于:1年以前  |  1991次阅读  |  详细内容 »

Shell脚本编程30分钟入门

发布于:1年以前  |  598次阅读  |  详细内容 »

Bash脚本15分钟进阶教程

这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT)。这里是一个修订和扩增版本。

发布于:1年以前  |  499次阅读  |  详细内容 »

shell十三问之9:$@与$*差在哪?

在shell script中,我们可用$0, $1, $2, $3 ...这样的变量分别提取命令行中的参数部分

发布于:1年以前  |  305次阅读  |  详细内容 »

shell十三问之8: $(())与$()还有${}差在哪?

我们上一章介绍了()与{}的不同,这次让我们扩展一下,看看更多的变化:$()与${}又是啥玩意儿呢?

发布于:1年以前  |  272次阅读  |  详细内容 »

shell十三问之7:()与{}差在哪?

许多时候,我们在shell操作上,需要在一定的条件下执行多个命令,也就是说,要么不执行,要么就全执行,而不是每次依序的判断是否要执行下一个命令。

发布于:1年以前  |  288次阅读  |  详细内容 »

shell十三问之6:exec跟source差在哪?

发布于:1年以前  |  279次阅读  |  详细内容 »

shell十三问之5:问var=value 在export前后的差在哪?

发布于:1年以前  |  279次阅读  |  详细内容 »

shell十三问之4:""(双引号)与''(单引号)差在哪?

发布于:1年以前  |  287次阅读  |  详细内容 »

shell十三问之3:别人echo、你也echo,是问echo知多少?

发布于:1年以前  |  291次阅读  |  详细内容 »

shell十三问之2:shell prompt(PS1)与Carriage Return(CR)关系

发布于:1年以前  |  265次阅读  |  详细内容 »

shell十三问之16:学习总结与原帖目录

发布于:1年以前  |  583次阅读  |  详细内容 »

shell十三问之15: [^ ] 跟[! ]差在哪? (RE: Regular Expression)

发布于:1年以前  |  516次阅读  |  详细内容 »

shell十三问之14: [^ ] 跟[! ]差在哪? (wildcard)

发布于:1年以前  |  560次阅读  |  详细内容 »

shell十三问之13: for what? while与until差在哪?

发布于:1年以前  |  301次阅读  |  详细内容 »

shell十三问之12:你要if还是case呢?

发布于:1年以前  |  509次阅读  |  详细内容 »

shell十三问之11:>与< 差在哪?

发布于:1年以前  |  469次阅读  |  详细内容 »

shell十三问之10:&& 与 || 差在哪?

发布于:1年以前  |  469次阅读  |  详细内容 »

何为shell

发布于:1年以前  |  1次阅读  |  详细内容 »

Shell语法快速入门

一、基本语法 1.1、shell文件开头 shell文件必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例...

发布于:1年以前  |  1735次阅读  |  详细内容 »

最多阅读

如何查看docker镜像里的文件 1年以前  |  1991次阅读
Shell语法快速入门 1年以前  |  1735次阅读
Shell命令在后台运行程序 1年以前  |  1673次阅读
Shell脚本编程30分钟入门 1年以前  |  598次阅读
shell十三问之12:你要if还是case呢? 1年以前  |  509次阅读
Bash脚本15分钟进阶教程 1年以前  |  499次阅读
shell十三问之11:>与< 差在哪? 1年以前  |  469次阅读
shell十三问之10:&& 与 || 差在哪? 1年以前  |  469次阅读
shell十三问之9:$@与$*差在哪? 1年以前  |  305次阅读
shell十三问之7:()与{}差在哪? 1年以前  |  288次阅读
shell十三问之6:exec跟source差在哪? 1年以前  |  279次阅读