• 引用字符shell中的引用java教程


    时间紧张,先记一笔,后续优化与完善。

        

    shell中的引用

        引用的字面意思就是将字符串用双引号括起来. 它的用作就是护保字符串中的别特字符不被shell或者shell脚本从新释解, 或者展扩. (我们这里所说的"别特"指的是一些字符在shell中拥有的别特义意, 而不是字符的字面意思, 比如通配符 -- *.)

        在常日的演和讲写作中, 当我们"引用"一个短语的时候, 这意味着这个短语被分区以示它有别特的义含. 但是在Bash脚本中, 当我们引用一个字符串的时候, 我们分区这个字符串是为了护保它的字面义含.

        某些程序和具工可以从新释解或者展扩被引用的别特字符. 引用的一个重要用作就是护保命令行参数不被shell释解, 但是还是可以让正在调用的程序来展扩它.

    root@ubuntu:~/resource/study/shell_study/txt-folder# grep [Tt]his *.txt
    file1.txt:this is the first file
    file2.txt:This the second file
    root@ubuntu:~/resource/study/shell_study/txt-folder# grep '[Tt]his' *.txt
    file1.txt:this is the first file
    file2.txt:This the second file

        这在我的bash下都是可以实现的

        引用还可以改掉echo's不换行的"缺点".

    root@ubuntu:~/resource/study/shell_study/txt-folder# echo $(ls -l)
    total 8 -rw-r--r-- 1 root root 23 2013-04-23 23:34 file1.txt -rw-r--r-- 1 root root 21 2013-04-23 23:34 file2.txt
    root@ubuntu:~/resource/study/shell_study/txt-folder# echo '$(ls -l)'
    $(ls -l)
    root@ubuntu:~/resource/study/shell_study/txt-folder# echo "$(ls -l)"
    total 8
    -rw-r--r-- 1 root root 23 2013-04-23 23:34 file1.txt
    -rw-r--r-- 1 root root 21 2013-04-23 23:34 file2.txt

        在一个双引号中通过直接应用变量名的方法来引用变量, 一般情况下都是没问题的. 这么做将止阻有所在引号中的别特字符被从新释解 -- 包含变量名, 但是$,`(后置引用), 和\(义转符)除外.  保存$作为别特字符的义意是为了可以在双引号中也可以畸形的引用变量("$variable"), 也就是说, 这个变量将被它的值所代替

        应用双引号还可以止阻单词分割(word splitting). 如果一个参数被双引号扩起来的话, 那么这个参数将认为是一个单元, 即使这个参数含包有空白, 那里面的单词也不会被分开隔.

    #!/bin/bash
    var="'(]\\{}\$\""
    echo $var        # '(]\{}$"
    echo "$var"      # '(]\{}$"     和上一句没什么区分.Doesn't make a difference.
    echo
    IFS='\'
    echo $var        # '(] {}$"     \ 字符被空白符替换了, 为什么?
    echo "$var"      # '(]\{}$"
    exit 0

        我们看看面下这个脚本的行执结果:

    root@ubuntu:~/resource/study/shell_study# ./echo-strange 
    '(]\{}$"
    '(]\{}$"
    
    '(] {}$"
    '(]\{}$"

        针对IFS的用法当前再研讨吧

        当在命令行中应用时, 如果在双引号中含包"!"的话, 那么会发生一个错误(译者注: 比如, echo "hello!"). 这是因为感叹号被释解成历史命令了. 但是如果在脚本中, 就不会存在这个问题, 因为在脚本中Bash历史制机是被禁用的.

        在双引号中应用"\"也可能会现出一些不一致的为行

    root@ubuntu:~/resource/study/shell_study# echo "hello!"
    bash: !": event not found
    root@ubuntu:~/resource/study/shell_study# echo hello!
    hello!
    root@ubuntu:~/resource/study/shell_study# echo hello\!
    hello!
    root@ubuntu:~/resource/study/shell_study# echo "hello\!"
    hello\!
    root@ubuntu:~/resource/study/shell_study# echo ni\thao
    nithao
    root@ubuntu:~/resource/study/shell_study# echo "ni\thao"
    ni\thao
    root@ubuntu:~/resource/study/shell_study# echo -e ni\thao
    nithao
    root@ubuntu:~/resource/study/shell_study# echo -e "ni\thao"
    ni	hao

        单引号(' ')操纵与双引号基本一样, 但是不许允引用变量, 因为$的别特义意被关闭了. 在单引号中, 任何别特字符都按照字面的意思停止释解, 除了'. 所以说单引号("全引用")是一种比双引号("部份引用")更严厉的引用方法.

        因为即使是义转符(\)在单引号中也是按照字面意思释解的, 所以如果想在一对单引号中示显一个单引号是行不的

        面下这个例子:

    root@ubuntu:~/resource/study/shell_study# echo "I'm a good person"
    I'm a good person
    root@ubuntu:~/resource/study/shell_study# echo 'I'm a good person'
    > ^C
    root@ubuntu:~/resource/study/shell_study# echo 'I'\''m a good person'
    I'm a good person
    root@ubuntu:~/resource/study/shell_study# echo 'I'"'"'m a good person'
    I'm a good person

        义转是一种引用单个字符的方法. 一个面前放上义转符 (\)的字符就是诉告shell这个字符按照字面的意思停止释解, 换句话说, 就是这个字符失去了它的别特义含.

        在某些特定的命令和具工中, 比如echo和sed, 义转符往往会起到相反果效 - 它反倒可能会引发出这个字符的别特义含.

        特定的义转符的别特的义含

        echo和sed命令中应用

        \n

        示表新的一行

        \r

        示表回车

        \t

        示表水平制表符

        \v

        示表垂直制表符

        \b

        示表退后符

        \a

        示表"alert"(蜂鸣或者烁闪)

        \0xx

        转换为八进制的ASCII码, 等价于0xx

    #!/bin/bash
    echo "\v\v\v\v"      # 逐字的印打\v\v\v\v.
    # 应用-e选项的'echo'命令来印打义转符.
    echo "==============="
    echo -e "\v\v\v\v"   # 印打4个垂直制表符.
    echo "==============="
    echo -e "\042"       # 印打" (引号, 8进制的ASCII 码就是42).
    echo "==============="
    # 如果应用$'\X'结构,那-e选项就不必要了.
    echo $'\n'           # 新行.
    echo $'\a'           # 正告(蜂鸣).
    echo "==============="
    # 版本2当前Bash许允应用$'\nnn'结构.
    # 注意在这里, '\nnn\'是8进制的值.
    echo $'\t \042 \t'   # 被水平制表符括起来的引号(").
    # 当然,也可以应用16进制的值,应用$'\xhhh' 结构.
    echo $'\t \x22 \t'  # 被水平制表符括起来的引号(").
    echo "==============="
    # 分配ASCII字符到变量中.
    quote=$'\042'        # " 被赋值到变量中.
    echo "$quote This is a quoted string, $quote and this lies outside the quotes."
    # 变量中的连续的ASCII字符.
    triple_underline=$'\137\137\137'  # 137是八进制的'_'.
    echo "$triple_underline UNDERLINE $triple_underline"
    ABC=$'\101\102\103\010'           # 101, 102, 103是八进制码的A, B, C.
    echo $ABC
    escape=$'\033'                    # 033 是八进制码的esc.
    echo "\"escape\" echoes as $escape"
    exit 0

        结果:

    root@ubuntu:~/resource/study/shell_study# ./escaped 
    \v\v\v\v
    ===============
    
    
    
    
    
    ===============
    "
    ===============
    
    
    
    ===============
    	 " 	
    	 " 	
    ===============
    " This is a quoted string, " and this lies outside the quotes.
    ___ UNDERLINE ___
    ABC
    "escape" echoes as

        

        每日一道理
    水仙亭亭玉立,兰花典雅幽香,牡丹雍容华贵,梨花洁白无暇……美丽的花朵总能得到世人的羡慕与赞叹,殊不知,它从一粒小小的种子到最后开花,要历经无数的艰辛与坎坷!我们的成长也是如此。只有做辛勤的“织梦者”,我们的梦想才会成真!
    \"

    示表引号字面的意思

      1 echo "Hello"                  # Hello
      2 echo "\"Hello\", he said."    # "Hello", he said.
    \$

    示表$本身子面的义含(跟在\$后边的变量名将不能引用变量的值)

      1 echo "\$variable01"  # 结果是$variable01
    \\

    示表反斜线字面的意思

      1 echo "\\"  # 结果是\
      2 
      3 # 反之 . . .
      4 
      5 echo "\"   # 如果从命令行调用的话, 会现出SP2, 也就是2级提示符(译者注: 提示你命令不全, 在添加一个"就好了.
      6            # 如果在脚本中调用的话, 那么会报错. 
    Note

    \的为行依赖于它自身是否被义转, 被引用(""), 或者是否现出在命令替换here document中.

      1                       #  简单的义转和引用
      2 echo \z               #  z
      3 echo \\z              # \z
      4 echo '\z'             # \z
      5 echo '\\z'            # \\z
      6 echo "\z"             # \z
      7 echo "\\z"            # \z
      8 
      9                       #  命令替换
     10 echo `echo \z`        #  z
     11 echo `echo \\z`       #  z
     12 echo `echo \\\z`      # \z
     13 echo `echo \\\\z`     # \z
     14 echo `echo \\\\\\z`   # \z
     15 echo `echo \\\\\\\z`  # \\z
     16 echo `echo "\z"`      # \z
     17 echo `echo "\\z"`     # \z
     18 
     19                       # Here document
     20 cat <<EOF              
     21 \z                      
     22 EOF                   # \z
     23 
     24 cat <<EOF              
     25 \\z                     
     26 EOF                   # \z
     27 
     28 # 这些例子是由Stephane Chazelas所提供的.

    赋值给变量的字符串的元素也会被义转, 但是不能把一个单独的义转符赋值给变量.

      1 variable=\
      2 echo "$variable"
      3 # 不能畸形运行 - 会报错:
      4 # test.sh: : command not found
      5 # 一个"裸体的"义转符是不可以安全的赋值给变量的.
      6 #
      7 #  事实上在这里"\"义转了一个换行符(变成了续航符的义含), 
      8 #+ 果效就是				variable=echo "$variable"
      9 #+                      不可用的变量赋值
     10 
     11 variable=\
     12 23skidoo
     13 echo "$variable"        #  23skidoo
     14                         #  这句是可以的, 因为
     15                         #+ 第2行是一个可用的变量赋值.
     16 
     17 variable=\ 
     18 #        \^    义转一个空格
     19 echo "$variable"        # 示显空格
     20 
     21 variable=\\
     22 echo "$variable"        # \
     23 
     24 variable=\\\
     25 echo "$variable"
     26 # 不能畸形运行 - 报错:
     27 # test.sh: \: command not found
     28 #
     29 #  第一个义转符把第2个\义转了,但是第3个又变成"裸体的"了,
     30 #+ 与上边的例子的原因相同.
     31 
     32 variable=\\\\
     33 echo "$variable"        # \\
     34                         # 第2和第4个反斜线被义转了.
     35                         # 这是正确的. 

    义转一个空格会止阻命令行参数列表的"单词分割"问题.

      1 file_list="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7"
      2 # 列出的文件都作为命令的参数.
      3 
      4 # 加两个文件到参数列表中, 列出有所的文件信息.
      5 ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list
      6 
      7 echo "-------------------------------------------------------------------------"
      8 
      9 # 如果我们将上边的两个空个义转了会发生什么果效?
     10 ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list
     11 # 错误: 因为前3个路径被合并成一个参数传递给了'ls -l'
     12 #       而且两个经过义转的空格组织了参数(单词)分割. 

    义转符也提供续行功能, 也就是编写多行命令的功能. 一般的, 每一个单独行都含包一个不同的命令, 但是每行结尾的义转符都会义转换行符, 这样下一行会与上一行一起形成一个命令序列.

      1 (cd /source/directory && tar cf - . ) | \
      2 (cd /dest/directory && tar xpvf -)
      3 # 重复Alan Cox的目录数拷贝命令,
      4 # 但是分成两行是为了增加可读性.
      5 
      6 # 也可以应用如下方式:
      7 tar cf - -C /source/directory . |
      8 tar xpvf - -C /dest/directory
      9 # 察看下边的注意事项.
     10 # (感谢, Stephane Chazelas.)
    Note

    如果一个脚本以|结束, 管道符, 那么就不用非的加上义转符\了. 但是一个好的编程风格, 还是应该在行尾加上义转符.

      1 echo "foo
      2 bar" 
      3 #foo
      4 #bar
      5 
      6 echo
      7 
      8 echo 'foo
      9 bar'    # 没什么区分.
     10 #foo
     11 #bar
     12 
     13 echo
     14 
     15 echo foo\
     16 bar     # 换行符被义转.
     17 #foobar
     18 
     19 echo
     20 
     21 echo "foo\
     22 bar"     # 与上边一样, \在部份引用中还是被释解为续行符. 
     23 #foobar
     24 
     25 echo
     26 
     27 echo 'foo\
     28 bar'     # 由于是全引用, 所以\没有被释解成续行符. 
     29 #foo\
     30 #bar
     31 
     32 # 由Stephane Chazelas所建议的用例.

    待续。。。。

    文章结束给大家分享下程序员的一些笑话语录: 祝大家在以后的日子里. 男生象Oracle般健壮; 女生象win7般漂亮; 桃花运象IE中毒般频繁; 钱包如Gmail容量般壮大, 升职速度赶上微软打补丁 , 追女朋友像木马一样猖獗, 生活像重装电脑后一样幸福, 写程序敲代码和聊天一样有**。

  • 相关阅读:
    (转)Hibernate框架基础——在Hibernate中java对象的状态
    (转)Hibernate框架基础——cascade属性
    (转)Hibernate框架基础——多对多关联关系映射
    (转)Hibernate框架基础——一对多关联关系映射
    (转)Hibernate框架基础——映射集合属性
    (转)Hibernate框架基础——映射主键属性
    (转)Hibernate框架基础——映射普通属性
    (转)Eclipse在线配置Hibernate Tools
    人物志---川航8633事件
    日常英语---200204(moderately)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3042255.html
Copyright © 2020-2023  润新知