第二部分 基 础

第三章 特殊字符

# 注释,行首以#开头为注释(#!是个例外)

# this line is a comment

注释也可存在于本行命令的后边。

echo "A comment with follow." # 这是注释 
#                            ^ 注意#前边的空白

注释也可在本行空白的后面。

     # A tab precedes this comment.

注意:

  • 命令是不能跟在同一行的注释的后边。
  • 被转义的#也不能认为是注释的开始。 标准引用、转义字符\、单引号'、双引号"都可以转义#
  • #也可以出现在特定的参数替换结构中或者是数字常量表达式中。
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 # 这是一个注释

echo ${PATH#*:}   #参数替换,不是一个注释。
echo $(( 2#101011 ))  #数制转换,不是一个注释。

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

echo hello; echo there
if [ -x "$filename" ]; then  # 注意:"if"和"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命令(见Example 11-20)

这是一个bash的内置命令。

. 作为文件名的一部分

如果作为文件名的前缀的话,那么这个文件将成为隐藏文件。将不被ls命令列出。
如果作为目录名的一部分的话,那么.表达的是当前目录,..表示父目录。

. 字符匹配

作为正则表达式的一部分,用来匹配任何的单个字符。

" 部分引用

"STRING" 阻止了一部分特殊字符的作用,具体见 第五章。

' 全引用

'STRING' 阻止了全部的特殊字符的作用,具体见 第五章。

, 逗号链接了一系列的算术运算

里边的所有内容都被运行了,但是只有最后一项的结果被返回。
如:

let "t2 = ((a = 9, 15/3))"  # Set "a = 9" and "t2 = 15/3"

\ 转义字符

/ 文件路径分隔符或用来做除法操作

` 后置引用,命令替换,具体见 第十四章。

: 空命令

等价于NOP,也可以被认为与shell内建的命令true的作用相同。:命令是一个bash的内建命令,它返回0,就是shell返回的true。
如:

:
echo $? #0 ?是上一个命令的返回值

死循环,如:

while :
do
  op1
  op2
  ...
  opn
done
#等价于
while true
do
  op1
  op2
  ...
  opn
done

if/then中的占位符,如:

if condition
then : # 什么都不做,为了引出else分支
else
   do some thing
fi

在一个二元命令中,提供一个占位符,具体见Example 8-2, 和"默认参数"。 如:

: ${username=`whoami`}
# ${username=`whoami`} 如果没有":"的话,将会产生错误,除非username是一个命令。

在here document中提供一个占位符,见 Example 17-10

使用"参数替换"来评估字符串变量(见 Example 9-14)。如:

: ${HOSTNAME?} ${USER?} ${MAIL?}
# 如果一个或多个必要的环境变量没被设置的话,则打印错误

"变量扩展/子串替换"
在和 > (重定向操作符)结合使用时,把一个文件截断到0长度且没有修改它的权限。如果文件在之前不存在,那么将创建它。

: > data.xxx    #文件"data.xxx"被清空了或者被创建了。
# 与 cat /dev/null > data.xxx 的作用相同
# 然而,这不会产生一个新的进程,因为":"是一个内置命令,所以运行会更快

具体参见 Example 12-14

在和 >> (重定向操作符) 结合使用时,将不会对想要附加的文件产生任何影响。