|
|
51CTO旗下网站
|
|
移动端

3.3.2 变量定义及变量输出说明(1)

《跟老男孩学Linux运维:Shell编程实战》本书是一本较完整的Shell编程实战型图书,并非大而全,但处处可以体现实战二字,大多内容取于企业实战,并结合老男孩十几年的运维工作和教学工作进行了梳理。本节为大家介绍变量定义及变量输出说明。

作者:老男孩来源:机械工业出版社|2017-04-21 10:49

【51CTO技术沙龙】10月27日,让我们共同探索AI场景化应用实现之道

3.3.2 变量定义及变量输出说明(1)

有关Shell变量定义、赋值及变量输出加单引号、双引号、反引号与不加引号的简要说明见表3-2。

表3-2 单引号、双引号、反引号与不加引号的知识说明

提示: 这里仅为Linux Shell下的结论,对于awk语言会有点特别,有关情况下文会有测试讲解。

老男孩的建议:

在脚本中定义普通字符串变量时,应尽量把变量的内容用双引号括起来。

单纯数字的变量内容可以不加引号。

希望变量的内容原样输出时需要加单引号。

希望变量值引用命令并获取命令的结果时就用反引号或$()。

以下是单引号、双引号与不加引号的实战演示。

范例3-8:对由反引号引起来的`date`命令或$(date)进行测试。

  1. [root@oldboy ~]# echo 'today is date'  
  2. today is date   #<==单引号引起内容时,你看到什么就会显示什么  
  3. [root@oldboy ~]# echo 'today is `date`'  
  4. today is `date` #<==单引号引起内容时,你看到什么就会显示什么,内容中有命令时即使通过  
  5.                 ?反引号引起来也没有用  
  6. [root@oldboy ~]# echo "today is date"  
  7. today is date  
  8. [root@oldboy ~]# echo "today is `date`"  
  9. today is Sun Sep 11 15:12:30 CST 2016  
  10. #<==对输出内容加双引号时,如果里面是变量或用反引号引起来的命令,则会先把变量或命令解析成  
  11. ?具体内容再显示  
  12. [root@oldboy ~]# echo "today is $(date)"  #<==?$()的功能和反引号``相同  
  13. today is Sun Sep 11 15:12:30 CST 2016  
  14. [root@oldboy ~]# echo today is $(date)   ??#<==带空格的内容不加引号,同样可以正确  
  15.                          ??     地输出,但不建议这么做  
  16. today is Sun Sep 11 15:12:30 CST 2016  
  17. #<==对于连续的字符串等内容输出一般可以不加引号,但加双引号比较保险,所以推荐使用。 

范例3-9:变量定义后,在调用变量输出打印时加引号测试。

  1. [root@oldboy ~]# OLDBOY=testchars    ??#<==创建一个不带引号的变量并赋值。  
  2. [root@oldboy ~]# echo $OLDBOY        ??#<==不加引号,显示变量解析后的内容。  
  3. testchars  
  4. [root@oldboy ~]# echo '$OLDBOY'      ??#<==加单引号,显示变量本身。  
  5. $OLDBOY  
  6. [root@oldboy ~]# echo "$OLDBOY"      ??#<==加双引号,显示变量内容,引号内可以  
  7. ?是变量、字符串等。  
  8. testchars 

范例3-10:使用三剑客命令中的grep过滤字符串时给过滤的内容加引号。

  1. [root@oldboy ~]# cat grep.log        ??#<==待测试的内容。  
  2. testchars  
  3. oldboy  
  4. [root@oldboy ~]# grep "$OLDBOY" grep.log  #<==将$OLDBOY解析为结果后进行过滤。  
  5. testchars  
  6. [root@oldboy ~]# grep '$OLDBOY' grep.log  #<==将$OLDBOY本身作为结果进行过滤。  
  7. [root@oldboy ~]# grep $OLDBOY grep.log    #<==将$OLDBOY解析为结果后进行过滤,同双引号的情况,但不建议这样使用,没有特殊需要时应一律加双引号。  
  8. testchars 

范例3-11:使用awk调用Shell中的变量,分别针对加引号、不加引号等情况进行测试。

首先在给Shell中的变量赋值时不加任何引号,这里使用awk输出测试结果。

  1. [root@oldboy ~]# ETT=123             ??#<==定义变量ETT并赋值123,没加引号。  
  2. [root@oldboy ~]# awk 'BEGIN {print "$ETT"}'  
  3. #<==加双引号引用$ETT,却只输出了本身,这个就不符合前文的结论了。  
  4. $ETT  
  5. [root@oldboy ~]# awk 'BEGIN {print $ETT}'  
  6.          #<==不加引号的$ETT,又输出了空的结果,这个就不符合前文的结论了。  
  7. [root@oldboy ~]# awk 'BEGIN {print '$ETT'}'  
  8. #<==加单引号引用$ETT,又输出了解析后的结果,这个就不符合前文的结论了。  
  9. 123  
  10.  [root@oldboy ~]# awk 'BEGIN {print "'$ETT'"}'  
  11. 123 

以上的结果正好与前面的结论相反,这是awk调用Shell变量的特殊用法。

然后在给Shell中的变量赋值时加单引号,同样使用awk输出测试结果。

  1. [root@oldboy ~]# ETT='oldgirl'  #<==定义变量ETT并赋值oldgirl,加单引号。  
  2. [root@oldboy ~]# awk 'BEGIN {print "$ETT"}'  
  3. $ETT                #<==加双引号引用$ETT,则输出本身。  
  4. [root@oldboy ~]# awk 'BEGIN {print $ETT}'  
  5. #<==对$ETT不加引号,则输出空的结果。  
  6. [root@oldboy ~]# awk 'BEGIN {print '$ETT'}'  
  7. #<==加单引号引用$ETT,也是输出空的结果,这个和前文的不加引号定义、赋值的结果又不一样。  
  8. [root@oldboy ~]# awk 'BEGIN {print "'$ETT'"}'  
  9. oldgirl #<==在单引号外再加一层双引号引用$ETT,则输出解析后的结果。 

以下在给Shell中的变量赋值时加双引号,也使用awk输出测试结果。

  1. [root@oldboy ~]# ETT="tingting" #<==定义变量ETT并赋值tingting,加双引号,这个  
  2. ?测试结果同单引号的情况。  
  3. [root@oldboy ~]# awk 'BEGIN {print "$ETT"}' #<==加双引号引用$ETT,会输出本身。  
  4. $ETT  
  5. [root@oldboy ~]# awk 'BEGIN {print $ETT}'   #<==不加引号的$ETT,会输出空的结果。  
  6.  
  7. [root@oldboy ~]# awk 'BEGIN {print '$ETT'}' #<==加单引号的$ETT,会输出空的结果。  
  8.  
  9. [root@oldboy ~]# awk 'BEGIN {print "'$ETT'"}'   #<==在单引号外部再加双引号引用$ETT,  
  10.                             ?????会输出正确结果。  
  11. tingting 

以下在给Shell中的变量赋值时加反引号引用命令,同样使用awk输出测试结果。

  1. [root@oldboy ~]# ETT=`pwd` #<==定义变量ETT并赋值pwd命令,加反引号,这个测试结果更特殊。  
  2. [root@oldboy ~]# echo $ETT  
  3. /root  
  4. [root@oldboy ~]# awk 'BEGIN {print "$ETT"}' #<==加双引号引用$ETT,会输出本身。  
  5. $ETT  
  6. [root@oldboy ~]# awk 'BEGIN {print $ETT}'   #<==不加引号的$ETT,会输出空的结果。  
  7.  
  8. [root@oldboy ~]# awk 'BEGIN {print '$ETT'}' #<==单引号引用$ETT,看起来输出了结  
  9.                             ???果,却是报错,和外层单引号冲突了。  
  10. awk: BEGIN {print /root}  
  11. awk:               ^ unterminated regexp  
  12. awk: cmd. line:1: BEGIN {print /root}  
  13. awk: cmd. line:1:                    ^ unexpected newline or end of string  
  14. [root@oldboy ~]# awk 'BEGIN {print "'$ETT'"}'   #<==在单引号外部再加双引号引用$ETT,  
  15.                             ???会输出正确结果。  
  16. /root 


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

《ASP.NET AJAX Web 应用开发秘诀(VB版)》

本书详细介绍了AJAX在Web开发上的应用。主要内容包括:ASP.NET AJAX技术概述、实现异步局部更新页面、UpdatePanel编程功能、PageRequestMan...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊