shell中的特殊符号之-(){}[]及其扩展

一. $()与` `

bash中$()和``用来做命令执行
尽量用$()看起来更直观,但是不是每一种bash都能使用
``在嵌套的时候加转义符,如`\\\`,$()嵌套不用加转义符

command1 `command2 \`command3\` `
command1 $(command2 $(command3))

## 二. ${} ### 2.1 变量 变量替换一般$var和${var}一样,但是${ }能更精确的界定名称的范围,比如:
echo $AB
echo ${A}B

2.2 删除字符串

是去掉左边,%是去掉,一个是最小匹配,两个是最大匹配;

去掉左边用/,去掉右边用/,即*在去掉的那个方向上
比如定义了一个变量:file=/dir1/dir2/dir3/my.file.txt

${file#*/}			#拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}			#拿掉最后一条 / 及其左边的字符串:my.file.txt
${file%/*}			#拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}			#拿掉第一条 / 及其右边的字符串:(空值)

2.3 字符串替换

${file/dir/path}	#将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}	#将全部 dir 提换为 path:/path1/path2/path3/my.file.txt

2.4 变量状态赋值

状态分为:unset,null和no-null三种
一般:与空有关,不带:的空不受影响,带:的空也受影响

${file-my.file.txt}		#假如 $file 没有设定,则使用 my.file.txt 作传回值。(空值及非空值时不作处理) 
${file:-my.file.txt} 	#假如 $file 没有设定或为空值,则使用 my.file.txt 作传回值。 (非空值时不作处理)
${file+my.file.txt} 	#假如 $file 设为空值或非空值,均使用 my.file.txt 作传回值。(没设定时不作处理)
${file:+my.file.txt}	#若 $file 为非空值,则使用 my.file.txt 作传回值。 (没设定及空值时不作处理)
${file=my.file.txt} 	#若 $file 没设定,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。 (空值及非空值时不作处理)
${file:=my.file.txt}	#若 $file 没设定或为空值,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。 (非空值时不作处理)
${file?my.file.txt} 	#若 $file 没设定,则将 my.file.txt 输出至 STDERR。 (空值及非空值时不作处理)
${file:?my.file.txt}	#若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (非空值时不作处理)

2.5 计算出变量值的长度

${#file}可以得到27

3.6 ${}与数组

A="a b c def" #定义字符串
A=(a b c def) #定义数组

数组规则如下:

  1. ${A[@]} 或 ${A[*]} 可得到 a b c def (全部组数)
  2. ${A[0]} 可得到 a (第一个组数),${A[1]} 则为第二个组数…
  3. ${#A[@]} 或 ${#A[*]} 可得到 4 (全部组数数量)
  4. ${#A[0]} 可得到 1 (即第一个组数(a)的长度),${#A[3]} 可得到 3 (第四个组数(def)的长度)
  5. A[3]=xyz 则是将第四个组数重新定义为 xyz …

## 四. $(( )) $(( ))整数运算符号:
运算符 功能
+ - * / 加、减、乘、除
% 余数
& ^ !

在计算时,可以在变量上加${},也可以不用,如下:

a=5; b=7; c=2
echo $(( a+b*c )) 		#按照运算法则计算的
echo $(( (a+b)/c ))
echo $(( (a*b)%c))
echo $(( $a + $b * $c))

可以计算不同进制,但是输出都为十进制

echo $((16#2a))
umask 022
echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc #八进制,计算新建文件夹的权限

### 五. (()) 重定义变量,或者用作testing 比如:
a=5; 		#((a++)) 可将 $a 重定义为 6 
a=5; 		#((a–)) 则为 a=4
a=5; b=7; 	#((a < b)) 会得到   0 (true) 的返回值。

常用的测试符号:

<		#小于
>       #大于
<=		#小于或等于
>=      #大于或等于
==		#等于
!=		#不等于

### 六. ()命令组

(( ))
http://blog.csdn.net/taiyang1987912/article/details/39551385
http://www.2cto.com/os/201308/236977.html
http://zhidao.baidu.com/link?url=lVUQUbYvjSkamUu330SjzopReY2VbiIs3nBBvvSnemMB65TAc5Oxqv-JvMmiR_ffS1e6ebYJejtrb4N5QPgVNa

posted @ 2016-08-13 11:35  zhangshihai1232  阅读(625)  评论(0)    收藏  举报