仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 444|回复: 8
打印 上一主题 下一主题

[其他Linux] Linux制作之Bash编程易犯的毛病(三)仓酷云

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:25:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-21 05:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表