Linux应用环境实战10:Bash脚本编程语言中的美学与哲学(转)

  • 时间:
  • 浏览:0
  • 来源:uu快3下载网站_uu快3开户二维码

    6.机会字符串不被单引号包围,则进行命令替换;命令替换有类似于 格式,类似于 是$(...),类似于 是`...`;也也不将命令的输出作为字符串的内容;

    推导3:命令序列(List) 机会多个简单命令或多个管道贴到 并肩,它们之间以“; & <newline> || &&”等控制操作符分开,就称之为还还有一个命令序列。关于“; & <newline>”前面机会讲过了,不会重复。关于“||”和“&&”,熟悉C、C++、Java等编程语言的当我们 们肯定也不会陌生,它们遵循同样的短路求值的思想。比如 command1 || command2 不到当command1执行不成功的不会 才执行command2,而 command1 && command2 不到当command1执行成功的不会 才执行command2。

    4. case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac ;

  人太好早就想写关于Bash的东西了。 当我们 平时喜欢对编程语言进行分类,比如面向过程的编程语言、面向对象的编程语言、函数式编程语言等等。在我心中,我认为Bash也不还还有一个面向字符串的编程语言。Bash脚本语言的本质:一切皆是字符串。 Bash脚本语言的一切哲学都围绕着字符串:它们从哪里来?到哪里去?使命是类似于 ? Bash脚本语言的一切美学都源自字符串: 由键盘上几乎所有的符号 “$ ~ ! # & ( ) [ ] { } | > < - . , ; * @ ' " ` \ ^” 排列组合而成的极富视觉冲击力的、功能极其复杂化的字符串。

  上图是我在交互式的Bash命令行中做的许多演示。在上图中,我对变量分别赋值,不管等号右边是还还有一个这么引号的字符串,还是含有引号的字符串,甚至数字,机会数学表达式,最终的结果,变量底下存储的删剪都是字符串。我使用还还有一个for循环显示所有的变量,都才能就看数学表达式也也不以字符串的形式储存,这么被求值。

  介绍完字符串、介绍完引用和元字符,下还还有一个目标也不来探讨类似于 个哲学什么的问题:字符串从哪里来、到哪里去?通过该哲学什么的问题的探讨,都才能推导出Bash脚本语言的整个语法。字符串从哪里来?很显然,其中还还有一个很直接的来源也不当我们 从键盘上敲上去的。除此之外,也不前面提到的七八九种字符串展开的土方式了。

  4.完美防止了还还有一个命令执行时的输出和运行情況的分离。有其它编程语言经历的人也总爱会遇到这么 的什么的问题:当我们 调用还还有一个函数的不会 ,函数机会会产生还还有一个结果,还还有一个是函数的返回值,还还有一个是函数调用有无成功。在C#和Java等高级语言中,往往使用try...catch等捕获异常的土方式来判断函数调用有无成功,但仍然有多多程序运行 员让函数返回null代表失败,而C语言类似于 这么异常机制的语言,人太好是难以判断还还有一个函数的返回值究竟如可表示该函数调用有无成功(比如删剪都是也不API让函数返回-1代表失败,而有的函数运行失败是会设置errno全局变量)。在Bash中,命令运行的情況和命令的标准输出区分很明确,机会你需用命令的标准输出,使用命令替换来生成字符串,机会你只需用命令的运行情況,直接将命令写在if得话之中即可,机会使用$?特殊变量来检查上第根小命令的运行情況。机会你会在检查命令运行情況的不会 让命令的标准输出影响用户,都才能把它重定向到/dev/null,比如

  Unix世界还还有一个伟大的哲学:一切皆是文件。(类似于 扯得不得劲远。)Unix世界还还还有一个伟大的哲学:创建多多程序运行 比较方便。(类似于 扯得删剪都是得劲远。)不会 ,每还还有一个多多程序运行 一创建,就会自动打开还还有一个文件,它们分别是标准输入、标准输出、标准错误输出,普通情況下,它们连接到用户的控制台。在Shell中,使用数字来标识还还有一个打开的文件,称为文件描述符,不会 数字0、 1、 2分别代表标准输入、标准输出和标准错误输出。在Shell中,都才能通过“>”、“<”将命令的输入、输出进行重定向。结合exec命令,都才能非常方便地打开和关闭文件。需用注意的是,当文件描述符总爱跳出在“>”、“<”右边的不会 ,前面要使用“&”符号,这机会是为了和数学表达式中的大于和小于进行区别吧。使用“&-”都才能关闭文件描述符。

    3.给变量赋值;这也是还还有一个特例,不得劲破坏Bash编程语言语法哲学的删剪性。为类似于 这么说呢?机会“=”即删剪都是还还有一个元字符,也不允许两边有空格,不会 不到第还还有一个等号会被当成赋值运算符。

  底下的4步推导是一步更进一步的,是由简单逐渐到复杂化的,最简单的命令都才能组合成稍复杂化的管道,再组合成更复杂化的命令序列,最后组成最复杂化的复合命令。

    推导1:简单命令(Simple command) 也不第根小简单的命令,它都才能是还还有一个以上述控制操作符结尾的字符串。比如单独贴到 一行的 uname -r 命令(单独贴到 一行的命令人太好是以<newline>结尾,<newline>是控制操作符),机会人太好不单独贴到 一行,不会 以“;”或“&”结尾,比如 uname -r; who; pwd; gvim& 其中每还还有一个命令删剪都是还还有一个简单命令(当然,这3个命令贴到 并肩的这行代码不叫简单命令),“;”也不简单地分割命令,而“&”还有让命令在后台执行的功能。这里比较特殊的是双分号“;;”,它只用在case得话中。

  探讨完了字符串从哪里来,下面来看看字符串到哪里去。也也不为社 使用类似于 字符串。使用字符串有以下几种土方式:

    6. while list-1; do list-2; done ;

  当然,自从Bash 3不会 ,Bash类似于 就提供了间接引用的功能(使用“${!var}”)。

  前面我机会展示了我对字符串从哪里来、到哪里去类似于 什么的问题的理解。关于字符串的去向,除了还还有一个表达式和还还有一个为变量赋值类似于 个特例,剩下的就不到当命令来执行了。在前面,我提到了元字符和引用的概念,这里,还得再增加许多点定义:

    1.把它当命令执行;这是Bash中的最根本的用法,毕竟Shell的位于也不为了粘合各种命令。机会还还有一个字符串总爱跳出在本该命令总爱跳出的地方(比如一行的开头,机会关键字then、do等的底下),它机会被当成命令执行,机会它删剪都是个合法的命令,就会报错;

  在上图中,我展示了Bash中生成字符串的7种土方式:大括号展开、波浪符展开、参数展开、命令替换、算术展开、单词分割和文件路径展开。还有类似于 生成字符串的土方式这么讲(Process substitution和历史命令展开)。在使用Bash脚本编程的不会 ,了解以上7种字符串生成的土方式就够了。在交互式使用Bash命令行的不会 ,还需用了解历史命令展开,熟练使用历史命令展开都才能让他事半功倍。

    推导4:复合命令(Compound Commands) 机会将前面的简单命令、管道机会命令序列以更复杂化的土方式组合在并肩,就都才能构成复合命令。在Bash中,有4种形式的复合命令,它们分别是 (list) 、  { list; } 、  ((expression)) 、  [[ expression ]] 。请注意第2种形式和第4种形式大括号和化括号俯近的空格,也请注意第2种形式中list底下的“;”,不过机会“}”另起一行,则不需用“;”,机会<newline>和“;”是起同样作用的。在以上4种复合命令中, (list) 是在还还有一个新的Shell中执行命令序列,类似于 命令的执行不会影响当前Shell的环境变量,而 { list; } 也不简单地将命令序列分组。底下类似于 表达式求值前面机会讲过,这里就不讲了。底下机会会删剪列出逻辑表达式求值的选项。

  字符串展开的流程如下:

    8.机会字符串不被单引号或双引号包围,则进行单词分割;

  5.使用管道和输入输出重定向让文件的读写变得简单。想一想在C语言中为社 读文件吧,除了麻烦的open、close不说,每读还还有一个字符串还得先准备还还有一个buffer,准备长了怕浪费空间,准备短了怕缓冲区溢出,虐心啦。使用Bash,那真的是太方便了。

  3.概念上具有很好的一致性;比如 (list) 复合命令的功能是执行括号内的命令序列,而“$”用于引导字符串展开,也不 $(list) 用于命令替换(也不我前面说“$()”形式的命令替换比“``”形式的命令替换更加具有一致性)。比如 ((expresion)) 用于数学表达式求值,也不 $((expression)) 代表算术展开。再比如“{}”和“,”配合使用,且底下这么空格时,代表大括号展开,不会 当需用使用“{ }”来定义复合命令时,需用把“{ }”当关键字,它们和它底下的内容需用以空格隔开,不会 “}”和它前面的第根小命令之间需用还还有一个“;”机会“<newline>”。类似于 概念上的一致性设计得非常精妙,使用起来自然而然都才能让他体会到类似于 美感;

  最常见的元字符也不空格。 从底下几张图片都才能看出,机会要将还还有一个含有空格的字符串赋值给还还有一个变量,要么把类似于 字符串用双引号包围,要么使用“\”对空格进行引用。 从上图中都才能看出,Bash中不到9个元字符,它们分别是“| & ( ) ; < > space tab”,而在其它编程语言中总爱总爱跳出的元字符“. { } [ ]”以及作为数学运算的加减乘除,在Bash中都删剪都是元字符。

  请注意,数字和“>”、“<”符号之间是这么空格的。结合exec,都才能非常方便地使用还还有一个文件描述符来打开、关闭文件,如下:

  “> < & 数字 exec -”,这也不输入输出重定向的删剪。下面的公式中,我使用n代表数字,机会是还还有一个不同的数字,则使用n1、n2,使用[...]代表可选参数。输入输出重定向的语法如下:

    3.机会字符串不被单引号和双引号包围,则进行大括号展开,即将{a,b}c展开为ab ac;

    4.机会字符串不被单引号或双引号包围,则进行波浪符展开,即将~/展开为用户的主目录,将~+/展开为当前工作目录(PWD),将~-/展开为上还还有一个工作目录(OLDPWD);

    5. if list; then list; [ elif list; then list; ] ... [ else list; ] fi ;

  好像忘了点类似于 ?对了,还有输入输出重定向这么讲。输入输出重定向是Shell中又还还有一个发明的故事者者,它的位于有着它独特的哲学意义。类似于 请看下一节。

  下面图片为以上观点给出证据:

  都才能看出,机会有function关键字,则“()”是可选的,机会这么function关键字,则“()”是需用的。这里需用不得劲指出的是:函数体假使 求是compound-command,我前面总结过compound-command有类似于 形式,也不有不会 定义还还有一个函数越多会总爱跳出“{ }”哦。如下图,这么 的函数也是合法的:

    定义1:控制操作符(Control Operator) 前面提到元字符是为了把还还有一个字符串分割为多个子串,而控制操作符也不为了把一系列的字符串分割成多个命令。举例说明,在Bash中,还还有一个字符串 cat /etc/passwd 也不还还有一个命令,第还还有一个单词cat是命令,第还还有一个单词/etc/passwd是命令的参数,而字符串 cat /etc/passwd | grep youxia 也不还还有一个命令,类似于 个命令分别是cat和grep,它们之间通过“|”分割,也不这里的“|”是控制操作符。熟悉Shell的当我们 肯定知道“|”代表的是管道,也不它的作用是1.把还还有一个字符串分割为还还有一个命令,2.将第还还有一个命令的输出作为第3个命令的输入。在Bash中,总共不到10个控制操作符,它们分别是“|| & && | ; ;; ( ) |& <newline>”。假使 就看类似于 控制操作符,就都才能认为它前面的字符串是还还有一个删剪的命令。

    定义2:关键字(Reserved Words) 我这么将其翻译成保留字,很显然,作为编程语言来说,它们应该叫做关键字。一门编程语言肯定需用得提供选折 、循环等流程控制得话,还得提供定义函数的功能。类似于 功能不到通过关键字实现。在Bash中,不到2还还有一个关键字,它们是“! case coproc do done elif else esac fi for function if in select then until while { } time [[ ]]”。这其含有不少的不得劲之处,比如“! { } [[ ]]”等符号删剪都是关键字,也也不说它们当关键字使用时最少还还有一个单词,也也不说它们和别的单词需用以元字符分开(不会 无法成为独立的单词)。这也是为类似于 在Bash中使用“! { } [[ ]]”时总爱要在它们俯近留空格的原因分析分析。(再一次证明“=”是还还有一个很变态的特例,机会它既删剪都是元字符,也删剪都是控制操作符,更加删剪都是关键字,它到底是类似于 ?)

    机会

  例外:

    2.把它当成表达式;Bash中本这么表达式,不会 有了((...))和[[...]],删剪都是了表达式;((...))都才能把它底下的字符串当成算术表达式,而[[...]]会把它底下的字符串当逻辑表达式,仅此还还有一个特例;

  Bash是还还有一个Shell,Shell总爱跳出的初衷是为了将系统中的各种工具粘合在并肩,也不它最根本的功能是调用各种命令。 不会 Bash又提供了丰厚的编程功能。 当我们 总爱对编程语言进行分类,比如面向过程的语言、面向对象的语言、面向函数的语言等等。 都才能把Bash脚本语言看成是还还有一个面向字符串的语言。 Bash语言的本质也不:一切删剪都是字符串。 看看下图中的类似于 变量:

  机会想让任何还还有一个字符删剪都是具有特殊含义,都才能使用单引号将字符串包围。比如使用正则表达式的不会 ,还比如使用sed、awk等工具的不会 ,机会sed和awk当事人执行的命令中往往包含有也不特殊字符,也不它们的命令最好用单引号包围。 比如使用awk命令显示/etc/passwd文件中的每个用户的用户名和全名,都才能使用类似于 命令 awk -e '{print $1,$5}' ,其中,传递给awk的命令用单引号包围,说明bash不执行其中的任何替换或展开。

  另外还还有一个特殊的字符是“\”,它也是引用的类似于 。它都才能解除紧跟在它底下的还还有一个特殊字符的特殊含义(引用)。人太好需用“\”的位于,是机会在Bash中,许多字符称为元字符,类似于 字符一旦总爱跳出,就会将还还有一个字符串分割为多个子串。机会需用在还还有一个字符串含有有类似于 元字符类似于 ,就需用对它们进行引用。如下图:

    5.机会字符串不被单引号包围,则进行参数和变量展开;类似于 类的展开也不以“$”开头,这是整个Bash字符串展开中最复杂化的,其中包括用户定义的变量,包括所有的环境变量,以上类似于 展开土方式删剪都是“$”后跟变量名,还包括位置变量“$1、 $2、 ...、 $9、 ... ”,其它特殊变量:“$@、 $*、 $#、 $-、 $!、 $0、 $?、 $_ ”,甚至还有数组:“${var[i]}”, 还都才能在展开的过程中对字符串进行各种复杂化的操作,如:“ ${parameter:-word}、 ${parameter:=word}、 ${parameter:+word}、 ;${parameter:?word}、 ${parameter:offset}、 ${parameter:offset:length}、 ${!prefix*}、 ${!prefix@}、 ${name[@]}、 ${!name[*]}、 ${#parameter}、 ${parameter#word}、 ${parameter##word}、 ${parameter%word}、 ${parameter%%word}、 ${parameter/pattern/string}、 ${parameter^pattern}、 ${parameter^^pattern}、 ${parameter,pattern}、 ${parameter,,pattern}”;

    7. until list-1; do list-2; done 。

  在底下的图片中都才能就看,有许多展开土方式在被双引号包围的字符串中是不起作用的,比如大括号展开、波浪符展开、单词分割、文件路径展开,而不到参数展开、命令替换和算术展开是起作用的。从图片中还都才能看出,字符串中的参数展开、命令替换和算术展开删剪都是由“$”符号引导,命令替换还都才能由“`”引导。也不,都才能进一步总结为,在双引号包围的字符串中,不到“$、`、\”类似于 个字符具有特殊含义。

    1. for name [ [ in [ word ... ] ] ; ] do list ; done ;

  除了exec,输入输出重定向和read命令配合也很好用,read命令每次读取文件的一行。不会 要注意的是,输入输出重定向贴到 for、while等循环的循环体和循环外,效果是不一样的。如下图:

  最后,再来展示一下如可定义函数:

    9.机会字符串不被单引号或双引号包围,则进行文件路径展开;

  That's all。这也不Bash脚本语言的删剪语法。就这么简单。

http://www.cnblogs.com/youxia/p/linux010.html

  还都才能将“<>”并肩使用,表示打开还还有一个文件进行读写。

    7.机会字符串不被单引号包围,则进行算术展开;算术展开的格式为$((...));

  机会你问我Bash脚本语言哪里美?我会回答:简洁也不美。请看下面逐条论述:

  6.它还是一门不折不扣的动态语言哦,eval命令人太好是太强大了,请看下图,模拟指针进行查表:

  以上内容是我的胡言乱语,机会以上内容即无法教会当我们 删剪的Bash语法,也无法教会当我们 用Bash做任何许多有意义的工作。

     name () compound-command [redirection]

  1.使用了简洁的抽象的符号。Bash脚本语言几乎使用到了键盘都才有助找到的所有符号,比如“$”用作字符串展开,“|”用作管道,“<”、“>”用作输入输出重定向,许多删剪都是浪费;

  2.只使用了9个元字符、10个控制操作符和2还还有一个关键字,就构建了还还有一个删剪的、面向字符串编程的语言;

    Bash语言也并删剪都是在所有的方面删剪都是完美的,还位于几块不得劲的例外。比如前面说的“=”。除了“=”,“()”也还还有一个使用不一致的地方,那也不对数组的初始化,比如 array=(a b c d e f) ,这和前面讲的“()”用于在子Shell中执行命令序列还真的是不一致。

    2.机会字符串是用来给变量赋值,则不管它有无被双引号包围,都认为它被双引号包围;

    10.以上流程删剪完成后,最后再加字符串外面的引号(机会有得话)。以上流程只按以上顺序进行一遍。比如不会在变量展开后再进行大括号展开,更不会在第10步去除引用后执行前面的任何一步。机会需用将流程再走一遍,请使用eval。

  我承认,我再一次地当了标题党。不会 不可签署,类似于 定是一篇精华随笔。在类似于 篇中,我将探讨Bash脚本语言中的美学与哲学。 这删剪都是一篇Bash脚本编程的教程,不会 却能让他更加深入地了解Bash脚本编程,更加快速地学习Bash脚本编程。 阅读这篇随笔,不需用你有Bash编程的经验,但一定要和我一样热衷于探索各种编程语言的本质,感悟它们的魅力。

    2. for (( expr1 ; expr2 ; expr3 )) ; do list ; done ;

     function name [()] compound-command [redirection]

    1.先用元字符将还还有一个字符串分割为多个子串;

    推导2:管道(Pipe Line) 管道是Shell中的精髓,也不让前还还有一个命令的输出成为后还还有一个命令的输入。管道的删剪语法是这么 [time [-p]] [ ! ] command1 | command2 或这么 [time [-p]] [ ! ] command1 |& command2 的。其中time关键字和!关键字删剪都是可选的(使用[...]指出类似于 次责是可选的),time关键字都才能计算命令运行的时间,而!关键字是将命令的返回情況取反。看清楚!关键字俯近的空格哦。机会使用“|”,也不把第还还有一个命令的标准输出作为第3个命令的标准输入,机会使用“|&”,则将第还还有一个命令的标准输出和标准错误输出都当成第3个命令的输入。

  另外,输入输出重定向符号“>”、“<”还都才能和“()”并肩使用,表示多多程序运行 替换(Process substitution),如“>(list)”、“<(list)”。结合前面提到的“<”、“>”、“(list)”的含义,多多程序运行 替换的作用是很容易猜到的哦。

  另外,我的主要参考资料来自于Bash用户手册。当我们 都才能在当事人的系统中运行 man bash 。

    3. select name [ in word ] ; do list ; done ;

  底下的公式当我们 看得懂吧,我相信当我们 肯定看得懂。其中的[...]代表的是都才能有也都才能真这么的次责。在以上公式中,请注意第还还有一个公式for循环中的双括号,它执行的是其中的表达式的算术运算,这是和其它高级语言的for循环最像的,不会 很遗憾,Bash中的算术表达式目前不到计算整数。再请注意第3个公式,select语法,和for...in...循环的语法比较类似于,不会 它都才能在屏幕上显示还还有一个菜单。机会我这么记错得话,Basic语言中应该有类似于 功能。其它的控制特性在别的高级语言中都很常见,就不需用我在这里啰嗦了。

  究竟带引号的字符串和不带引号的字符串使用起来有类似于 不一样呢?下图是我构建的许多比较典型的例子:

  下面是Bash脚本语言的流程控制得话,如下:

以上还还有一个流程都才能通过下图证明:

  机会一切删剪都是这么特殊功能的平凡的字符串,那就无法构成一门编程语言。在Bash中,有也不符号具有特殊含义,比如“$”符号被用于字符串展开,“&”符号用于让命令在后台执行, “|”用作管道, “>” “<”用于输入输出重定向等等。也不在Bash中,人太好同样是字符串,不会 被引号包围的字符串和不被引号包围的字符串使用起来是不一样的,被单引号包围的字符串和被双引号包围起来的字符串也是不一样的。

  下面之前 之前 刚开始 推导Bash脚本语言的语法:

  机会想用Bash干点实事,我送当我们 一本O'Reilly出的《Shell脚本学习指南》:Shell脚本学习指南.part1.rar Shell脚本学习指南.part2.rar Shell脚本学习指南.part3.rar Shell脚本学习指南.part4.rar (为类似于 一次不到上传10M啊,好好的一本书被拆分成4次责了。)