博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell | {}和()
阅读量:6358 次
发布时间:2019-06-23

本文共 2900 字,大约阅读时间需要 9 分钟。

执行

bash -n xx.sh用于检测脚本语法是否有错误

bash -x xx.sh用于追踪执行

${var}

用于限定变量名称的范围,并且支持通配符

$(cmd)

shell会先执行括号的cmd,然后将结果作为变量进行替换,替换只能替换标准输出,错误输出不能替换。

一串命令的()和{}

  • ()是重新开一个子shell然后执行,而{}则是在当前shell里执行。
  • ()最后一个命令可以不用分号,{}最后一个命令要用分号。
  • ()里第一个命令和左边括号不必有空格,而{}第一个命令和左括号之间必须有一个空格。
  • (){}里的某个命令的重定向只影响该命令, 而括号外的重定向则影响到括号里的所有命令。
root@guo:~/initramfs# var=testroot@guo:~/initramfs# echo varvarroot@guo:~/initramfs# echo $vartestroot@guo:~/initramfs# (var=notest;echo $var)notestroot@guo:~/initramfs# {var=notest;echo $var}{var=notest: command not foundtest}root@guo:~/initramfs# {var=notest;echo $var;}-su: syntax error near unexpected token `}'root@guo:~/initramfs# { var=notest;echo $var;}notestroot@guo:~/initramfs# echo $varnotest

从上线可以看出,{}修改了变量的值。表明在当前shell中运行的。

root@guo:~/initramfs# var=testroot@guo:~/initramfs# echo $vartestroot@guo:~/initramfs# (var=notest;echo $var)notestroot@guo:~/initramfs# echo $vartest

从上面可以看出()里的执行完毕后没有改变变量的值,说明在子shell中执行的。

特殊替换

${var:-string} 和 ${var:=string}

当变量var为空或未定义时,则在命令行中用string替换:${var:-string}

若var不为空时,则用变量var的值,而不进行替换。

root@guo:~/initramfs/bin# echo $aroot@guo:~/initramfs/bin# echo ${a:-bcc}bccroot@guo:~/initramfs/bin# echo $aroot@guo:~/initramfs/bin# a=testroot@guo:~/initramfs/bin# echo ${a:-bcc}testroot@guo:~/initramfs/bin# unset aroot@guo:~/initramfs/bin# echo $aroot@guo:~/initramfs/bin# echo ${a:=bcc}bccroot@guo:~/initramfs/bin# echo $abcc

${var:=string}则是当变量var为空时,则将string赋值给var。

${var:+string}

当var不为空时才替换成string,若var为空,则不替换或替换成var的值,即空

root@guo:~/initramfs/bin# a=testroot@guo:~/initramfs/bin# echo $atestroot@guo:~/initramfs/bin# echo ${a:+bcd}bcdroot@guo:~/initramfs/bin# echo $atestroot@guo:~/initramfs/bin# unset aroot@guo:~/initramfs/bin# echo $aroot@guo:~/initramfs/bin# echo ${a:+bcd}

${var:?string}

当var不为空时,则用var的值来替换,而当var为空时,则把string输出到STDERR中,并退出脚本。一般用此来检测是否设置了变量的值

root@guo:~/initramfs/bin# echo $aroot@guo:~/initramfs/bin# echo ${a:?bcd}-su: a: bcdroot@guo:~/initramfs/bin# a=testroot@guo:~/initramfs/bin# echo ${a:?bcd}test

$((exp))

符合C语言的运算符都在里面进行计算。包括三目运算符,不支持浮点型和字符串,只支持整型计算

root@guo:~/initramfs/bin# echo $(3+2)3+2: command not foundroot@guo:~/initramfs/bin# echo $((3+2))5

模式替换

${var%pattern},${var%%pattern} 从右边开始匹配${var#pattern},${var##pattern} 从左边开始匹配${var%pattern} ,${var#pattern} 表示最短匹配,匹配到就停止,非贪婪${var%%pattern},${var##pattern} 是最长匹配

只有在pattern中使用了通配符才能有最长最短的匹配,否则没有最 长最短匹配之分

结构中的pattern支持通配符
* 表示零个或多个任意字符
?表示零个或一个任意字符
[...]表示匹配中括号里面的字符
[!...]表示不匹配中括号里面的字符

root@guo:~/initramfs/bin# f=a.tar.gzroot@guo:~/initramfs/bin# echo ${f#*.}tar.gz  *匹配的aroot@guo:~/initramfs/bin# echo ${f##*.}gz   最长匹配,匹配到了后面的.root@guo:~/initramfs/bin# echo ${f%.*}a.tarroot@guo:~/initramfs/bin# echo ${f%%.*}a

==和=

== 可用于判断变量是否相等,=除了可用于判断变量是否相等外,还可以表示赋值

(( ))= 表示赋值, == 表示判断(整数比较),它们不等价

root@guo:~/initramfs/bin# ((n=5))root@guo:~/initramfs/bin# echo $n5root@guo:~/initramfs/bin# ((n==5)) && echo "equal"equal

转载于:https://www.cnblogs.com/hbgzy/p/10266847.html

你可能感兴趣的文章
跳出弹窗页面禁止滚动(PC端和手机端)
查看>>
云服务器 ECS CentOS 7配置默认防火墙 Firewall
查看>>
flatpak 和 snap 是 Linux 上的应用软件打包方式
查看>>
Java编程基础31——MySql数据库
查看>>
Linux的一下常用命令详解
查看>>
bootstrap datetimepicker日期插件美化
查看>>
使用 git 克隆 github 上的项目失败
查看>>
LeetCode 108——将有序数组转化为二叉搜索树
查看>>
坚持:学习Java后台的第一阶段,我学习了那些知识
查看>>
spring-boot +mybatis 配置多数据源
查看>>
Elasticsearch 参考指南(读和写文档)
查看>>
TCP协议中的seq/ack序号是如何变化的?
查看>>
98道经典Vue面试题总结(长期更新)
查看>>
Swoole 源码分析——Server模块之ReactorThread事件循环(上)
查看>>
C++引用的本质
查看>>
react antd-mobile 项目中实现 css 与 less 局部作用域化
查看>>
HTML5和CSS3系列(三):变化元素、新增标签、多媒体、新增表单、全局属性
查看>>
Angular练习之animations动画三
查看>>
简单而完整地体验一遍sentry的sourcemap服务
查看>>
扒取网页的mp3资源
查看>>