在脚本或其他别的地方出现的特殊字符

#
注释. 以一个#开头的行 (#!是例外) 是注释行.

# 这是一行注释.

注释也可以出现在一个命令语句的后面。

echo "A comment will follow." # 这里可以添加注释.
#                            ^ 注意在#前面可以有空白符 #

注释行前面也可以有空白字符.

 #注意这个注释行的开头是一个TAB键.


在同一行中,命令不会跟在一个注释的后面。因为这种情况下没有办法分辨注释的结尾,命令只能放在同一行的行首。用另外的一个新行开始下一个注释。


当然了,在echo命令给出的一个转义的#字符并不会开始一个注释。同样地,出现在一些参数代换结构和在数值常量表达式中的#字符也同样不会开始一个注释。
echo "The # here does not begin a comment."
echo 'The # here does not begin a comment.'
echo The \# here does not begin a comment.
echo The # here begins a comment.

echo ${PATH#*:}       # 前面的#是参数代换,不是注释.
echo $(( 2#101011 ))  # 基本转换,不是注释.

# 多谢, S.C.
标准的引用和转义 符("'\)可以转义#。

当然,模式匹配操作也可以使用#,而不必把它当做注释的开始。

;
命令分割符[分号]. 分割符允许在同一行里有两个或更多的命令.

echo hello; echo there

if [ -x "$filename" ]; then    # 注意:"if" and "then"需要分隔符
                               # 思考一下这是为什么?
  echo "File $filename exists."; cp $filename $filename.bak
else
  echo "File $filename not found."; touch $filename
fi; echo "File test complete."

注意”;”有时需要转义.

;;
case语句分支的结束符[双分号].
case "$variable" in
abc)  echo "\$variable = abc" ;;
xyz)  echo "\$variable = xyz" ;;
esac

.

"点"命令[圆点]. 等同于source (参考例子 11-20).这是一个bash的内建命令.

.
"点", 作为一个文件名的组成部分.当点(.)以一个文件名为前缀时,起作用使该文件变成了隐藏文件。这种隐藏文件ls一般是不会显示出来的。[译者注:除非你加了选项-a]
 bash$ touch .hidden-file
   

作为目录名时,单个点(.)表示当前目录,两个点(..)表示上一级目录(译者注:或称为父目录)。

 bash$ pwd
 /home/bozo/projects
 
 bash$ cd .
 bash$ pwd
 /home/bozo/projects
 
 bash$ cd ..
 bash$ pwd
 /home/bozo/
         

单点(.)文件名常常被当作文件移动命令的目的路径.

 bash$ cp /home/bozo/current_work/junk/* .
         

.
点(.)字符匹配.作为正则表达式的一部分,匹配字符时,单点(.)表示匹配任意一个字符。

"
部分引用[双引号]. "STRING"的引用会使STRING里的特殊字符能够被解释。请参考第五章.

'
完全引用[单引号]. 'STRING'能引用STRING里的所有字符(包括特殊字符也会被原样引用). 这是一个比使用双引号(“)更强的引用。 参考第5章.

,
逗号操作符[逗号]. 逗号操作符用于连接一连串的数学表达式。这一串的数学表达式每一个都被求值,但只有最后一个被返回。(译者注:换句话说,就是整个表达式的值取决于最后一个表达式的值。)
   1 let "t2 = ((a = 9, 15 / 3))"  # Set "a = 9" and "t2 = 15 / 3"

\
转义符[后斜杠].用于单个字符的引用机制。

\X "转义"字符为X.它有"引用"X的作用,也等同于直接在单引号里的'X'.\符也可以用于引用双引号(")和单引号('),这时双引号和单引号就表示普通的字符,而不是表示引用了。

参考第五章对转义字符的更深入的解释。

/
文件路径的分隔符[前斜杠]. 分隔一个文件路径的各个部分。(就像/home/bozo/projects/Makefile).

它也是算术操作符中的除法.

`
命令替换.`command` 结构使字符(`)[译者注:这个字符不是单引号,而是在标准美国键盘上的ESC键下面,在字符1左边,在TAB键上面的那个键,要特别留心]引住的命令(command)执行结果能赋值给一个变量。它也被称为后引号(backquotes)或是斜引号(backticks).

:

空命令[冒号]. 这个命令意思是空操作(即什么操作也不做). 它一般被认为是和shell的内建命令true是一样的。冒号":" 命令是Bash自身内建的, and its它的退出状态码是真(即0)。[译者注:shell中真用数字0表示].

:
echo $?   # 0

死循环可以这么写:
while :
do
   operation-1
   operation-2
   ...
   operation-n
done

# 等同于:
#    while true
#    do
#      ...
#    done

在if/then的测试结构中用作占位符:

if condition
then :   # 什么也不做的分支
else
   take-some-action
fi

在必须要有两元操作的地方作为一个分隔符, 参考例子 8-2和默认参数.

: ${username=`whoami`}
# ${username=`whoami`}   如果没有开头的:,将会出错
#                        除非"username"是一个外部命令或是内建命令...

在here document中的一个命令作为一个分隔符.

在参数替换中为字符串变量赋值
: ${HOSTNAME?} ${USER?} ${MAIL?}
#  如果列出的一个或多个基本的环境变量没有设置,
#+ 将打印出错信息。

变量扩展/子串代换.

和重定向操作符(>)连用, 可以把一个文件的长度截短为零,文件的权限不变。如果文件不存在,则会创建一个新文件。
: > data.xxx   # 文件"data.xxx"现在长度为0了      

# 作用相同于:cat /dev/null >data.xxx(译者注:echo >data.xxx也可以)
# 但是,用NULL(:)操作符不会产生一个新的进程,因为NULL操作符是内建的。
请参考例子 12-14.

和添加重定向操作符(>>)连用(: >> target_file).如果目标文件存在则什么也没有发生,如果目标文件不存在,则创建它。


这只能应用在普通文件中,不能用在管道,符号链接和其他的特殊文件。

虽然这是不被推荐的,但是NULL操作符(:)也可以用于开始注释一行。使用#来注释一行将会使Bash不会检查这行后面的语法是否有错,因此#注释几乎可以出现任何的东西。但是,对于用NULL操作符(:)注释的行则不是这样。

下面一个会产生错误的注释。
   1 : This is a comment that generates an error, ( if [ $x -eq 3] ).

字符”:”也用于域分割符。比如说在/etc/passwd和环境变量$PATH里.
 bash$ echo $PATH
 /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games

!

取反一个测试结果或退出状态[感叹号]. 取反操作符(!)取反一个命令的退出状态。它也取反一个测试操作。例如,它能改相等符( = )为不等符( != ).取反操作符(!)是一个Bash的关键字.

在不同的环境里,感叹号也可以出现在间接变量引用.

还有一种环境里,在命令行中,感叹号(!)调用属于历史命令机制的调用(详细请看附录 J).值得一提的是,在一个脚本里,命令历史机制是被禁止的。

*
通配符[星号].星号(*)字符在用于匹配文件名扩展的一个通配符.它自动匹配给定的目录下的每一个文件。

 bash$ echo *
 abs-book.sgml add-drive.sh agram.sh alias.sh
       

星号(*)也用于正则表达式中匹配任意数字字符。.

*
算术操作符. 在计算时,星号(*)表示乘法运算符。两个星号(**)表示求幂运算符。

?
测试操作符.在一些表达式中,问号(?)表示一个条件测试.

在双括号结构里,问号(?)表示C风格的三元操作符.请参考例子 9-30.

在参数替换表达式里,问号(?)测试一个变量是否被设置了值.

?
通配符. 字符?被用于文件名扩展特性的文件名表达式的单字符匹配,同时也在扩展正则表达式中匹配任意一个字符.

$
变量替换 (引用一个变量的内容).
var1=5
var2=23skidoo

echo $var1     # 5
echo $var2     # 23skidoo

一个变量名前面加一个$字符前缀表示引用该变量的内容。

$
行的结尾. 在正则表达式里,一个$字符表示匹配一行的结尾。

 
${}
参数替换.

$*, $@
位置参数.

$?
保存退出码值的变量. 变量$?保存了一个命令,一个函数,或一个脚本的退出状态码的值。

$$
进程ID变量. 变量$$保存了脚本运行时的进程ID值。

()
命令组.
   1 (a=hello; echo $a)


一组由圆括号括起来的命令是新开一个子shell来执行的.

因为是在子shell里执行,在圆括号里的变量不能被脚本的其他部分访问。因为父进程(即脚本进程)不能存取子进程(即子shell)创建的变量。
a=123
( a=321; )      

echo "a = $a"   # a = 123
# 在圆括号里的变量"a"实际上是一个局部变量,作用局域只是在圆括号内用于数组始初化

数组初始化.
 Array=(element1 element2 element3)

{xxx,yyy,zzz,...}
扩展支持.
cat {file1,file2,file3} > combined_file
# 连接file1,file2,和file3的内容并写到文件combined_file里去.

cp file22.{txt,backup}
# 拷贝"file22.txt"内容为"file22.backup"

一个命令可以在文件名扩展中从逗号分隔的各模式来扩展参数列表。 [1] 文件名将会依照列表中逗号分隔开的模式匹配扩展。

Linux Shell编程(4)——shell特殊字符(上)的更多相关文章

  1. 【Shell编程】Shell程序设计

    1.Shell简介   作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统.   Sh ...

  2. Linux shell编程02 shell程序的执行 及文件权限

    第一个shell脚本 1.       shell编程的方式 交互式shell编程 非交互式shell编程:执行的语句存放到一个文件 shell脚本:可以任意文件名,建议扩展名为sh 2.       ...

  3. shell编程01—shell基础

    01.学习shell编程需要的知识储备 1.vi.vim编辑器的命令,vimrc设置 2.命令基础,100多个命令 3.基础.高端的网络服务,nfs,rsync,inotify,lanmp,sersy ...

  4. Shell编程入门(第二版)(上)

    简单的示例Shell程序 示例1. #!/bin/bash #This is to show what a shell script looks like echo "Our first e ...

  5. Linux shell编程 4 ---- shell中的循环

    1 for循环 1 for语句的结构 for variable in values; do statement done 2 for循环通常是用来处理一组值,这组值可以是任意的字符串的集合 3 for ...

  6. 【Shell编程】Shell基本语法

    Shell 语法   Shell程序设计作为一种脚本语言,在Linux系统中有广泛的应用,本文记录了关于Shell程序设计的基础语法知识和常用命令,方便查询,熟练使用shell也需要经常实践,这对于完 ...

  7. Shell编程(二)——shell的基础知识及常用命令

    shell的基础知识 一.bash有以下特点: 1.记录命令历史 2.指令和文件名补全 3.别名 alias rm='rm -i' 4.通配符 * 0个或多个字符 ?​匹配一个字符 5 输入输出重定向 ...

  8. shell编程===执行shell脚本的四种方法

    使用vim创建一个shell文件,命名 hello.sh #!/bin/bash echo "hello shell !" 在linux中进行加载 chmod +x ./hello ...

  9. 【shell】shell编程(六)-shell函数的应用

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; [return ...

  10. linux操作系统5 shell编程

    知识内容: 1.shell编程预备知识 2.shell变量 3.表达式与运算符 4.分支循环语句 5.函数 一.shell编程预备知识 1.什么是shell编程 shell是与linux交互的基本工具 ...

随机推荐

  1. iOS 复杂动画之抽丝剥茧

    一.前言 随着开发者的增多和时间的累积,AppStore已经有非常多的应用了,每年都有很多新的APP产生.但是我们手机上留存的应用有限,所以如何吸引用户,成为产品设计的一项重要内容.其中炫酷的动画效果 ...

  2. URL编码 URLEncoder 示例

    2016-12-27 对字符编码时的规则 通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据. 对于Url来说,之所以要进行编码,一个是因为Url中有些字符 ...

  3. angularjs 将带标签的内容解析后返回

    参考地址:http://okashii.lofter.com/post/1cba87e8_29e0fab 引入angular-sanitize.js文件 注入ngSanitize 页面数据绑定 ng- ...

  4. windows下eclipse+hadoop2

    windows下eclipse+hadoop2.4开发手册 1.解压下载的hadoop2.4,到任意盘符,例如D:\hadoop-2.4.0. 2.设置环境变量 ①新建系统变量,如下所示. ②将新建的 ...

  5. 浅析angular框架的cookie

    相信接触过网页编程的基本上都知道cookie这个东西吧,一个毫不起眼,但是又十分的重要的东西,今天我们就来分析一下这个小东西,我们都知道客服端通过发送http请求到服务器请求我们的数据,当我们的服务器 ...

  6. EBS成本核算方法

    业务背景 成本核算方法,对应EBS系统中的成本方法,有四种: 1.标准成本 2.平均成本 平均成本又分为永续平均成本,即 Average Cost 期间平均成本,按照期间(自然月)来计算的平均成本 F ...

  7. POJ3285 River Hopscotch(最大化最小值之二分查找)

    POJ3285 River Hopscotch 此题是大白P142页(即POJ2456)的一个变形题,典型的最大化最小值问题. C(x)表示要求的最小距离为X时,此时需要删除的石子.二分枚举X,直到找 ...

  8. 《bunzip2命令》-linux命令五分钟系列之八

    本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == ...

  9. SHELL脚本自动备份Linux系统

    今天来写一个使用shell脚本增量备份系统文件,顺便复习一下shell脚本相关的命令,这个脚本可以根据自己的需求来备份不同的文件或者文件夹,进行完整备份和增量备份.直接上脚本如下: #!/bin/sh ...

  10. JQuery焦点Table

    ;;} .table-bordered{;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .table{mar ...