虽千万人,吾往矣

Bash-特殊字符-上

基础字符

  # 注释,用于一行行首(#!除外)或本行空白的后边。

  ; 命令分隔符,可以在一行中写多个命令。

  ;; 终止case选项。

  . 等价于source命令,这是一个bash内建命令。

  . 作为文件名的前缀时,则该文件为隐藏文件。作为目录名的一部分.表示当前目录..表示上一级目录。用于字符匹配中,作为正则表达式的一部分,用来匹配任何单个字符

   部分引用,”STRING”阻止了一部分特殊字符。

  ' 全引用,’STRING’阻止了全部特殊字符。

  , 逗号连接了一系列算术操作,虽然里面的内容都被运行了,当只有最后一项被返回。

  \ 转义字符

  / 文件名路径分隔符,或用来作除法。

   `后置引用,命令替换。

  : 空命令,空操作,什么都不做

  ! 取反操作符。

  * 万能匹配符,用于文件名匹配或正则表达式中。注意:*在正则表达式匹配中与文件名匹配中是不同的。数学运算。**幂运算。

  ? 测试操作,或在正则表达式中匹配任意单个字符。

  $ 变量替换,或在正则表达式中作为行结束符。

  \$$ 变量的间接引用。

  ^ 正则表达式中表示行首。

  ${} 参数替换。

  $*, $@ 位置参数。

  $? 退状态变量。

  $$ 进程ID变量,保存了运行脚本进程ID。

  () 命令组。注意:在()中的命令列表将作为一个子shell来运行。

  {xxx, yyy, ...} 大括号扩展。

  {} 代码块,又称为内部组。事实上,这个结构创建了一个匿名函数,但是与函数不同的是,在其中声明的变量,对于脚本其它部分的代码来说还是可见的。

  {}\; 路径名

  [] test

  [[]] test

  [] 数组元素,或正则表达式中作为字符匹配的一个范围。

  (()) 算术扩展和赋值,以及允许C风格的变量处理机制。

  > &> >> >& 重定向。

  \<,\> 正则表达式中的单词边界。

  | 管线。

  >| 强制重定向。

  +,-,*,/,**,% 算术操作符

  || 逻辑或

  && 逻辑与

   逻辑非

  << 左移一位

  <<=n 左移n位

  >> 右移一位

  >>=n 右移n位

  & 按位与

  &= 按位与赋值

  | 按位或

  |= 按位或赋值

   按位非

  ^, XOR 按位异或

  ^= 异或赋值

  & 后台运行命令

注释

 在 echo 中转义的 # 是不能作为注释的

 # 数制转换(使用二进制表示),不是一个注释,双括号表示对于数字的处理

分号(;)命令分隔符

使用分号 ; 可以在同一行上写两个或两个以上的命令。

每个if语句都要用fi结束,而且是每一个if都要对应一个fi

双分号(;)终止 case 选项 点号(.)等价于 source 命令

使用双分号 ;; 可以终止 case 选项。

source 命令用于在当前 bash 环境下读取并执行 FileName.sh 中的命令。

美元符号($)

通常情况下,在工作中用的最多的有如下几项:
$0:Shell 的命令本身
$1 到 $9:表示 Shell 的第几个参数
$#:传递到脚本的参数个数
$*:以一个单字符串显示所有向脚本传递的参数

$@ 与$*相同。

$!:后台运行的最后一个进程的 ID 号

$$:脚本运行的当前进程 ID 号

$-:显示 Shell 使用的当前选项

$? :显示最后命令的执行情况,0表示没有错误。

详细看Shell 脚本中 '$' 符号的多种用法

单引号(')和双引号('')

同样是 $HOME,单引号会直接认为是字符,而双引号认为是一个变量。

双引号(")

"STRING" 将会阻止(解释)STRING 中大部分特殊的字符。

单引号(')

'STRING' 将会阻止 STRING 中所有特殊字符的解释,这是一种比使用"更强烈的形式。

斜线和反斜线

斜线(/

文件名路径分隔符。分隔文件名不同的部分(如 /home/bozo/projects/Makefile)。

也可以用来作为除法算术操作符

注意在 linux 中表示路径的时候,许多个 / 跟一个 / 是一样的。/home/shiyanlou 等同于 ////home///shiyanlou

反斜线(\

一种对单字符的引用机制\X 将会“转义”字符 X。这等价于"X",也等价于'X'。

\ 通常用来转义双引号(")和单引号('),这样双引号和单引号就不会被解释成特殊含义了。

  • 符号 说明
  • \n 表示新的一行
  • \r 表示回车
  • \t 表示水平制表符
  • \v 表示垂直制表符
  • \b 表示后退符
  • \a 表示"alert"(蜂鸣或者闪烁)
  • \0xx 转换为八进制的 ASCII 码, 等价于 0xx
  • \" 表示引号('')字面的意思

转义符也提供 续行功能,也就是编写多行命令的功能。

每一个单独行都包含一个不同的命令,但是每行结尾的转义符都会转义换行符,这样下一行会与上一行一起形成一个命令序列。

反引号(`)

命令替换{

  关于命令替换

1、命令替换,有两种方式

  方式一:`command`

  方式二:$(command)

2、应用场景

  在命令中通过命令替换的方式,将某些子命令的结果嵌入到当前命令中。

  详细 Shell 命令替换

}

反引号中的命令会优先执行,如:

cp `mkdir back` test.sh back
ls

先创建了 back 目录,然后复制 test.sh 到 back 目录。

冒号(:)

空命令

等价于“NOP”(no op,一个什么也不干的命令)。也可以被认为与 shell 的内建命令 true 作用相同。“:”命令是一个 bash 的内建命令,它的退出码(exit status)是(0)。

比如下面两个是等价的:

在 if/then 中作占位符

变量扩展/子串替换

与 > 重定向操作符结合使用时,将会把一个文件清空,但是并不会修改这个文件的权限。如果之前这个文件并不存在,那么就创建这个文件

 与 >> 重定向操作符结合使用时,将不会对预先存在的目标文件 : >> target_file 产生任何影响。如果这个文件之前并不存在,那么就创建它

 可能用来作为注释行,但不推荐这么做。使用 # 来注释的话,将关闭剩余行的错误检查,所以可以在注释行中写任何东西。然而,使用 : 的话将不会这样。

 : 还用来在 /etc/passwd 和 $PATH 变量中做分隔符,如:

问号(?)

测试操作符

在一个双括号结构中,? 就是 C 语言的三元操作符,如:

小括号(())

命令组

在括号中的命令列表,将会作为一个子 shell 来运行。

在括号中的变量,由于是在子 shell 中,所以对于脚本剩下的部分是不可用的。父进程,也就是脚本本身,将不能够读取在子进程中创建的变量,也就是在子 shell 中创建的变量。(全体变量跟局部变量的区别)如:

 

初始化数组

大括号用来表示数组 如:

大括号({})

文件名扩展 或 数组表示

注意: 在大括号中,不允许有空白,除非这个空白被引用或转义。复制 t.txt 的内容到 t.back 中,如:

代码块(未命名函数)

代码块,又被称为内部组,这个结构事实上创建了一个匿名函数(一个没有名字的函数)。然而,与“标准”函数不同的是,在其中声明的变量,对于脚本其他部分的代码来说还是可见的。

中括号([ ])

条件测试

条件测试表达式放在 [ ] 中。双中括号([[ ]])也用作条件测试(判断)。

if常见条件表达式和逻辑表达式

if [ -f  file ]    如果文件存在
if [ -d ...   ]    如果目录存在
if [ -s file  ]    如果文件存在且非空
if [ -r file  ]    如果文件存在且可读
if [ -w file  ]    如果文件存在且可写
if [ -x file  ]    如果文件存在且可执行  
if [ int1 -eq int2 ]    如果int1等于int2  
if [ int1 -ne int2 ]    如果不等于   
if [ int1 -ge int2 ]       如果>=
if [ int1 -gt int2 ]       如果>
if [ int1 -le int2 ]       如果<=
if [ int1 -lt int2 ]       如果<
 逻辑非 !   条件表达式的相反
if [ ! 表达式 ]
if [ ! -d $num ]    如果不存在目录$num
    逻辑与 –a      条件表达式的并列
if [ 表达式1  –a  表达式2 ]
    逻辑或 -o      条件表达式的或
if [ 表达式1  –o 表达式2 ]

详细看if语句的使用方法(条件判断)

Shell编程之if语句实战(小结)

-lt (less than)表示小于号,比如:

数组元素

在一个 array 结构的上下文中,中括号用来引用数组中每个元素的编号,大括号使得中括号引用有效。

 

 

posted @ 2020-10-17 16:51  遥望星空脚踏实地  阅读(235)  评论(0编辑  收藏  举报