shell中的${}

1.Shell中变量的原形:${var}

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

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

[root@bogon sh]# aa='ajax'
[root@bogon sh]# echo $aa
ajax
[root@bogon sh]# echo $aa_AA

[root@bogon sh]# echo ${aa}_AA
ajax_AA

2.$(cmd)

echo $(ls) 执行过程 shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出, 再将此输出放到原来命令 echo $(ls)中的 $(ls)位置,即替换了$(ls),再执行echo命令 如下: echo $(ls)被替换成了echo 1.txt 2.txt 这里要注意的是$(cmd)中的命令的错误输出是不会被替换的,替换的只是标准输出

[root@bogon t]# ls
1.txt  2.txt
[root@bogon t]# echo $(ls)
1.txt 2.txt

[root@bogon t]# var=$(cat 3.txt)
cat: 3.txt: 没有那个文件或目录
[root@bogon t]# echo $var

$var显然是空的

3. 一串的命令执行()和{}

()和{}都是对一串的命令进行执行,但有所区别:
相同点
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
不同点
()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行

[root@bogon t]# var=test
[root@bogon t]# echo $var
test
[root@bogon t]# (var=notest;echo $var)
notest
[root@bogon t]# echo $var
test
[root@bogon t]# { var=notest;echo $var;}
notest
[root@bogon t]# echo $var
notest
[root@bogon t]#


()最后一个命令可以不用分号,{}最后一个命令要用分号
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

[root@bogon t]# { var1=test1;var2=test2;echo $var1>a;echo $var2;}
test2
[root@bogon t]# cat a
test1
[root@bogon t]# { var1=test1;var2=test2;echo $var1;echo $var2;}>a
[root@bogon t]# cat a
test1
test2

4.几种特殊的替换结构:

${var:-string},${var:+string},${var:=string},${var:?string}

(1) ${var:-string} 和 ${var:=string}

若变量var为空或者未定义,则用在命令行中用string来替换${var:-string}
否则变量var不为空时,则用变量var的值来替换${var:-string}

root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:-bcc}
bcc
[root@bogon ~]# echo $a

[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:-bcc}
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:=bbc}
bbc
[root@bogon ~]# echo $a
bbc

比较 后者发现$var为空时,把string赋值给了var
后者是一种赋值默认值的常见做法

(2) ${var:+string}

规则和上面的完全相反
即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量var的值,即空值

[root@bogon ~]# a=ajax
[root@bogon ~]# echo $a
ajax
[root@bogon ~]# echo ${a:+bbc}
bbc
[root@bogon ~]# echo $a
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:+bbc}

[root@bogon ~]# 

(3) ${var:?string}

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

[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:?bbc}
-bash: a: bbc
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:?bbc}
ajax
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:-`date`}
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo ${a:-`date`}
2017年 02月 21日 星期二 10:13:46 CST
[root@bogon ~]# echo ${a:-$(date)}
2017年 02月 21日 星期二 10:13:59 CST
[root@bogon ~]# b=bbc
[root@bogon ~]# echo ${a:-$b}
bbc

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

[root@bogon ~]# echo $(3+2)
-bash: 3+2: 未找到命令

[root@bogon ~]# echo $((3+2))
5
[root@bogon ~]# echo $((3.5+2))
-bash: 3.5+2: 语法错误: 无效的算术运算符 (错误符号是 ".5+2")
[root@bogon ~]# echo $((3>2))
1
[root@bogon ~]# echo $((3>2?'a':'b'))
-bash: 3>2?'a':'b': 语法错误: 期待操作数 (错误符号是 "'a':'b'")
[root@bogon ~]# echo $((3>2?a:b))
0
[root@bogon ~]# echo $((a=3+2))
5
[root@bogon ~]# echo $((a++))
5
[root@bogon ~]# echo $a
6

6.四种模式匹配替换结构:

${var%pattern},${var%%pattern} 从右边开始匹配
${var#pattern},${var##pattern} 从左边开始匹配
${var%pattern} ,${var#pattern} 表示最短匹配,匹配到就停止,非贪婪
${var%%pattern},${var##pattern} 是最长匹配

结构中的pattern支持通配符
* 表示零个或多个任意字符
?表示零个或一个任意字符
[...]表示匹配中括号里面的字符
[!...]表示不匹配中括号里面的字符

 

${#var} 可计算出变量值的长度:

${#file} 可得到 27 ,因为/dir1/dir2/dir3/my.file.txt 是27个字节

 

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值