$

$表示取结果。和变量名一起使用表示取变量的值,和()一起使用表示取命令群组的执行结果

[root@ccd-sdv5 ~]# tunset=123
[root@ccd-sdv5 ~]# echo $tunset
123

[root@ccd-sdv5 ~]# echo $(ls)
123 anaconda-ks.cfg Desktop Documents Downloads fenglin guest-images initial-setup-ks.cfg Music pcm-3.10.0_2e57057b_ee8fe63e_20180307-3.x86_64.rpm pcm-3.10.0_535872fd_c7d765c2_20180327-3.x86_64.rpm Pictures Public Templates tests vfio-pci.sh Videos workload
[root@ccd-sdv5 ~]# ls
123              Desktop    Downloads  guest-images          Music                                               pcm-3.10.0_535872fd_c7d765c2_20180327-3.x86_64.rpm  Public     tests        Videos
anaconda-ks.cfg  Documents  fenglin    initial-setup-ks.cfg  pcm-3.10.0_2e57057b_ee8fe63e_20180307-3.x86_64.rpm  Pictures                                            Templates  vfio-pci.sh  workload
[root@ccd-sdv5 ~]#

()

{ }

.

	[root@ccd-sdv5 ~]#cat shell.sh;./shell.sh 
	#!/bin/bash
	
	line="123 25 36532 454"
	{
	    line="wwww"
	    echo "$line"
	}
	echo "$line"
	
	
	wwww
	wwww

.

[root@ccd-sdv5 ~]#file=/opt/ros/jade/include/image_view/ImageViewConfig.h 
#匹配+删除
[root@ccd-sdv5 ~]#echo ${file#*/}                #从左侧开始匹配符合模式最短部分,将其剔除,返回剩下的
 opt/ros/jade/include/image_view/ImageViewConfig.h
[root@ccd-sdv5 ~]#echo ${file#*/*/}
 ros/jade/include/image_view/ImageViewConfig.h
[root@ccd-sdv5 ~]#echo ${file##*/}            #从左侧开始匹配符合模式的最长部分,将其剔除,返回剩下的
 ImageViewConfig.h
[root@ccd-sdv5 ~]#echo ${file%/*}            #从右侧开始匹配符合模式的最短部分,将其剔除,返回剩下的             
 /opt/ros/jade/include/image_view
[root@ccd-sdv5 ~]#echo ${file%%/i*}        #从右侧开始匹配符合模式的最长部分,将其剔除,返回剩下的
 /opt/ros/jade

.

#按个数返回
[root@ccd-sdv5 ~]#echo ${file:0:4}           
 /opt
[root@ccd-sdv5 ~]#echo ${file:4:9}            #将第4个字符当作第1个,计数9个, 返回   
 /ros/jade

.

#匹配+替换
[root@ccd-sdv5 ~]#echo ${file/opt/root}    #将file中的第一个opt替换为root
 /root/ros/jade/include/image_view/ImageViewConfig.h
[root@ccd-sdv5 ~]#echo ${file//i/++}          #将file中的所有i都替换为++
 /opt/ros/jade/++nclude/++mage_v++ew/ImageV++ewConf++g.h

.

#根据变量状态操作,
[root@ccd-sdv5 ~]#echo ${file-fault}            #只要设定了,就返回file,否则返回fault                
  /opt/ros/jade/include/image_view/ImageViewConfig.h
[root@ccd-sdv5 ~]#echo ${file1-fault}
  fault
[root@ccd-sdv5 ~]#echo ${file:-fault}            #只要设定了且非空,就返回file,否则返回fault
  /opt/ros/jade/include/image_view/ImageViewConfig.h

[root@ccd-sdv5 ~]#echo ${file+fault}            #只要设定了,就返回fault
  fault
[root@ccd-sdv5 ~]#echo ${file:+fault}           #只要设定了且非空,就返回fault
  fault

[root@ccd-sdv5 ~]#echo ${file=fault}            #只要file没设定,就将fault赋值给file并返回
  /opt/ros/jade/include/image_view/ImageViewConfig.h
[root@ccd-sdv5 ~]#echo ${file1}

[root@ccd-sdv5 ~]#echo ${file1=fault}
  fault
[root@ccd-sdv5 ~]#echo ${file1}
  fault

[root@ccd-sdv5 ~]#echo ${file:=fault}           #只要file没设定或非空,就将fault赋值给file并返回
  /opt/ros/jade/include/image_view/ImageViewConfig.h

[root@ccd-sdv5 ~]#echo ${file?fault}             #只要file没设定,就将fault输出至STDERR
  /opt/ros/jade/include/image_view/ImageViewConfig.h
[root@ccd-sdv5 ~]#echo ${file:?fault}            #只要file没设定或为空,就将fault输出至STDERR

.

#统计字符数

[root@ccd-sdv5 ~]#echo ${file}
  /opt/ros/jade/include/image_view/ImageViewConfig.h
[root@ccd-sdv5 ~]#echo ${#file}
  50

(( ))

用作计算,shell支持十进制/十六进制/二进制的+ - * / % & += -= *= /= %= ++ – 等算术运算,以及 | ^ ! > >= < <= != 等逻辑运算。同样的效果也可以使用expr …来实现,但是expr是Linux的内置软件,并不是shell语言的关键字

[root@ccd-sdv5 ~]#echo $((1 + 2))
   3
[root@ccd-sdv5 ~]#echo $((0xf + 1))
   16
[root@ccd-sdv5 ~]#cal=132
[root@ccd-sdv5 ~]#echo $(($cal+1))
   133

[ ]

用作取数组元素,使用${arr[n]}访问数组编号为n的元素

[root@ccd-sdv5 ~]#arr=(0 1 2 var)
[root@ccd-sdv5 ~]#echo "${arr[0]}"
  0
[root@ccd-sdv5 ~]#echo "${arr[3]}"
  var

``

两个反单引号表示命令替换,和$()是等价的。个人觉得看着比$()清晰,但是如果多层嵌套的话可能需要转义,此时就没有$()看着易懂。在下面的嵌套结构中,我们本意是先执行cmd3,将执行结果传给cmd2,再将结果传给cmd1

cmd1 `cmd2 `cmd3``

但是其实被解析成了下面这个

cmd1 `cmd2`cmd3  

为了解决这个问题,我们需要使用转义字符,写成下面这个样子才能正确的传达我们的意思

cmd `cmd2 \`cmd3\``

但如果我们使用$(),就可以让代码更清晰

[root@ccd-sdv5 ~]#echo `echo`echo 12``   #被分解成了 echo `echo` echo 12``  
  echo 12

.

[root@ccd-sdv5 ~]#echo `echo \`echo 12\``    #这个才对
  12

.

[root@ccd-sdv5 ~]#echo $(echo $(echo 12))    #这个才对
  12

>  »

<

我们通常的操作就是文件,其实已经使用的输入重定向

2>

&&

&&前的命令执行成功了就继续执行后面的命令

||

  前的命令执行失败了就去执行后面的命令

;

不论;前的命令执行成功与否都去执行后面的命令

关键字

readonly

相当于C中的const,readonly将变量设为只读模式,任何针对他们的赋值都是错误的

[root@ccd-sdv5 ~]#readonly var=123
[root@ccd-sdv5 ~]#var=345
   bash: var: readonly variable

unset

删除变量

unset var_name 删除变量var_name
unset -v first middle last 删除其他变量
unset -f fcn 删除函数

[root@ccd-sdv5 ~]#tunset=123
[root@ccd-sdv5 ~]#echo $tunset
  123
[root@ccd-sdv5 ~]#unset tunset
[root@ccd-sdv5 ~]#echo $tunset

$

shift

用来截去来自列表的位置参数,从左侧开始,一旦执行shift,$1的初始值就会永远消失,取而代之的是$2的旧值,依次类推,$#的值也会依次减1 shift也可以带一个参数,表示一次截取的个数

[root@ccd-sdv5 ~]#cat shell.sh 
#!/bin/bash
echo "${1}"

shift

echo "${1}"
[root@ccd-sdv5 ~]#./*.sh 123 456
123
456

set

设置新的位置参数

[root@ccd-sdv5 ~]#set qq ww ee
[root@ccd-sdv5 ~]#echo "${1}"
  qq
[root@ccd-sdv5 ~]#echo "${0}"
  bash
[root@ccd-sdv5 ~]#echo "${2}"
  ww
[root@ccd-sdv5 ~]#echo "$#"
  3

export

添加变量到变量导出列表,即如果在shell中执行子shell,该变量将作为环境变量从而在子shell中变得可以使用。

[root@ccd-sdv5 ~]#cat shell.sh 
#!/bin/bash
echo "$NEWENV"

[root@ccd-sdv5 ~]#NEWENV=123
[root@ccd-sdv5 ~]#./shell.sh 

[root@ccd-sdv5 ~]#export NEWENV
[root@ccd-sdv5 ~]#./shell.sh 
  123

exit

提前结束标本

test

test 和[ ]既是一个linux缺省安装的软件命令,又是一个shell关键字。两者的功能都是一模一样的