|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。
24.forargin$*
和年夜多半Shell一样,Bash撑持顺次读取单个命令行参数的语法。不外这并是$*大概$@,这两种写法都不准确,它们只能失掉完全的参数列表,并不是独自的一个个参数。
准确的语法是(没错要加上引号):- forargin"$@"#大概更复杂的写法forarg
复制代码 在剧本中遍历一切参数是一个再广泛不外的需求,以是forarg默许等价于forargin"$@"。$@利用双引号后就有特别的魔力,每一个参数睁开后成为一个自力的单词。("$@"等价于"$1""$2""$3"...)
上面是一个毛病的例子:- forxin$*;doecho"parameter:$x"done
复制代码 实行的了局为:- $./myscriptarg1arg2arg3parameter:argparameter:1parameter:arg2parameter:arg3
复制代码 准确的写法:- forxin"$@";doecho"parameter:$x"done
复制代码 实行的了局为:- $./myscriptarg1arg2arg3parameter:arg1parameter:arg2parameter:arg3
复制代码 下面准确的例子中,第一个参数arg1在睁开后仍然是一个自力的单词,而不会被拆分红两个。
25.functionfoo()
这类写法纷歧定可以兼容一切shell,兼容的写法是:26.echo"~"
海浪号睁开(Tildeexpansion)仅当~没有引号的时分产生,在下面的例子中,只会向尺度输入打印~标记,而不是以后用户的家目次路径。
当用引号将路径参数引发来时,
假如要用引号将相对家目次的路径引发来时,保举利用$HOME而不是~,假设$HOME目次是"/home/myphotos",路径中包括空格。
上面是几组例子:- "~/dirwithspaces"#expandsto"~/dirwithspaces"~"/dirwithspaces"#expandsto"~/dirwithspaces"~/"dirwithspaces"#expandsto"/home/myphotos/dirwithspaces""$HOME/dirwithspaces"#expandsto"/home/myphotos/dirwithspaces"
复制代码 27.localvarname=$(command)
当在函数中声明部分变量时,local作为一个自力的命令,这类奇异的举动偶然候大概会招致困扰。好比,当你想要捕捉命令交换的前往码时,你就不克不及如许做。local命令的前往码会掩盖它。
这类情形下,你只能分红两行写:- localvarnamevarname=$(command)rc=$?
复制代码 28.exportfoo=~/bar
export与local命令一样,并非赋值语句的一部分。因而,在有些Shell下(好比Bash),exportfoo=~/bar会睁开,可是有些(好比Dash)却不可。
上面是两种对照强健的写法:- foo=~/bar;exportfoo#Right!exportfoo="$HOME/bar"#Right!
复制代码 29.seds/$foo/goodbye/
单引号外部不会睁开$foo变量,在这里能够换成双引号:- 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):- forxin$*;doecho"parameter:$x"done0
复制代码 假如你但愿依据实践的言语情况来转换:- forxin$*;doecho"parameter:$x"done1
复制代码 31.psax|grepgedit
这里的基本成绩是正在运转的历程称号,实质上是不成靠的。大概会有多个正当的gedit历程,也有多是其余工具假装成gedit历程(改动实行命令称号是一件复杂的事变),更多细节能够看ProcessManagement这一篇文章。
实行以上命令,常常会在了局中包括grep历程:- forxin$*;doecho"parameter:$x"done2
复制代码 这个时分,必要过滤过剩的了局:- forxin$*;doecho"parameter:$x"done3
复制代码 下面的写法对照丑恶,别的一种办法是:- forxin$*;doecho"parameter:$x"done4
复制代码 32.printf"$foo"
假如$foo变量的值中包含大概%标记,下面命令的实行了局大概会出乎你的料想以外。
上面是准确的写法:- forxin$*;doecho"parameter:$x"done5
复制代码 33.foriin{1..$n}
Bash的命令注释器会优先睁开年夜括号,以是这时候年夜括号{}表达式内里看到的是笔墨上的$n(没有睁开)。$n不是一个数值,以是这里的年夜括号{}其实不会睁开成数字列表。可见,这招致很难利用年夜括号来睁开巨细只能在运转时才晓得的列表。
能够用上面的办法:- forxin$*;doecho"parameter:$x"done6
复制代码 注:之前我也有写过一篇文章来先容这个成绩:Shell天生数字序列。
34.if[[$foo=$bar]]
在[[外部,当=号右侧的值没有效引号引发来,bash会将它看成形式来婚配,而不是一个复杂的字符串。以是,在下面的例子中,假如bar的值是一个*号,实行的了局永久是true。
学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。 |
|