免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 14566 | 回复: 11
打印 上一主题 下一主题

shell基础第十五篇-引号 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-19 21:57 |只看该作者 |倒序浏览
本帖最后由 L_kernel 于 2010-11-19 22:11 编辑

上一章介绍了变量和替换操作,在脚本中执行变量替换时最容易犯的一个错误就是由于
引用错误。在命令行中引用是很重要的。
本章内容有:
• 引用的必要性。
• 双引、单引和反引号。
• 使用反斜线实现屏蔽。

引用必要性
这里只讲述引用的基本规则。因为使用引用的例子很多。本书接下来的两个部分将一一
予以讲述。脚本中执行行操作时, s h e l l将对脚本设置予以解释。要采取一种方法防止s h e l l这
样做,即使用引用号,包括各式引用或使用反斜线。
一些用户在对文本字符串进行反馈操作时觉得使用引用很麻烦。有时不注意,只引用了
一半,这时问题出现了。最好在反馈文本字符串时使用双引号。下面是各种引用的例子。
  1. [mutter@localhost ~] $ echo Hit the star button to exit *
  2. Hit the star button to exit child.sh father.sh findfile.sh param2.sh param.sh who_is.sh
复制代码
文本返回了,但由于未使用双引号, *被s h e l l误解,s h e l l认为用户要做目录列表。用双引
号得结果如下:
[mutter@localhost ~] $ echo "Hit the star button to exit *"
Hit the star button to exit *


这样就不会有误解产生。表1 5 - 1列出各种引用类型。
表15-1 shell引用类型
" " 双引号` 反引号
' ' 单引号\ 反斜线


双引号
使用双引号可引用除字符$、`、\外的任意字符或字符串。这些特殊字符分别为美元符号,
反引号和反斜线,对s h e l l来说,它们有特殊意义。如果使用双引号将字符串赋给变量并反馈
它,实际上与直接反馈变量并无差别。
  1. [mutter@localhost ~] $ STRING="MAY DAY, MAY DAY, GOING DOWN"
  2. [mutter@localhost ~] $ echo "$STRING"
  3. MAY DAY, MAY DAY, GOING DOWN
  4. [mutter@localhost ~] $ echo $STRING
  5. MAY DAY, MAY DAY, GOING DOWN
复制代码
现在假定要设置系统时间输出到变量m y d a t e。
  1. [mutter@localhost ~] $ MYDATE="date"
  2. [mutter@localhost ~] $ echo $MYDATE
  3. date
复制代码
因为s h e l l将" "符号里的字符串赋予变量m y d a t e,d a t e已没有特定意义,故此变量只保存单
词d a t e。
如果要查询包含空格的字符串,经常会用到双引号。以下使用g r e p抽取名字“Davey Wi r e”,
因为没有加双引号, g r e p将“D a v e y”认作字符串,而把“Wi r e”当作文件名。
  1. [mutter@localhost ~] $ grep Davey Wire /etc/passwd
  2. grep: Wire: No such file or directory
  3. [mutter@localhost ~] $ grep "Davey Wire" /etc/passwd
复制代码
要解决这个问题,可将字符串加双引号。这样s h e l l会忽略空格,当使用字符时,应总是
使用双引号,无论它是单个字符串或是多个单词。

在一个反馈的文本行里可以使用双引号将变量引起来。下面的例子中, s h e l l反馈文本行,
遇到符号$,知道这是一个变量,然后用变量值b o y替换变量$ B O Y。
  1. [mutter@localhost ~] $ echo " The $BOY did well"
  2. The boy did well
  3. [mutter@localhost ~] $ echo " The "$BOY" did well"
  4. The boy did well
复制代码
单引号与双引号类似,不同的是s h e l l会忽略任何引用值。换句话说,如果屏蔽了其特殊
含义,会将引号里的所有字符,包括引号都作为一个字符串。使用上一个例子,结果如下:
  1. [mutter@localhost ~] $ GIRL='girl'
  2. [mutter@localhost ~] $ echo "The '$GIRL' did well"
  3. The 'girl' did well
复制代码
反引号
反引号用于设置系统命令的输出到变量。s h e l l将反引号中的内容作为一个系统命令,并
执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用。下面将
举例说明。
下面的例子中, s h e l l试图替代单词h e l l o为系统命令并执行它,因为h e l l o脚本或命令不存
在,返回错误信息。
  1. [mutter@localhost ~] $ echo `hello`
  2. bash: hello: command not found
复制代码
  1. [mutter@localhost ~] $ echo `date`
  2. Sat Nov 20 21:40:47 CST 2010
复制代码
这次命令有效,s h e l l正确执行。
下面将命令输出设置为变量m y d a t e,时间格式如下:
  1. [mutter@localhost ~] $ date +%A" the "%e" of "%B" "%Y
  2. Saturday the 20 of November 2010
  3. [mutter@localhost ~] $ mydate=`date +%A" the "%e" of "%B" "%Y`
  4. [mutter@localhost ~] $ echo $mydate
  5. Saturday the 20 of November 2010
  6. [mutter@localhost ~] $ mydate=`date`
  7. [mutter@localhost ~] $ echo $mydate
  8. Sat Nov 20 21:43:06 CST 2010
复制代码
另一个例子中,将反引号嵌在双引号里:
  1. [mutter@localhost ~] $ echo "The date today is `date`"
  2. The date today is Sat Nov 20 21:44:03 CST 2010
  3. [mutter@localhost ~] $ echo "There are `who | wc -l` users on the system"
  4. There are 3 users on the system
复制代码
上面的例子中,打印字符串后, s h e l l遇到反引号,将其看作一条命令执行它。

如果下一个字符有特殊含义,反斜线防止s h e l l误解其含义,即屏蔽其特殊含义。下述字
符包含有特殊意义: & * + ^ $ ` " | ?。
假定e c h o命令加*,意即以串行顺序打印当前整个目录列表,而不是一个星号*。
  1. [mutter@localhost ~] $ echo *
  2. child.sh father.sh findfile.sh param2.sh param.sh who_is.sh
复制代码
为屏蔽星号特定含义,可使用反斜线。
  1. $ echo \*
  2. *
复制代码
上述语句同样可用于$ $命令, s h e l l解释其为现在进程I D号,使用反斜线屏蔽此意,仅打
印$ $。
  1. [mutter@localhost ~] $ echo $
  2. 7906
  3. [mutter@localhost ~] $ echo \$
  4. $
复制代码
在打印字符串时要加入八进制字符( A S C I I相应字符),必须在前面加反斜线,否则s h e l l
将其当作普通数字处理。
  1. [mutter@localhost ~] $ echo " This is a copyright 251 sign"
  2. This is a copyright 251 sign
复制代码
[mutter@localhost ~] $ echo -e " This is a copyright \0373 sign"
This is a copyright

  1. [quote]Linux下需要使用\0NNN的八进制的方式才可以把特殊字符copyright的字符显示出来。[/quote]

  2. 使用命令e x p r时,用*表示乘法会出现错误,在*前加上反斜线才会正确。
  3. [code][mutter@localhost ~] $ expr 12 * 12
  4. expr: syntax error
  5. [mutter@localhost ~] $ expr 12 \* 12
  6. 144
复制代码
在e c h o命令中加入元字符,必须用反斜线起屏蔽作用。下面的例子要显示价格$ 1 9 . 9 9。其
中$屏蔽与不屏蔽将产生不同的结果。
  1. [mutter@localhost ~] $ echo "That video looks a good price for $19.99"
  2. That video looks a good price for 9.99
  3. [mutter@localhost ~] $ echo "That video looks a good price for \$19.99"
  4. That video looks a good price for $19.99
复制代码
使用反斜线屏蔽$,可得更好的结果。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2010-11-19 22:02 |只看该作者
在引用时会遇到一些问题且经常出错。我在使用引用时遵循两条规则:
1) 反馈字符串用双引号;但不要引用反馈本身。
2) 如果使用引用得到的结果不理想,再试另一种,毕竟只有三种引用方式,可以充分尝
试。
本章完毕~~

论坛徽章:
0
3 [报告]
发表于 2010-11-19 23:22 |只看该作者
mark下先

论坛徽章:
20
CU大牛徽章
日期:2013-04-17 11:48:26羊年新春福章
日期:2015-03-10 22:39:202015年中国系统架构师大会
日期:2015-06-29 16:11:282015亚冠之平阳省
日期:2015-07-31 09:19:042015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-09-30 06:20:002015亚冠之柏太阳神
日期:2015-10-19 20:29:5915-16赛季CBA联赛之天津
日期:2016-11-29 14:03:4315-16赛季CBA联赛之北控
日期:2016-12-24 20:51:492015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-12 20:58:532014年中国系统架构师大会
日期:2014-10-14 15:59:00
4 [报告]
发表于 2011-06-14 08:30 |只看该作者
总结得相当的不错啊

论坛徽章:
0
5 [报告]
发表于 2011-06-14 21:35 |只看该作者
好文……Kernel兄威武……

论坛徽章:
0
6 [报告]
发表于 2011-06-15 00:18 |只看该作者
本帖最后由 rabbitlcat 于 2011-06-15 20:17 编辑

看完懂了好多

论坛徽章:
0
7 [报告]
发表于 2011-06-15 19:52 |只看该作者
学习下

论坛徽章:
0
8 [报告]
发表于 2012-02-08 10:31 |只看该作者
回复 1# L_kernel


大神是否能帮我解答一下这个问题?谢谢拉。
    http://bbs.chinaunix.net/thread-3668196-1-1.html

论坛徽章:
3
水瓶座
日期:2014-03-25 17:08:042015亚冠之塔什干棉农
日期:2015-08-10 10:45:122015亚冠之萨济拖拉机
日期:2015-08-13 16:05:24
9 [报告]
发表于 2012-04-26 10:29 |只看该作者
楼主,特别感谢你的分享,我将你的文章转到我的博客,谢谢了回复 1# L_kernel


   

论坛徽章:
0
10 [报告]
发表于 2012-04-26 10:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP