MENU

一些bash中的符号应用

March 20, 2019 • Linux

注意:参数可以是字符串、变量、一条命令的输出,当在${}中要使用命令时(用${变量:=参数}举例)格式指定为${变量名:=$(命令)}

Shell中变量的原形

       常见变量:                    $变量名

       显示变量并且增加任意字符       ${变量名}参数

       基于此可以写出一个很简单的批量增加后缀名的脚本


              #!/bin/bash

              tail=$1

              for filename in `ls`

              do

                      if [ -d $filename ];then

                              echo ${filename} is a folder,do nothing

                      else

                              mv $filename ${filename}.$tail

                      fi

              done

命令替换

       $(命令)

              例如:       echo $(ls)                      返回值:在当前目录下执行ls的值

                             echo $(echo $a)            返回值:执行echo $a的值


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

①    ()只是对一串命令重新开一个子shell进行执行

②    {}对一串命令在当前shell执行

③    ()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开

④    ()最后一个命令可以不用分号

⑤    {}最后一个命令要用分号

⑥    {}的第一个命令和左括号之间必须要有一个空格

⑦    ()里的各命令不必和括号有空

⑧    ()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令


       简单解释脚本:

              脚本Ⅰ           #!/bin/bash

                                    a=1;(a=2;echo $a);echo $a

              脚本Ⅰ:会先输出一个2,再输出一个1,因为()里的内容是在另外一个子shell里面执行的,所以并不会覆盖掉a=1


              脚本Ⅱ           #!/bin/bash

                                    a=1;(a=2;echo $a);{ a=5;};echo $a

              脚本Ⅱ:会先输出一个2,再输出一个5,因为{}里面的内容是在当前shell里面执行的,所以会覆盖掉a=1

特殊的替换结构

       ${变量:-参数}       

                     指定变量为空时会在当前命令中临时设置变量的值为指定参数的值

                     指定变量不为空时会在当前命令中临时设置指定参数的值为指定变量的值

                            举例echo ${a:-$b}              //设b的值为123456

                            若a的值为空,则在这条echo命令执行时临时设置a的值为123456,a的值还是为空

                            若a的值不为空(设a的值为abcdef),则在这条echo命令执行时临时设置b的值为abcdef,b的值还是为123456


       ${变量:=参数}      

                     指定变量为空时会在当前命令中临时设置变量的值为指定参数的值,并且把参数的值赋给指定变量

                     指定变量不为空时会在当前命令中临时设置指定参数的值为指定变量的值

                            举例echo ${a:=$b}              //设b的值为123456

                            若a的值为空,则在这条echo命令执行时临时设置a的值为123456,并且赋给变量a值123456

                            若a的值不为空(设a的值为abcdef),则在这条echo命令执行时临时设置b的值为abcdef,b的值还是为123456


       ${变量:+参数}

                     指定变量为空时会在当前命令中不会替换指定变量的值

                     指定变量不为空时会在当前命令中临时设置指定变量的值为指定参数的值

                            举例echo ${a:+$b}              //设b的值为123456

                            若a的值为空,则不做任何替换,a的值还是为空

                            若a的值不为空(设a的值为abcdef),则在这条echo命令执行时临时设置a的值为123456,a的值还是为abcdef


       ${变量:?参数}

                     指定变量为空时会将指定参数的值输出到标准错误并从脚本中退出

                     指定变量不为空时会在当前命令中临时设置指定参数的值为指定变量的值

                            举例echo ${a:?$b}       //设b的值为123456

                            若a的值为空,输出一个值为123456的标准错误

                            若a的值不为空(设a的值为abcdef),则在这条echo命令执行时临时设置b的值为abcdef,b的值还是为123456

POSIX标准的扩展计算

       $((运算))

              符合C语言的运算

       举例(设置变量a的值为2,变量b的值为3)

              echo $((a+b))        输出5

              echo $((a>b))        不正确,输出0

              echo $((a<b))        正确,输出1

              echo $((c=a+b))           输出5,变量c被赋给值5

              echo $((a++))        输出3,变量a的值被加1

              echo $((c=a+b++))       输出5,变量c被赋予值5,并且变量b的值被加1

大括号应用

       ${变量名%分界符号*}    获取指定变量名内以分界符号为分界在分界符号之前的内容(最短匹配,会匹配第一个分界符号之前的内容)

       ${变量名%%分界符号*}  获取指定变量名内以分界符号为分界在分界符号之前的内容(最长匹配,会匹配最后一个分界符号之前的内容)

       ${变量名#*分界符号}   获取指定变量名内以分界符号为分界在分界符号之后的内容(最短匹配,会匹配第一个分界符号之后的内容)

       ${变量名##*分界符号} 获取指定变量名内以分界符号为分界在分界符号之后的内容(最长匹配,会匹配最后一个分界符号之后的内容)


${parameter/pattern/string}


<(命令)和>(命令)

       进程代入,可以把命令的执行结果当成文件一样读入,和管道差不多,但是支持多个输入。

       比如comm前一般需要sort,那就可以这样comm <(sort 1.lst) <(sort 2.lst) 或者 paste <(cut -t2 file1) <(cut -t1 file1)

       举例:grep mk <(ls)     //跟ls | grep mk显示同样的结果


$(命令)

       执行执行命令的结果

       举例:$(cat test)   //假设test的文本内容为ls,那么$(cat test)则会执行ls


最后编辑于: March 28, 2019
Archives QR Code Tip
QR Code for this page
Tipping QR Code