仓酷云

标题: Linux制作之Bash编程易犯的毛病(三)仓酷云 [打印本页]

作者: 小女巫    时间: 2015-1-18 11:25
标题: Linux制作之Bash编程易犯的毛病(三)仓酷云
学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。
24.forargin$*

和年夜多半Shell一样,Bash撑持顺次读取单个命令行参数的语法。不外这并是$*大概$@,这两种写法都不准确,它们只能失掉完全的参数列表,并不是独自的一个个参数。
准确的语法是(没错要加上引号):
  1. forargin"$@"#大概更复杂的写法forarg
复制代码
在剧本中遍历一切参数是一个再广泛不外的需求,以是forarg默许等价于forargin"$@"。$@利用双引号后就有特别的魔力,每一个参数睁开后成为一个自力的单词。("$@"等价于"$1""$2""$3"...)
上面是一个毛病的例子:
  1. forxin$*;doecho"parameter:$x"done
复制代码
实行的了局为:
  1. $./myscriptarg1arg2arg3parameter:argparameter:1parameter:arg2parameter:arg3
复制代码
准确的写法:
  1. forxin"$@";doecho"parameter:$x"done
复制代码
实行的了局为:
  1. $./myscriptarg1arg2arg3parameter:arg1parameter:arg2parameter:arg3
复制代码
下面准确的例子中,第一个参数arg1在睁开后仍然是一个自力的单词,而不会被拆分红两个。
25.functionfoo()

这类写法纷歧定可以兼容一切shell,兼容的写法是:
  1. foo(){...}
复制代码
26.echo"~"

海浪号睁开(Tildeexpansion)仅当~没有引号的时分产生,在下面的例子中,只会向尺度输入打印~标记,而不是以后用户的家目次路径。
当用引号将路径参数引发来时,
假如要用引号将相对家目次的路径引发来时,保举利用$HOME而不是~,假设$HOME目次是"/home/myphotos",路径中包括空格。
上面是几组例子:
  1. "~/dirwithspaces"#expandsto"~/dirwithspaces"~"/dirwithspaces"#expandsto"~/dirwithspaces"~/"dirwithspaces"#expandsto"/home/myphotos/dirwithspaces""$HOME/dirwithspaces"#expandsto"/home/myphotos/dirwithspaces"
复制代码
27.localvarname=$(command)

当在函数中声明部分变量时,local作为一个自力的命令,这类奇异的举动偶然候大概会招致困扰。好比,当你想要捕捉命令交换的前往码时,你就不克不及如许做。local命令的前往码会掩盖它。
这类情形下,你只能分红两行写:
  1. localvarnamevarname=$(command)rc=$?
复制代码
28.exportfoo=~/bar

export与local命令一样,并非赋值语句的一部分。因而,在有些Shell下(好比Bash),exportfoo=~/bar会睁开,可是有些(好比Dash)却不可。
上面是两种对照强健的写法:
  1. foo=~/bar;exportfoo#Right!exportfoo="$HOME/bar"#Right!
复制代码
29.seds/$foo/goodbye/

单引号外部不会睁开$foo变量,在这里能够换成双引号:
  1. foo="hello";sed"s/$foo/goodbye/"
复制代码
可是要注重,假如你利用了双引号,就必要思索更多本义的事变,详细能够看Quotes这一页。.
30.tr[A-Z][a-z]

这里最少有三个成绩。第一个成绩是,[A-Z]和[a-z]会被shell以为是通配符。假如在以后目次下没用文件名为单个字母的文件,这个命令仿佛能准确实行,不然会毛病地实行,大概你会在周末泯灭很多小时来修复这个成绩。
第二个成绩是,这不是tr命令阃确的写法,实践上,下面的命令会把[转换成[,将恣意年夜写字符转换成对应的小写字符,将]转换成],以是你基本不必要加上括号,如许第一个成绩就能够办理了。
第三个成绩是,下面的命令实行了局依附于以后的locale,A-Z大概a-z纷歧定会代表26个ASCII字母。实践上,在一些言语情况下,z位于字母表的两头地位。这个成绩的解法,取决于你但愿产生的举动是哪种。
假如你仅但愿改动26个英笔墨母的巨细写(强迫locale为C):
  1. forxin$*;doecho"parameter:$x"done0
复制代码
假如你但愿依据实践的言语情况来转换:
  1. forxin$*;doecho"parameter:$x"done1
复制代码
31.psax|grepgedit

这里的基本成绩是正在运转的历程称号,实质上是不成靠的。大概会有多个正当的gedit历程,也有多是其余工具假装成gedit历程(改动实行命令称号是一件复杂的事变),更多细节能够看ProcessManagement这一篇文章。
实行以上命令,常常会在了局中包括grep历程:
  1. forxin$*;doecho"parameter:$x"done2
复制代码
这个时分,必要过滤过剩的了局:
  1. forxin$*;doecho"parameter:$x"done3
复制代码
下面的写法对照丑恶,别的一种办法是:
  1. forxin$*;doecho"parameter:$x"done4
复制代码
32.printf"$foo"

假如$foo变量的值中包含大概%标记,下面命令的实行了局大概会出乎你的料想以外。
上面是准确的写法:
  1. forxin$*;doecho"parameter:$x"done5
复制代码
33.foriin{1..$n}

Bash的命令注释器会优先睁开年夜括号,以是这时候年夜括号{}表达式内里看到的是笔墨上的$n(没有睁开)。$n不是一个数值,以是这里的年夜括号{}其实不会睁开成数字列表。可见,这招致很难利用年夜括号来睁开巨细只能在运转时才晓得的列表。
能够用上面的办法:
  1. forxin$*;doecho"parameter:$x"done6
复制代码
注:之前我也有写过一篇文章来先容这个成绩:Shell天生数字序列。
34.if[[$foo=$bar]]

在[[外部,当=号右侧的值没有效引号引发来,bash会将它看成形式来婚配,而不是一个复杂的字符串。以是,在下面的例子中,假如bar的值是一个*号,实行的了局永久是true。

学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。
作者: 冷月葬花魂    时间: 2015-1-30 09:17
下面看看一个让人无法回答的问题:“救命各位高手,向你们请教一些问题:如何在Linux下配制HTTP、FTP、Samba、DNS、DHCP、Sendmail服务器,谢谢”这样的问题。
作者: 再现理想    时间: 2015-2-6 09:30
有疑问前,知识学习前,先用搜索。
作者: 精灵巫婆    时间: 2015-2-15 22:06
在系统检测不到与Linux兼容的显卡,那么此次安装就可能不支持图形化界面安装,而只能用文本模式安装等等。
作者: 金色的骷髅    时间: 2015-2-26 19:22
Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。
作者: 谁可相欹    时间: 2015-3-8 16:42
应对Linux的发展历史和特点有所了解,Linux是抢占式多任务多用户操作系统,Linux最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具。
作者: 只想知道    时间: 2015-3-9 14:58
用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户,估shell也称为命令解释器,有关命令的学习可参考论坛相关文章,精通英文也是学习Linux的关键。
作者: 灵魂腐蚀    时间: 2015-3-16 23:57
期间我阅读了不少关于Linux的相关资料,其中也不乏一些有趣的小故事,这既丰富了我的课余生活,也让我加深了对一些术语的理解,比玩游戏强多了。?
作者: 分手快乐    时间: 2015-3-23 07:12
我们自学,就这个循环的过程中,我们学习了基本操作,用vi,shell,模拟内存的分配过程等一些OS管理。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2