美文网首页
shell中三种引用方式的区分

shell中三种引用方式的区分

作者: jere觅 | 来源:发表于2015-10-25 22:13 被阅读0次

    学习了shell的展开方式后,我认识到shell 提供了一种叫做引用的机制,来有选择地禁止不需要的展开。
    首先是引用的第一种类型,双引号。如果你把文本放在双引号中,shell 使用的特殊字符,除了 $,\ (反斜杠),和 ‘(倒引号)之外,则失去它们的特殊含义,被当作普通字符来看待。这意味着单词分割,路径名展开,波浪线展开和花括号展开都被禁止,然而参数展开,算术展开,和命令替换仍然执行。使用双引号,我们可以处理包含空格的文件名。阻止单词分割,得到期望的结果;进一步,我们甚至可以修复破损的文件名。
    单词分割被禁止,内嵌的空格也不会被当作界定符,它们成为参数的一部分。一旦加上双引号,我们的命令行就包含一个带有一个参数的命令。
    来看一个有趣的例子:
    jeremy@ubuntu:~$ echo $(cal)
    十月 2015 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    jeremy@ubuntu:~$ echo "$(cal)"
    十月 2015
    日 一 二 三 四 五 六
    1 2 3
    4 5 6 7 8 9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30 31
    其次是单引号,如果需要禁止所有的展开,我们使用单引号。在此注意是禁止所有展开。
    以下例子是无引用,双引号,和单引号的比较结果:
    jeremy@ubuntu:/tmp/abc$ echo $(ls -l $(which cp)) $((2+5)) $USER {1..3}
    -rwxr-xr-x 1 root root 124932 1月 14 2015 /bin/cp 7 jeremy 1 2 3
    jeremy@ubuntu:/tmp/abc$ echo "$(ls -l $(which cp)) $((2+5)) $USER {1..3}"
    -rwxr-xr-x 1 root root 124932 1月 14 2015 /bin/cp 7 jeremy {1..3}
    jeremy@ubuntu:/tmp/abc$ echo '$(ls -l $(which cp)) $((2+5)) $USER {1..3}'
    $(ls -l $(which cp)) $((2+5)) $USER {1..3}
    最后是转义字符。适用于只想引用单个字符时。我们可以在字符之前加上一个反斜杠,在这个上下文中叫做转义字符。
    经常在双引号中使用转义字符,来有选择地阻止展开。使用转义字符来消除文件名中一个字符的特殊含义,是很普遍的。例如,在文件名中可能使用一些对于 shell 来说,有特殊含义的字符。这些字符包括 “$”, ”¡‘, ” ” 等字符。
    在文件名中包含特殊字符,你可以这样做:
    jeremy@ubuntu:/tmp/abc$ echo $(ls -l $USER)
    -rw-rw-r-- 1 jeremy jeremy 0 10月 25 16:28 $USER
    jeremy@ubuntu:/tmp/abc$ echo $(ls -l !)
    -rw-rw-r-- 1 jeremy jeremy 0 10月 25 12:10 !
    jeremy@ubuntu:/tmp/abc$ echo $(ls -l !)
    bash: !: event not found
    注意在单引号中,反斜杠失去它的特殊含义,它被看作普通字符。

    相关文章

      网友评论

          本文标题:shell中三种引用方式的区分

          本文链接:https://www.haomeiwen.com/subject/smcxhttx.html