首页 > 代码库 > 一些小细节

一些小细节

 
正则强引用问题1 sed -e /^$/d $filename2 # -e选项, 将会使得后边的字符被看作为编辑指令.  (如果只给"sed"传递了单个指令, 那么"-e"是可选的.)4 # ""引用(‘‘)将会保护指令中的RE(正则表达式)字符串,  也就是防止脚本将RE重新解释为特殊字符. (这会为sed命令, 保存指令的RE表达式.)在某些特定的情况下, sed编辑命令将不会和单引号的强引用一起工作.1 filename=file1.txt2 pattern=BEGIN34 sed "/^$pattern/d" "$filename" # 工作正常. 5 # sed /^$pattern/d "$filename"  就会出现异常的结果.  在这个实例中, 被强引用( ... )引起的 "$pattern"就不会扩展为"BEGIN".   sed -n /xzy/p $filename   # -n选项会让sed只打印那些匹配模式的行.反斜线将会强制sed替换命令延续到下一行. 类似于, 在第一行的结尾使用换行作为替换字符串.   1 s/^ */   2 /g这将每行开头的空格用换行来替换. 最后的结果就是将每段的缩进替换为一个空行。

 

 

 通常,真个表达式需要用单引号括起来,阻止特殊字符被解释,而通配符不能用引号。 单引号中的所有字符包括\都没有特殊意义。如果想在一对单引号中显示一个单引号是不行的

在一个双引号中通过直接使用变量名的方法来引用变量, 一般情况下都是没问题的. 这么做将阻止所有在引号中的特殊字符被重新解释 -- 包括变量名 [1]-- 但是$,`(后置引用), 和\(转义符)除外。使用双引号还能够阻止单词分割(word splitting). [3]如果一个参数被双引号扩起来的话, 那么这个参数将认为是一个单元, 即使这个参数包含有空白, 那里面的单词也不会被分隔开。

在echo语句中, 只有在单词分割(word splitting)或者需要保留空白的时候, 才需要把参数用双引号括起来.

使用-e选项的‘echo‘命令来打印转义符.  echo -e "\v\v\v\v" # 打印4个垂直制表符.

如果使用$‘\X‘结构,那-e选项就不必要了.  echo $‘\t \042 \t‘ # 被水平制表符括起来的引号(").

variable2="" # Empty.
COMMAND $variable2 $variable2 $variable2 # COMMAND将不带参数执行.
COMMAND "$variable2" "$variable2" "$variable2" # COMMAND将以3个空参数来执行.
COMMAND "$variable2 $variable2 $variable2" # COMMAND将以1个参数来执行(2空格)

file_list="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7"   # 列出的文件都作为命令的参数
 ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list  # 加两个文件到参数列表中, 列出所有的文件信息.

(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)

 每个命令都会返回一个 退出状态码 (有时候也被称为 返回状态 ). 成功的命令返回0, 而不成功的命令返回非零值, 非零值通常都被解释成一个错误码,虽然偶尔也会有例外。exit nnn命令将会把 nnn退出码传递给shell( nnn必须是十进制数, 范围必须是0- 255)。

(( ... ))和let ...结构也能够返回退出状态码, 当它们所测试的算术表达式的结果为非零的时候, 将会返回退出状态码0. 这些算术扩展结构被用来做算术比较.

在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割, 但是会发生参数扩展和命令替换.   使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和>操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错.

"if COMMAND"结构将会返回COMMAND的退出状态码.  与此相似, 在中括号中的条件判断也不一定非得要if不可, 也可以使用列表结构. 

[ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2"
 home=/home/bozo
[ -d "$home" ] || echo "$home directory does not exist."

(( ))结构扩展并计算一个算术表达式的值. 如果表达式的结果为0, 那么返回的退出状态码为1, 或者是"假". 而一个非零值的表达式所返回的退出状态码将为0, 或者是"true". 这种情况和先前所讨论的test命令和[ ]结构的行为正好相反。

当-n使用在中括号中进行条件测试的时候, 必须要把字符串用双引号引用起来,习惯于使用引用的测试字符串才是正路。

一些小细节