查看原文
其他

Shell基础(11)-关于shell语句中小括号()和大括号{}的作用

Cloud研习社 Cloud研习社 2023-06-06


每周二、四、六定期更新!


我们把上一节实例4的命令写到脚本里:
[root@studyclub script]# cat kuohaotest.sh
#!/bin/bash
IP=10.0.0.131
ping -c1 -W1 $IP &> /dev/null && echo "$IP can reached" || (echo "$IP is unreachable";exit 1)
echo 'finished'

[root@studyclub script]# bash -n kuohaotest.sh # 检查一下有没有语法错误
[root@studyclub script]# bash kuohaotest.sh
10.0.0.131 is unreachable
finished


上面的执行结果是:10.0.0.131这个地址不通,提示了unreachable,接着应该是exit退出啊,怎么exit后面的echo 'finished'语句也执行了呢?这就是小括号“()”的问题了。系统会把小括号内的内容作为一个整体,为这个整体单独开拓一个新的bash来执行,所以上例中exit 1实际上是退出的为它新开辟的bash进程,我们来验证一下:
# 修改一下上面的脚本,便于观察进程情况
[root@studyclub script]# cat kuohaotest.sh
#!/bin/bash
IP=10.0.0.131
echo "the current process: $BASHPID"
ping -c1 -W1 $IP &> /dev/null && echo "$IP can reached" || (echo "$IP is unreachable";echo "the child process: $BASHPID";sleep 100;exit 1)
echo 'finished'

# 执行一下
[root@studyclub script]# sh kuohaotest.sh
the current process: 11799
10.0.0.131 is unreachable
the child process: 11801


脚本执行后,小括号里的打印语句显示PID的值和外面的PID值不一样,我们来看看这两个pid进程的关系:
[root@studyclub script]# pstree -p
           ├─sshd(6758)─┬─sshd(10993)───bash(10995)───sh(11799)───sh(11801)───sleep(11802)


看到了吧,11801是11799的子进程,系统确实为括号里的命令单独开辟了一个bash进程,那么括号里的exit语句也就是仅能够退出系统为小括号开辟的这个子进程(PID为11801),并不能退出进程号为11799的父进程。
我们再来看看大括号{}
把上面的测试脚本的里的小括号改成大括号:

[root@studyclub script]# cat kuohaotest.sh
#!/bin/bash
IP=10.0.0.131
echo "the current process: $$"
ping -c1 -W1 $IP  &> /dev/null && echo "$IP can reached" || { echo "$IP is unreachable";echo "the child process: $BASHPID";sleep 100;exit 1; }
echo 'finished'


执行一下:
[root@studyclub script]# bash kuohaotest.sh 
the current process: 11896
10.0.0.131 is unreachable
the child process: 11896          # 大括号里的显示语句和第三行的显示语句查看到的PID的值相同,说明没有另外开启子shell


好了,看完了例子讲解,我们小结一下小括号()和大括号{}的区别:

  • () 执行一串命令时,需要重新开启一个子 Shell 来执行。
  • {} 执行一串命令时,在当前 Shell 中执行。
  • () 和 {} 都是把一串命令放括号里面,并且命令之间用";"隔开。
  • () 最后一条命令可以不用分号。(注意看我们的例子)
  • {} 最后一条命令要用分号。(注意看我们的例子)
  • {} 的第一条命令和左括号之间必须有一个空格。(注意看我们的例子)
  • () 里的各命令不必和括号有空格。
  • () 和 {} 中括号里面的某条命令的重定向只影响该命令,但括号外的重定向则会影响到括号里的所有命令。

课后实践练习:

  • 判断一个文件是不是普通文件且是以.sh结尾的文件,如果是,那么给这个文件加上可执行权限。
  • 编写脚本argspos.sh:传入一个文件路径作为参数,如果参数小于1,则提示用户“至少给一个参数”,如果有一个参数,则显示这个文件的内容。
  • 编写脚本ipping.sh:以IP地址作为参数,测试是否可以连通,如果能ping通,则提示用户该主机已存在,如果不能ping通,提示用户该主机不可访问。
  • 编写脚本ckdisk.sh:检查磁盘分区空间和inode使用率,如果超过70%,就显示告警信息,提示用户空间即将用完。

手应知:

    尝鲜Rocky Linux

《Linux基础及进阶》:

    054 - Shell基础(6)-set命令实现脚本安全    055 - Shell基础(7)-算术运算   056 - Shell基础(8)-算术运算、条件判断1   057 - Shell基础(9)-条件判断2   058 - Shell基础(10)-条件判断3


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存