【转】shell 大括号、圆括号的使用

在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下:

PHP 代码:
1.${var} 
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}
大家常见的变量形式都是$var,如

PHP 代码:
$ var=test 
$ echo $var 
test  

但当你要显示变量值加随意的字符(我这里用AA)时,就会出错,如下:

PHP 代码:
$ echo $varAA 

 

这时应该用变量的原形:${var},即是加一个大括号来限定变量名称的范围,如下

PHP 代码:
$ echo ${var}AA 
testAA 
 

以这个特性,我们可以很方便地写一个批量改后缀名的程序,我把它命名为mymv,程序如下:

PHP 代码:
#!/bin/bash 

tail=$1 
for filename in `ls` 
do 
mv $filename ${filename}.$tail 
done  

程序需要提供一个后缀名,如c,表示改为后缀为c的C程序文件,看下面的测试:

PHP 代码:
ls 
a b c 
mymv c 
ls 
a
.c b.c c.c 
 

看样子程序运行的很好,但这是不完善的程序,有2个要注意的问题:
A,目录下没有子目录,如果有一个目录,假设为dir,则也会被改为dir.c,这显然不是我们想要的,应该修正这个程序能识别目录。
B,没有帮助对程序的参数进行处理,程序应该足够友好,在用户没有给定后缀名时应能处理,像上面的将直接给文件加上了一个点(.),这显然也不是我们想要的。

因为我们的目的是说明${var},这样已经足够了,因此这里不会再对上面的程序进行修正。

2.命令替换$(cmd)
命令替换$(cmd)和符号`cmd`(注意这不是单引号,在美式键盘上,`是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=$(cat d)     ###文件d在当前目录不存在 
catd没有那个文件或目录 
$ echo $var 

$       ###显然var变量的值是空的  

3.一串的命令执行()和{}
()和{}都是对一串的命令进行执行,但有所区别:
A,()只是对一串命令重新开一个子shell进行执行
B,{}对一串命令在当前shell执行
C,()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
D,()最后一个命令可以不用分号
E,{}最后一个命令要用分号
F,{}的第一个命令和左括号之间必须要有一个空格
G,()里的各命令不必和括号有空格
H,()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

我们来看几个例子:

PHP 代码:
$ 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 $var1>a;echo $var2;}    ###输出test1被重定向到文件a中, 
test2                ###而test2输出则仍输出到标准输出中。 
cat a 
test1 
$ { var1=test1;var2=test2;echo $var1;echo $var2;}>a             ###括号内命令的标准输出全部被重定向到文件a中 
cat a 
test1 
test2  

4,几种特殊的替换结构:${var:-string},${var:+string},${var:=string},${var:?string}
A,${var:-string}和${var:=string}
若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string}
如:

PHP 代码:
$ echo newvar 

$ echo ${newvar:-a} 
a 
$ echo newvar             ###变量newvar的值仍然是空,但上一命令行中${newvar:-a}被替换成了a 

newvar=b 
$ echo ${newvar:-a}       ###变量newvar的值不为空时,此命令行中的${newvar:-b}被替换为$newvar,即b 
b 
 

对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var:

PHP 代码:
$ echo newvar 

$ echo ${newvar:=a} 
a 
$ echo newvar           ###变量newvar被赋值为a,同时${newvar:=a}被替换成a 
a 
$ echo ${newvar:=b}     ###变量newvar不为空(其值已被赋为a),则${newvar:=b}被替换为newvar的值(即b) 
a 
$ echo $newvar 
 

${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。
如设置默认的编辑器:

PHP 代码:
echo You use editor: ${EDITOR:=/bin/vi 

B,${var:+string}
${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)

PHP 代码:
$ echo $newvar 
a 
$ echo ${newvar:+b} 
b 
$ echo $newvar 
a 
newvar= 
$ echo ${
newvar:+b} 

 

C,${var:?string}
替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。

PHP 代码:
newvar= 
$ echo ${
newvar:?没有设置newvar的值} 
bashnewvar没有设置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} 
test 
 

5.POSIX标准的扩展计算:$((exp))
这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$((exp)),甚至是三目运算符。
注意:这种扩展计算是整数型的计算,不支持浮点型.若是逻辑判断,表达式exp为真则为1,假则为0。

PHP 代码:
$ echo $((3+2)) 
5 
$ echo $((3>2)) 
1 
$ echo $((25<2:3)) 
3 
$ echo $var 

$ echo $((var=2+3)) 
5 
$ echo $var 
5 
$ echo $((var++)) 
5 
$ echo $var 
6 
 

好了,上面的例子足够了,这也表明了这种扩展运算是很强大的。

6.四种模式匹配替换结构:${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
这四种结构的意义是:${var%pattern}和${var%%pattern}表示从最右边(即结尾)匹配的,${var#pattern} 和${var##pattern}从最左边(即开头)匹配的。其中${var%pattern}和${var#pattern}是最短匹 配,${var%%pattern}和${var##pattern}是最长匹配。只有在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*} 

 

上面是简单的例举四种模式匹配替换结构的用法。

转载于:https://www.cnblogs.com/DonkeyTomy/articles/2593667.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css clear属性_CSS中的clear属性

css clear属性CSS | 清除财产 (CSS | clear Property) We know so much about float property and how it is used for styling our web pages. If you do not remember the float property, lets help jog your memory. The float property is used to set the elements in a …

linux find prune排除某目录或文件

http://blog.csdn.net/ysdaniel/article/details/7995681 查找cache目录下不是html的文件 find ./cache ! -name *.html -type f列出当前目录下的目录名,排除includes目录,后面的-print不能少 find . -path ./includes -prune -o -type d -maxdepth 1 -print排除多个目录,”(“…

嵌入式指针embedded pointer的概念以及用法

目录前言概念用法参考前言 在针对一个class写出它的内存管理池以及总结出allocator类(三个版本)中内存管理池的第二个版本中涉及到了一个非常重要的概念&#xff1a;嵌入式指针。同时嵌入式指针也在G2.9版本的alloc中出现。现在整理一下网上的一些用法和概念 概念 嵌入式指针…

CLI配置和编址

实施基本编址方案&#xff1a; 在设计新网络或规划现有网络时&#xff0c;至少要绘制一幅指示物理连接的拓扑图&#xff0c;以及一张列出以下信息的地址表&#xff1a; l 设备名称 l 设计中用到的接口 l IP 地址和子网掩码 l 终端设备&#xff08;如 PC&#xff09;的默…

sql语句中的in用法示例_PHP中的循环语句和示例

sql语句中的in用法示例循环 (Loops) Imagine that we need a program that says "hello world" 100 times. Its quite stressful and boring to write the statement -- echo "hello world" — 100 times in PHP. This is where loop statement facilitate…

love2d教程30--文件系统

在游戏里少不了文件操作&#xff0c;在love2d里我们可以直接用lua自带的io函数&#xff0c;如果不熟悉可以先读一下我的lua文件读写。 相对lua&#xff0c;love2d提供了更多的函数&#xff0c; 方便我们操作文件。不过可能处于安全考虑&#xff0c;love2d只允许我们访问两个目录…

std::alloc具体细节

G2.9 std::alloc的缺点&#xff1a; 1、在alloc::deallocate中没有将拿到的内存资源还给操作系统&#xff0c;在多任务中将占用很大资源 2、alloc::deallocate函数没有检查传入的p指针的有效性。在这里它默认p为alloc::allocate取得。 如果p并非alloc::allocate取得&#xf…

修改函数的返回地址

这篇随笔源自今天看的这篇文章http://www.cnblogs.com/bluesea147/archive/2012/05/19/2508208.html 1. 如何修改函数返回地址 今天主要写测试程序思考和验证了一下这个问题&#xff0c;先看一下这个&#xff23;程序 1 #include <stdio.h>2 void foo(){3 int a,…

调试JavaScript代码

JavaScript调试代码 (JavaScript debugging the code) Debugging is the process of finding mistakes or bugs in the program. There are several ways one can debug their JavaScript code. This article will walk you through the strict mode in JavaScript and excepti…

Delphi运算符及优先级

单目运算符 (最高优先级) 取变量或函数的地址(返回一个指针) not 逻辑取反或按位取反 乘除及按位运算符 * 相乘或集合交集 / 浮点相除 div 整数相除 mod 取模 (整数相除的余数) as 程序运行阶段类型转换 (RTTI运算符) and 逻辑或按位求和 shl 按位左移 shr 按位右移 加减运算符…

NotifyMyFrontEnd 函数背后的数据缓冲区(二)

message level 函数pq_putmessage调用 low level 函数 pq_putbytes,pq_putbytes调用 internal_putbytes。 从internal_putbyes上来看&#xff0c;就可以发现其数据发送的机制:有一个小技巧&#xff0c;如果数据缓冲区满了&#xff0c;就发送&#xff0c;否则就先堆在那儿。如果…

从源码角度剖析VC6下的内存分配与切割的运作

目录前言1、heap初始化2、第一次分配内存&#xff0c;计算真正区块大小3、new_region管理中心4、__sbh_alloc_new_group()切割第一次分配好的内存5、开始切割内存前言 malloc与free带来的内存管理是应付小区块的&#xff0c;即SBH(small block heap)&#xff0c;这点也可以从源…

windows常见命令整理(持续更新)

windows常见命令整理 1. 文件1.1. 实时显示文件 logfile.txt 中新添加的内容&#xff08;类似于linux tail -f&#xff09; 2. 网络2.1. netstat 3. 进程和任务3.1. tasklist &#xff08;用于列出当前运行的进程及其详细信息&#xff09;3.2. wmic &#xff08;用于执行各种系…

最长公共子序列求序列模板提_最长公共子序列

最长公共子序列求序列模板提Description: 描述&#xff1a; This question has been featured in interview rounds of Amazon, MakeMyTrip, VMWare etc. 这个问题在亚马逊&#xff0c;MakeMyTrip&#xff0c;VMWare等访谈轮次中都有介绍。 Problem statement: 问题陈述&…

洛必达法则使用条件

使用条件 1、分子分母同趋向于0或无穷大 。 2、分子分母在限定的区域内是否分别可导。 3、当两个条件都满足时&#xff0c;再求导并判断求导之后的极限是否存在&#xff1a;若存在&#xff0c;直接得到答案&#xff1b;若不存在&#xff0c;则说明此种未定式无法用洛必达法则解…

求根号m(巴比伦算法)

巴比伦算法是针对求根号m的近似值情况的&#xff0c;它的思想是这样的&#xff1a; 设根号mX0,则如果枚举有答案X(X<X0)&#xff0c;则m/X>X0,当精度要求不高的时候&#xff0c;我们可以看成Xm/XX0,而如果精度要求比较高&#xff0c;我们只需取X和m/X的平均值作为新的枚举…

Android面试题

http://blog.csdn.net/aomandeshangxiao/article/category/841452 http://www.cppblog.com/life02/category/18316.html转载于:https://www.cnblogs.com/DonkeyTomy/articles/2598673.html

r语言 分类变量 虚拟变量_R语言中的变量

r语言 分类变量 虚拟变量R语言| 变数 (R Language | Variables) In the previous tutorial, we have come across the basic information that stands as a pavement for understanding the R language in depth. Now moving future let us educate ourselves about the concep…

算法题复习(快排、链表、二分、哈希、双指针)

目录1、快速排序复习2、链表部分复习203. 移除链表元素707. 设计链表206. 反转链表142.环形链表 II3、二分法复习4、哈希法复习5、双指针复习**15. 三数之和****18. 四数之和****27. 移除元素****344. 反转字符串**,简单&#xff0c;双指针从两侧往中间靠拢&#xff0c;并随时s…

Cassandra1.2文档学习(7)—— 规划集群部署

数据参考&#xff1a;http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/architecturePlanningAbout_c.html 当规划一个Cassandra集群部署时&#xff0c;关于你初始存储的数据的数据量你应当有一个好的想法&#xff0c;并且对于…