蒙在股里 发表于 2015-1-18 11:25:27

Linux制作之Bash编程易犯的毛病(二)仓酷云

如果你让他去用linux搭建一个web服务器,做一个linux网关,他就什么都不会了.他们把时间都浪费在了版本的转换上了.
13.catfile|seds/foo/bar/>file

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

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

略过
16.foo=bar

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

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

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

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

准确的用法:
#sed-is/foo/bar/gfile721.foriin{1..10};do./something&;done

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

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

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

虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命令行。

小魔女 发表于 2015-1-18 16:09:32

当然你不需搭建所有服务,可以慢慢来。自己多动手,不要非等着别人帮你解决问题。

乐观 发表于 2015-1-24 12:01:56

永中office 2004增强版安装只需要默认安装即可使用并操作大多与win系统雷同,打印机的配置和管理,记录光盘等。

不帅 发表于 2015-1-31 12:07:09

目前全球有超过一百多个Linux发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,RedhatLinux和DebianLinux是网络管理员的理想选择。

愤怒的大鸟 发表于 2015-2-6 19:20:11

发问的时候一定要注意到某些礼节。因为Linux社区是一个松散的组织、也不承担回复每个帖子的义务。它不是技术支持。

分手快乐 发表于 2015-2-7 18:46:31

这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。

透明 发表于 2015-2-22 22:41:16

学习Linux应具备的。[书籍+网络资源]

精灵巫婆 发表于 2015-3-7 03:52:00

有疑问前,知识学习前,先用搜索。

只想知道 发表于 2015-3-14 08:33:50

随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。

因胸联盟 发表于 2015-3-21 00:55:09

对我们学习操作系统有很大的帮助,加深我们对OS的理解。?
页: [1]
查看完整版本: Linux制作之Bash编程易犯的毛病(二)仓酷云