系统相关
首页 > 系统相关> > bash shell 学习日记(7)特殊字符(六)之bash 中的三种括号

bash shell 学习日记(7)特殊字符(六)之bash 中的三种括号

作者:互联网

目录

1、圆括号

1.1 圆括号用途

2、大括号/花括号   brace

2.1大括号用途

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一、圆括号(parenthesis)

1.1 圆括号在bash shell中用途

   在bash shell中圆括号有两中用途,命令组和数组初始化。

   1)命令组:在括号中可以有多个命令,命令之间用分号(;)分隔,在括号中的命令列表是作为一个子shell来运行的,在括号中的变量对于脚本其余剩下的部分是不可用的。

    补充:变量具有一个可见和可用的范围,即子进程可以读取父进程创建的变量,父进程即脚本不可读取子进程中的变量以及在子进程中被修改的变量值(子进程结束后所有将还原)。

实例:

a=123
(echo "a=$a"; a=321; echo "a=$a" )  #子进程
a=123
a=321


echo "a=$a"       #父进程
a=123

注意:圆括号中变量像是局部变量    

   2)数组初始化(了解即可,数组虽不是bash强项但支持)

 

二、大括号

 2.1大括号用途

  1)大括号扩展(expansion):很多命令会对大括号中间内容进行扩展,例如大括号中用逗号分隔的文件列表可以把其扩展为多个文件。注意:大括号中不允许有空白,如果需要有空白/空格需要对其进行引用。

  实例:

  

 

 

  2)代码块(block of code):一组代码。它构建了一个匿名的函数,和标准函数不同,在其中声明的变量对脚本其他部分的来说是可见的。

 

实例(1)代码块与IO重定向 

脚本逻辑读取 /etc/fstab的前两行并打印出来

 

 

 1 #!/bin/bash
 2 #大括号代码块 和 IO重定向
 3 #从/etc/fstab中读行
 4 
 5 File=/etc/fstab
 6 
 7 {
 8 read line1
 9 read line2
10 } < $File
11 
12 echo "First line if $File is:"
13 echo "$line1"
14 echo
15 
16 echo "First line if $File is:"
17 echo "$line2"
18 
19 exit 0

 

     7--9行为代码块,其中read命令为接受标准输入/其它为文件描述符号输入,输入后read命令把数据放置到一个标准的变量中。脚本中/etc/fstab中第一行数据设了变量line1,第二行变量line2打印出来,把文件重定向给代码块,代码块中两个read即读两次。

    实例(2)脚本逻辑:给脚本传递一个rpm文件的文件名,脚本会获取这个rpm文件中的描述信息、文件列表,同时检查OS的rpm是否安装上.

    首先随意下载一个rpm包地址:http://mirrors.163.com/centos/7.9.2009/os/x86_64/Packages/zsh-html-5.0.2-34.el7_8.2.x86_64.rpm 1 #!/bin/bash 2 #06-02.sh

 3 
 4 #获得一个rpm文件的描述,文件列表,将检查是否已经安装
 5 #并将结果保存到一个文件中
 6 #此脚本通过一个代码块来实现
 7 
 8 SUCCESS=0  #成功退出代码
 9 E_NOARGS=65 #失败退出代码
10 
11 #判断是否给此脚本传递参数
12 if [ -z "$1" ]
13 then
14     echo "Usage: `basename S0` rpm-file "  #获取脚本名称
15 exit $E_NOARGS 16 fi 17 18 { 19 echo 20 echo "Archive Description:" 21 rpm -qpi $1 #rpm文件的描述 22 echo 23 echo "Archive Listing:" 24 rpm -qpl $1 #rpm中文件列表 25 echo 26 rpm -i --test $1 #检查rpm包是否可以安装 27 if [ "$?" -eq $SUCCESS ] 28 then 29 echo "$1 can be installed." 30 else 31 echo "$1 cannot be installed." 32 fi 33 echo 34 } > "$1.text" #将代码块的所有输出重定向到文件中 35 36 echo "Results of rpm test in file $1.test" 37 38 exit 0

  12----16行判断,执行脚本时是否给脚本传递了一个参数。其中 -z是字符串运算符号,检查后面给定的字符串的长度是否为0,如果为0返回true,$1传递给脚本的第一个变量。18---34代码块,把代码块重定向到文件中,$1传递给脚本的rpm文件的名称。

   代码块内容:21行查询$1(传递给脚本的rpm包文件名)信息,24行列出rpm包中信息,26行 --test预演安装并没真正安装,-i安装,27行-----33行对预演安装的判断。

    执行脚本: ./06-02.sh zsh-html-5.0.2-34.el7_8.2.x86_64.rpm

   Results of rpm test in file zsh-html-5.0.2-34.el7_8.2.x86_64.rpm.test (结果)

    3){ }\; 路径名    pathname 

    常在find命令中用,不是shell内置命令。分号(;)防止被shell解释。

实例:可理解为find搜索到的放到大括号中了

 find . -name "*.cfg" -exec cp {} /tmp \;

ls /tmp/*.cfg

 /tmp/anaconda-ks.cfg

 

 

 

  

 

    

 

标签:脚本,文件,shell,代码,echo,bash,rpm,特殊字符,大括号
来源: https://www.cnblogs.com/liu-gc/p/16366817.html