|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果你让他去用linux搭建一个web服务器,做一个linux网关,他就什么都不会了.他们把时间都浪费在了版本的转换上了.
13.catfile|seds/foo/bar/>file
你不该该在一个管道中,从一个文件读的同时,再往不异的文件内里写,如许的成果是未知的。
你能够为此创立一个一时文件,这类做法对照平安牢靠:- #seds/foo/bar/gfile>tmpfile&&mvtmpfilefile
复制代码 大概,假如你用得是GNUSed4.x以上的版本,可使用-i选项立即修正文件的内容:14.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: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平台上你如许实行会堕落:在这里,-c是用于指定login-class。假如你想要传送-csomecommand给shell,最幸亏之前显现地指定username:19.cd/foo;bar
假如你不反省cd命令实行是不是乐成,你能够会在毛病的目次下实行bar命令,这有大概会带来劫难,好比bar命令是rm-rf*。
你必需常常反省cd命令实行是不是有毛病,复杂的做法是:假如在cd命令后有多个命令,你能够选择如许写:堕落时,cd命令会呈报没法改动以后目次,同时将毛病动静输入到尺度毛病,比方"bash:cd:/foo:Nosuchfileordirectory"。假如你想要在尺度输入同时输入自界说的毛病提醒,可使用复合命令(commandgrouping):注重,在{号和echo之间必要有一个空格,同时}之前要加上分号。
特地提一下,假如你要在剧本里频仍改动以后目次,能够看看pushd/popd/dirs等命令,大概你在代码内里写的cd/pwd命令都是没有需要的。
说到这,对照下上面两种写法:上面的写法,在轮回中fork了一个子shell历程,子shell历程中的cd命令仅会影响以后shell的情况变量,以是父历程中的情况命令不会被改动;当实行到下一次轮回时,不管之前的cd命令有无实行乐成,我们会回到不异确当前目次。这类写法相较后面的用法,代码加倍洁净。
20.[bar=="$foo"]
准确的用法:21.foriin{1..10};do./something&;done
你不该该在&前面增加分号,删除它:大概改成多行的情势:&和分号一样也能够用作命令停止符,以是你不要将两个混用到一同。一样平常情形下,分号能够被换行符交换,可是不是一切的换行符都能够用分号交换。
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$msg3
复制代码 23.echo"HelloWorld!"
在交互式的Shell情况下,你实行以上命令会碰到上面的毛病:
虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命令行。 |
|