执行

bash -n xx.sh用于检测脚本语法是否有错误
bash -x xx.sh用于追踪执行

${var}

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

$(cmd)

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

一串命令的()和{}

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

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

root@guo:~/initramfs# var=test
root@guo:~/initramfs# echo $var
test
root@guo:~/initramfs# (var=notest;echo $var)
notest
root@guo:~/initramfs# echo $var
test

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

特殊替换

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

当变量var为空或未定义时,则在命令行中用string替换:${var:-string}
若var不为空时,则用变量var的值,而不进行替换。

root@guo:~/initramfs/bin# echo $a

root@guo:~/initramfs/bin# echo ${a:-bcc}
bcc
root@guo:~/initramfs/bin# echo $a root@guo:~/initramfs/bin# a=test
root@guo:~/initramfs/bin# echo ${a:-bcc}
test
root@guo:~/initramfs/bin# unset a
root@guo:~/initramfs/bin# echo $a root@guo:~/initramfs/bin# echo ${a:=bcc}
bcc
root@guo:~/initramfs/bin# echo $a
bcc

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

${var:+string}

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

root@guo:~/initramfs/bin# a=test
root@guo:~/initramfs/bin# echo $a
test
root@guo:~/initramfs/bin# echo ${a:+bcd}
bcd
root@guo:~/initramfs/bin# echo $a
test
root@guo:~/initramfs/bin# unset a
root@guo:~/initramfs/bin# echo $a root@guo:~/initramfs/bin# echo ${a:+bcd}

${var:?string}

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

root@guo:~/initramfs/bin# echo $a

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

$((exp))

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

root@guo:~/initramfs/bin# echo $(3+2)
3+2: command not found root@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.gz
root@guo:~/initramfs/bin# echo ${f#*.}
tar.gz *匹配的a
root@guo:~/initramfs/bin# echo ${f##*.}
gz 最长匹配,匹配到了后面的.
root@guo:~/initramfs/bin# echo ${f%.*}
a.tar
root@guo:~/initramfs/bin# echo ${f%%.*}
a

==和=

== 可用于判断变量是否相等,=除了可用于判断变量是否相等外,还可以表示赋值
(( ))= 表示赋值, == 表示判断(整数比较),它们不等价

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

shell | {}和()的更多相关文章

  1. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

  2. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  3. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  4. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  5. shell简介

    Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...

  6. Shell碎碎念

    1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...

  7. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  8. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  9. Linux环境下shell和vim中乱码原因及消除办法

    shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...

  10. 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

    背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...

随机推荐

  1. Python:每日一题006

    题目:斐波那契数列. 程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.…… 个人思路及代码: # 方 ...

  2. c++ stl源码剖析学习笔记(一)uninitialized_copy()函数

    template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...

  3. HBase Configuration过程

    (2012-10-22 15:56:10) 转载▼      HBase客户端API中,我们看到对HBase的任何操作都需要首先创建HBaseConfiguration类的实 例.为HBaseConf ...

  4. Alpha 冲刺 (9/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 多次测试软件运行 学习OPENMP ...

  5. OpenCV+Qt+CMake安装+十种踩坑

    平台:win10 x64+opencv-3.4.1 + qt-x86-5.9.0 + cmake3.13.4 x64 OpenCV+Qt+CMake安装,及目前安装完后打包:mingw32-make时 ...

  6. web集成高德地图

    1.使用高德地图API需到官网添加一个Key,http://lbs.amap.com/dev/key/app 2.页面头引入 <div id="addressMap"> ...

  7. mui.init方法配置

    mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需要在mui.init方法中完成对应参数配置即可,目前支持在mui.init方法中配置的功能包括: 创建子页面. 关闭页面. ...

  8. selenium_unittest基本框架

    from selenium import webdriver import unittest import time #创建类引入unitest.testcase用例库 class BaiDu_tes ...

  9. Error:(18, 51) java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符)

    问题:主要是因为jdk版本不一样 解决: 方法一:List<String> list=new ArrayList<Stirng>(); 方法二:重新安装jdk8的版本(安装和配 ...

  10. c++ 异常处理(1)

    异常 (exception) 是 c++ 中新增的一个特性,它提供了一种新的方式来结构化地处理错误,使得程序可以很方便地把异常处理与出错的程序分离,而且在使用上,它语法相当地简洁,以至于会让人错觉觉得 ...