仓酷云

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

作者: 蒙在股里    时间: 2015-1-18 11:25
标题: Linux制作之Bash编程易犯的毛病(二)仓酷云
如果你让他去用linux搭建一个web服务器,做一个linux网关,他就什么都不会了.他们把时间都浪费在了版本的转换上了.
13.catfile|seds/foo/bar/>file

你不该该在一个管道中,从一个文件读的同时,再往不异的文件内里写,如许的成果是未知的。
你能够为此创立一个一时文件,这类做法对照平安牢靠:
  1. #seds/foo/bar/gfile>tmpfile&&mvtmpfilefile
复制代码
大概,假如你用得是GNUSed4.x以上的版本,可使用-i选项立即修正文件的内容:
  1. #sed-is/foo/bar/gfile
复制代码
14.echo$foo

这类看似有害的命令常常会给初学者万万极年夜的困扰,他们会嫌疑是否是由于$foo变量的值是毛病的。现实倒是由于,$foo变量在这里没有利用双引号,以是在剖析的时分会举行单词拆分和文件名睁开,终极招致实行了局与预期天差地别:
  1. msg="Pleaseenterafilenameoftheform*.zip"echo$msg
复制代码
这里整句话会被拆分红单词,然后个中的通配符会被睁开,比方*.zip。当你的用户看到以下的了局时,他们会如何想:
  1. Pleaseenterafilenameoftheformfreenfss.ziplw35nfss.zip
复制代码
再举一个例子(假定以后目次下有以.zip开头的文件):
  1. var="*.zip"#var包含一个星号,一个点号和zipecho"$var"#输入*.zipecho$var#输入一切以.zip开头的文件
复制代码
实践上,这里利用echo命令并非相对的平安。比方,当变量的值包括-n时,echo会以为它是一个正当的选项而不是要输入的内容(固然假如你可以包管不会有-n这类值,能够宁神地利用echo命令)。
完整牢靠的打印变量值的办法是利用printf:
  1. printf"%sn""$foo"
复制代码
15.$foo=bar

略过
16.foo=bar

当赋值时,等号双方是不同意呈现空格的,这同C言语纷歧样。当你写下foo=bar时,shell会将该命令剖析成三个单词,然后第一个单词foo会被以为是一个命令,前面的内容会被看成命令参数。
一样地,上面的写法也是毛病的:
  1. foo=bar#WRONG!foo=bar#WRONG!$foo=bar;#COMPLETELYWRONG!准确的写法应当是如许的:<preclass="prettyprintlang-sh">foo=bar#Right.foo="bar"#MoreRight.
复制代码
17.echo<<EOF

当剧本必要嵌进年夜段的文本内容时,heredocument常常是一个十分有效的工具,它将个中的文本作为命令的尺度输出。不外,echo命令其实不撑持从尺度输出读取内容,以是上面的写法是毛病的:
  1. #Thisiswrong:echo<<EOFHelloworldHowsitgoing?EOF
复制代码
准确的办法是,利用cat命令来完成:
  1. #Thisiswhatyouweretryingtodo:cat<<EOFHelloworldHowsitgoing?EOF
复制代码
大概可使用双引号,它也能够超过多行,并且由于echo命令是内置命令,不异情形下它会加倍高效:
  1. echo"HelloworldHowsitgoing?"
复制代码
18.su-csomecommand

这类写法“几近”是准确的。成绩是,在很多平台上,su撑持-c参数,可是它纷歧定是你以为的。好比,在OpenBSD平台上你如许实行会堕落:
  1. #sed-is/foo/bar/gfile0
复制代码
在这里,-c是用于指定login-class。假如你想要传送-csomecommand给shell,最幸亏之前显现地指定username:
  1. #sed-is/foo/bar/gfile1
复制代码
19.cd/foo;bar

假如你不反省cd命令实行是不是乐成,你能够会在毛病的目次下实行bar命令,这有大概会带来劫难,好比bar命令是rm-rf*。
你必需常常反省cd命令实行是不是有毛病,复杂的做法是:
  1. #sed-is/foo/bar/gfile2
复制代码
假如在cd命令后有多个命令,你能够选择如许写:
  1. #sed-is/foo/bar/gfile3
复制代码
堕落时,cd命令会呈报没法改动以后目次,同时将毛病动静输入到尺度毛病,比方"bash:cd:/foo:Nosuchfileordirectory"。假如你想要在尺度输入同时输入自界说的毛病提醒,可使用复合命令(commandgrouping):
  1. #sed-is/foo/bar/gfile4
复制代码
注重,在{号和echo之间必要有一个空格,同时}之前要加上分号。
特地提一下,假如你要在剧本里频仍改动以后目次,能够看看pushd/popd/dirs等命令,大概你在代码内里写的cd/pwd命令都是没有需要的。
说到这,对照下上面两种写法:
  1. #sed-is/foo/bar/gfile5
复制代码
  1. #sed-is/foo/bar/gfile6
复制代码
上面的写法,在轮回中fork了一个子shell历程,子shell历程中的cd命令仅会影响以后shell的情况变量,以是父历程中的情况命令不会被改动;当实行到下一次轮回时,不管之前的cd命令有无实行乐成,我们会回到不异确当前目次。这类写法相较后面的用法,代码加倍洁净。
20.[bar=="$foo"]

准确的用法:
  1. #sed-is/foo/bar/gfile7
复制代码
21.foriin{1..10};do./something&;done

你不该该在&前面增加分号,删除它:
  1. #sed-is/foo/bar/gfile8
复制代码
大概改成多行的情势:
  1. #sed-is/foo/bar/gfile9
复制代码
&和分号一样也能够用作命令停止符,以是你不要将两个混用到一同。一样平常情形下,分号能够被换行符交换,可是不是一切的换行符都能够用分号交换。
22.cmd1&&cmd2||cmd3

有些人喜好把&&和||作为if...then...else...fi的简写语法,在多半情形下,这类写法没有成绩。比方:
  1. msg="Pleaseenterafilenameoftheform*.zip"echo$msg0
复制代码
可是,这类布局并非在一切情形下都完整等价于if...fi语法。这是由于在&&前面的命令实行停止时也会天生一个前往码,假如该前往码不是真值(0代表true),||前面的命令也会实行,比方:
  1. msg="Pleaseenterafilenameoftheform*.zip"echo$msg1
复制代码
看起来下面的了局应当是前往1,可是了局倒是输入0,为何呢?缘故原由是这里i++和i--都实行了一遍。
个中,((i++))命令实行算术运算,表达式盘算的了局为0。这里和C言语一样,表达式的了局为0被以为是false。以是当i=0的时分,((i++))命令实行的前往码为1(false),从而会实行接上去的((i--))命令。
假如我们在这里利用前缀自增运算符的话,前往的了局恰好为1,由于((++i))实行的前往码是0(true):
  1. msg="Pleaseenterafilenameoftheform*.zip"echo$msg2
复制代码
不外在你没法包管y的实行了局是,相对不要依托x&&y||z这类写法。下面这类偶合,在i初始化为-1时也会有成绩。
假如你喜好代码加倍平安强健,倡议利用if...fi语法:
  1. msg="Pleaseenterafilenameoftheform*.zip"echo$msg3
复制代码
23.echo"HelloWorld!"

在交互式的Shell情况下,你实行以上命令会碰到上面的毛病:

虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命令行。
作者: 小魔女    时间: 2015-1-18 16:09
当然你不需搭建所有服务,可以慢慢来。自己多动手,不要非等着别人帮你解决问题。
作者: 乐观    时间: 2015-1-24 12:01
永中office 2004增强版安装只需要默认安装即可使用并操作大多与win系统雷同,打印机的配置和管理,记录光盘等。
作者: 不帅    时间: 2015-1-31 12:07
目前全球有超过一百多个Linux发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,RedhatLinux和DebianLinux是网络管理员的理想选择。
作者: 愤怒的大鸟    时间: 2015-2-6 19:20
发问的时候一定要注意到某些礼节。因为Linux社区是一个松散的组织、也不承担回复每个帖子的义务。它不是技术支持。
作者: 分手快乐    时间: 2015-2-7 18:46
这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。
作者: 透明    时间: 2015-2-22 22:41
学习Linux应具备的。[书籍+网络资源]
作者: 精灵巫婆    时间: 2015-3-7 03:52
有疑问前,知识学习前,先用搜索。
作者: 只想知道    时间: 2015-3-14 08:33
随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。
作者: 因胸联盟    时间: 2015-3-21 00:55
对我们学习操作系统有很大的帮助,加深我们对OS的理解。?




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