第二部分 基 础
第三章 特殊字符
#
注释,行首以#开头为注释(#!是个例外)
# 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
在和 >> (重定向操作符) 结合使用时,将不会对想要附加的文件产生任何影响。