shell的各种括号和命.doc

上传人:ni****g 文档编号:542292530 上传时间:2023-02-09 格式:DOC 页数:8 大小:69.50KB
返回 下载 相关 举报
shell的各种括号和命.doc_第1页
第1页 / 共8页
shell的各种括号和命.doc_第2页
第2页 / 共8页
shell的各种括号和命.doc_第3页
第3页 / 共8页
shell的各种括号和命.doc_第4页
第4页 / 共8页
shell的各种括号和命.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《shell的各种括号和命.doc》由会员分享,可在线阅读,更多相关《shell的各种括号和命.doc(8页珍藏版)》请在金锄头文库上搜索。

1、shell里的小括号,大括号结构和有括号的变量,命令的用法 作者:未知 时间:2005-09-13 23:36 出处:Blog.ChinaU 责编:My FAQ 摘要:shell里的小括号,大括号结构和有括号的变量,命令的用法我一下子也想不起该起什么标题,就取了这样一个不太合适的标题。在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: PHP代码:1.$ 2.$(cmd) 3.()和 4.$var:-string,$var:+string,$var:=string,$var:?string 5.$(exp) 6.$(var%pattern),$(var%pa

2、ttern),$(var#pattern),$(var#pattern) 我一下子也想不起该起什么标题,就取了这样一个不太合适的标题。在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: PHP代码:1.$ 2.$(cmd) 3.()和 4.$var:-string,$var:+string,$var:=string,$var:?string 5.$(exp) 6.$(var%pattern),$(var%pattern),$(var#pattern),$(var#pattern) 现在分述如下:1.Shell中变量的原形:$大家常见的变量形式都是$var,如

3、 PHP代码:$ var=test $ echo $var test 但当你要显示变量值加随意的字符(我这里用AA)时,就会出错,如下: PHP代码:$ echo $varAA $ 这时应该用变量的原形:$,即是加一个大括号来限定变量名称的范围,如下 PHP代码:$ echo $AA testAA $ 以这个特性,我们可以很方便地写一个批量改后缀名的程序,我把它命名为mymv,程序如下: PHP代码:#!/bin/bash tail=$1 for filename in ls do mv $filename $filename.$tail done 程序需要提供一个后缀名,如c,表示改为后缀为

4、c的C程序文件,看下面的测试: PHP代码:$ ls a b c $ mymv c $ ls a.c b.c c.c $ 看样子程序运行的很好,但这是不完善的程序,有2个要注意的问题:A,目录下没有子目录,如果有一个目录,假设为dir,则也会被改为dir.c,这显然不是我们想要的,应该修正这个程序能识别目录。B,没有帮助对程序的参数进行处理,程序应该足够友好,在用户没有给定后缀名时应能处理,像上面的将直接给文件加上了一个点(.),这显然也不是我们想要的。因为我们的目的是说明$,这样已经足够了,因此这里不会再对上面的程序进行修正。2.命令替换$(cmd)命令替换$(cmd)和符号cmd(注意这不

5、是单引号,在美式键盘上,是ESC下面的那个键)有相同之处 PHP代码:$ ls a b c $ echo $(ls) a b c $ echo ls a b c 我们来分析一下命令echo $(ls),以便理解所谓命令替换是什么意思:shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令echo $(ls)中的$(ls)位置,即替换了$(ls),再执行echo命令。如下:echo $(ls)被替换成了echo a b c这里要注意的是$(cmd)中的命令的错误输出是不会被替换的,替换的只是标准输出: PHP代码:$ var=

6、$(cat d)#文件d在当前目录不存在 cat: d: 没有那个文件或目录 $ echo $var $#显然var变量的值是空的 3.一串的命令执行()和()和都是对一串的命令进行执行,但有所区别:A,()只是对一串命令重新开一个子shell进行执行B,对一串命令在当前shell执行C,()和都是把一串的命令放在括号里面,并且命令之间用;号隔开D,()最后一个命令可以不用分号E,最后一个命令要用分号F,的第一个命令和左括号之间必须要有一个空格G,()里的各命令不必和括号有空格H,()和中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令我们来看几个例子: PHP

7、代码:$ var=test $ (var=notest; echo $var)#变量var值为notest,此是在子shell中有效 notest $ echo $var#父shell中值仍为test test $ var=notest; echo $var;#注意左括号和var之间要有一个空格 notest $ echo $var#父shell中的var变量的值变为了notest notest $ var1=test1;var2=test2;echo $var1a;echo $var2;#输出test1被重定向到文件a中, test2#而test2输出则仍输出到标准输出中。 $ cat a

8、test1 $ var1=test1;var2=test2;echo $var1;echo $var2;a#括号内命令的标准输出全部被重定向到文件a中 $ cat a test1 test2 4,几种特殊的替换结构:$,$,$,$A,$和$若变量var为空,则用在命令行中用string来替换$,否则变量var不为空时,则用变量var的值来替换$如: PHP代码:$ echo newvar $ echo $newvar:-a a $ echo newvar#变量newvar的值仍然是空,但上一命令行中$被替换成了a $ newvar=b $ echo $newvar:-a#变量newvar的值不

9、为空时,此命令行中的$被替换为$newvar,即b b $ 对于$的替换规则和$是一样的,所不同之处是$若var为空时,用string替换$的同时,把string赋给变量var:PHP代码:$ echo newvar $ echo $newvar:=a a $ echo newvar#变量newvar被赋值为a,同时$被替换成a a $ echo $newvar:=b#变量newvar不为空(其值已被赋为a),则$被替换为newvar的值(即b) a $ echo $newvar a $很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。如设置默认的编辑器: PHP代码:e

10、cho You use editor: $EDITOR:=/bin/vi B,$的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的) PHP代码:$ echo $newvar a $ echo $newvar:+b b $ echo $newvar a $ newvar= $ echo $newvar:+b $ C,$替换规则为:若变量var不为空,则用变量var的值来替换$;若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检

11、查是否设置了变量的值。 PHP代码:$ newvar= $ echo $newvar:?没有设置newvar的值 bash: newvar: 没有设置newvar的值 $ newvar=a $ echo $newvar:?没有设置newvar的值 a $ 补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。 PHP代码:$ echo $var:-date 日 3月 6 02:10:39 CST 2005 $ echo $var:-$(date) 日 3月 6 02:11:46 CST 2005 $ a=test $ echo $var:-$a t

12、est $ 5.POSIX标准的扩展计算:$(exp)这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$(exp),甚至是三目运算符。注意:这种扩展计算是整数型的计算,不支持浮点型.若是逻辑判断,表达式exp为真则为1,假则为0。 PHP代码:$ echo $(3+2) 5 $ echo $(32) 1 $ echo $(253 ? 2:3) 3 $ echo $var $ echo $(var=2+3) 5 $ echo $var 5 $ echo $(var+) 5 $ echo $var 6 $ 好了,上面的例子足够了,这也表明了这种扩展运算是很强大的。6.四种模式匹配替

13、换结构:$,$,$,$这四种结构的意义是:$和$表示从最右边(即结尾)匹配的,$和$从最左边(即开头)匹配的。其中$和$是最短匹配,$和$是最长匹配。只有在pattern中使用了通配符才能有最长最短的匹配,否则没有最长最短匹配之分。结构中的pattern支持通配符,*表示零个或多个任意字符,?表示零个或一个任意字符,.表示匹配中括号里面的字符,!.表示不匹配中括号里面的字符。 PHP代码:$ var=aabbbccbbdbb $ echo $var%b aabbbccbbdb $ echo $var%b aabbbccbbdb $ echo $var#a abbbccbbdbb $ echo $var#a abbbccbbdbb $ echo $var%*b aabbbccbbdb $ echo $var%*b $ echo $var#a* abbbccbbdbb $ echo $var#a* $ 上面是简单的例举四种模式匹配替换结构的用法

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号