Shell中的特殊字符

2017-04-20  本文已影响0人  echo_1992

Shell的预处理

当我们在shell中敲击命令按下enter键时,其实bash在这些命令字符送到命令前做了一些处理,这些处理叫expansion,比如“*”字符在shell命令行中有很多意义。在命令行enter后,这些特殊字符将会扩展成另外的一些东西。
echo是shell內建的程序,打印出该命令的参数到stdout。但是如果是echo *,命令将不是打印出*而是另外一些东西。shell在echo命令执行之前将*扩展成了另外的东西。

  1. 通配符“*”的工作机制被称为pathname expansion。


    通配符*
  2. ”在单词前扩展为该单词名称的家目录,如syl。
    ~家目录
  3. “$”是算术扩展。echo $((expression)),可以嵌套。echo $((2 + 2));echo $(($((5**2)) * 3))。
    $算术扩展
  4. {}花括号扩展。可以根据花括号中的模型pattern创建多个text字符串


    花括号扩展
  5. 参数扩展parameter expansion。在系统中存储着一些有名字的数据集,实际上这些数据集叫做变量。echo $USER显示USER变量的内容。想要知道可用的变量列表可以printenv | less。


    变量扩展
  6. 命令替换。可以让我们使用一个命令的输出作为另一个命令的参数。


    命令替换

引号的使用

出现问题

引号的出现解决这些问题。

双引号

将字符放在双引号内,shell中那些拥有特有含义的字符就失去了这些特殊含义,只是普通的字符文本,但是其中“$”“\”“`”三个例外。


出现问题

ls命令会认为这是两个参数。用ls -l "two words.txt"就可以去除空格的影响,修复mv "two words.txt" two_words.txt。然而$依然可用,echo "$USER $((2 + 2)) $(cal)"。


$依然可用
通常,单词分割是根据空格space,制表符tab,换行newlines这些单词间的分隔符。这就是说,没有在引号内的spaces,tabs,newlines并不是文本的一部分,他们只是分隔符,因此就变成了多个命令参数。加上双引号就取消了这些分隔符的意义,变成一个参数。
分隔符

单引号

为了消除所有的expansion,使用单引号

单引号

转义字符

通常在双引号中出现的消除特殊含义的扩展。

上一篇下一篇

猜你喜欢

热点阅读