shell脚本学习初级教程- 备忘录

1,写在前面

      这是系列学习文档,基于互联网的分享精神,主要来源于论坛上的shell专区,有整理而来,本身是一本书上的内容,所以版权么属于书的原作者,这里我们只做学习材料,其实这几篇文档整理还是很飞逝间的,毕竟论坛上格式还是比较难以阅读的,起码没什么乐趣,当然还是向斑竹表示敬意,如果您觉得此系列文章不妥,请告知。

      这个系列文档大概有六篇左右,讲的属于基本入门的东西,作为运维来说,掌握一些脚本知识是必要的。同时我也会写几篇学习笔记,主要是作为自己的备忘录,没事遗忘的时候可以翻翻。

      以后将附上学习备忘录。


2,开篇第一章


       这里面本来有环境变量和shell变量知识,由于比较简单,不再转了,大家网上搜索一下都应该没问题的。


        我们从引号转载:


        我整理如下:

         2.1引用必要性
    这里只讲述引用的基本规则。因为使用引用的例子很多。本书接下来的两个部分将一一予以讲述。脚本中执行行操作时, shell将对脚本设置予以解释。要采取一种方法防止shell这样做,即使用引用号,包括各式引用或使用反斜线。
一些用户在对文本字符串进行反馈操作时觉得使用引用很麻烦。有时不注意,只引用了一半,这时问题出现了。

最好在反馈文本字符串时使用双引号。

下面是各种引用的例子。
echo Hit the star button to exit *
Hit the star button to exit child.sh father.sh findfile.sh param2.sh param.sh who_is.sh
文本返回了,但由于未使用双引号, *被shell误解,shell认为用户要做目录列表。用双引号得结果如下:
echo "Hit the star button to exit *"
Hit the star button to exit *

这样就不会有误解产生。表1 5 - 1列出各种引用类型。
表15-1 shell引用类型
" " 双引号  ` 反引号(这个准确说是法语里面的符号)
' ' 单引号  \ 反斜线

    2.1.1 双引号
使用双引号可引用除字符$、`、\外的任意字符或字符串。这些特殊字符分别为美元符号,反引号和反斜线,对shell来说,它们有特殊意义。如果使用双引号将字符串赋给变量并反馈它,实际上与直接反馈变量并无差别。
            STRING="MAY DAY, MAY DAY, GOING DOWN"
   echo "$STRING"
MAY DAY, MAY DAY, GOING DOWN
            $ echo $STRING
MAY DAY, MAY DAY, GOING DOWN


现在假定要设置系统时间输出到变量mydate.
   MYDATE="date"
            echo $MYDATE
date

因为shell将" "符号里的字符串赋予变量mydate,date已没有特定意义,故此变量只保存单词date。如果要查询包含空格的字符串,经常会用到双引号。以下使用grep抽取名字"Davey Wi r e",因为没有加双引号,grep将"Davey"认作字符串,而把“Wire”当作文件名
$ grep Davey Wire /etc/passwd
$ grep: Wire: No such file or directory
$ grep "Davey Wire" /etc/passwd

要解决这个问题,可将字符串加双引号。这样shell忽略空格,当使用字符时,应总是使用双引号,无论它是单个字符串或是多个单词。
在一个反馈的文本行里可以使用双引号将变量引起来。下面的例子中,shell反馈文本行,遇到符号$,知道这是一个变量,然后用变量值boy替换变量$BOY。
$ echo " The $BOY did well"
The boy did well
$ echo " The "$BOY" did well"
 The boy did well
    单引号与双引号类似,不同的是shell会忽略任何引用值。换句话说,如果屏蔽了其特殊含义,会将引号里的所有字符,包括引号都作为一个字符串。使用上一个例子,结果如下:
     $ GIRL='girl'
     $ echo "The '$GIRL' did well"
     The 'girl' did well


        2.1.2 反引号
反引号用于设置系统命令的输出到变量。shell将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用。下面将举例说明。
下面的例子中, shell试图替代单词hello为系统命令并执行它,因为hello脚本或命令不存在,返回错误信息。
$ echo `hello`
bash: hello: command not found
$ echo `date`
Sat Nov 20 21:40:47 CST 2010
这次命令有效,shell正确执行.下面将命令输出设置为变量mydate,时间格式如下
$ date +%A" the "%e" of "%B" "%Y
Saturday the 20 of November 2010
$ mydate=`date +%A" the "%e" of "%B" "%Y`
$ echo $mydate
Saturday the 20 of November 2010
$ mydate=`date`
$ echo $mydate
Sat Nov 20 21:43:06 CST 2010


另一个例子中,将反引号嵌在双引号里:
           $ echo "The date today is `date`"
The date today is Sat Nov 20 21:44:03 CST 2010
          $ echo "There are `who | wc -l` users on the system"
There are 3 users on the system

    上面的例子中,打印字符串后,shell遇到反引号,将其看作一条命令执行它。

 如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。下述字符包含有特殊意义: & * + ^ $ ` " | ?。
 假定echo命令加*,意即以串行顺序打印当前整个目录列表,而不是一个星号*.
 
 $ echo *
ild.sh father.sh findfile.sh param2.sh param.sh who_is.sh
  为屏蔽星号特定含义,可使用反斜线。
 $ echo \*
*
 上述语句同样可用于$$命令, shell解释其为现在进程ID号,使用反斜线屏蔽此意,仅打
  印$$。
$ echo $$
7906
$ echo \$$
$$
 在打印字符串时要加入八进制字符(ASCII相应字符),必须在前面加反斜线,否则shell将其当作普通数字处理。
$ echo " This is a copyright 251 sign"
This is a copyright 251 sign

 $ echo -e " This is a copyright \0373 sign"
This is a copyright

      Linux下需要使用\0NNN的八进制的方式才可以把特殊字符copyright的字符显示出来。
      使用命令expr时,用*表示乘法会出现错误,在*前加上反斜线才会正确。
             $ expr 12 * 12
expr: syntax error
   $ expr 12 \* 12
144
  在echo命令中加入元字符,必须用反斜线起屏蔽作用。下面的例子要显示价格$19.99。其中$屏蔽与不屏蔽将产生不同的结果。
   $ echo "That video looks a good price for $19.99"
That video looks a good price for 9.99
   $ echo "That video looks a good price for \$19.99"
That video looks a good price for $19.99
  使用反斜线屏蔽$,可得更好的结果。
 

     在引用时会遇到一些问题且经常出错。我在使用引用时遵循两条规则:
  1) 反馈字符串用双引号;但不要引用反馈本身。
  2) 如果使用引用得到的结果不理想,再试另一种,毕竟只有三种引用方式,可以充分尝试。


3,学习备忘

      上面的内容有些地方不是太正确。

      1,反引号
里面关于双引号的嵌套
示例: $ mydate=`date +%A" the "%e" of "%B" "%Y`
        $ echo $mydate


可以试试去掉双引号的效果,会提示你date: 额外的操作数 "the"请尝试执行"date --help"来获取更多信息。
其实这里面引号匹配要看清楚分别是" the "," of "," ",按照文档所述""中只有\,`,$符号转义,其他照常输出的,所以不要误认"%e"是双引号匹配的。
有兴趣验证echo "%e",挺有意思的。
   2,echo *
      shell里面有些特殊含义字符如: & ` " | ?
      如果想屏蔽特殊含义,需要反斜杠\,
      试试echo * 和echo \*,而echo $,*,+,^,?都可以正常输出,这点好像教材将错了。
      应该是打错了,真正还有些特殊字符。<,>,\,(,),;,~,#,其中#;符号无输出。~输出用户路径。其他均无法直接输出。
   3,expr 
         expr 12*12 
        输出 12*12,认为是第一个操作数,要用空格分开,如expr 12 * 12方可,同时加上反斜杠\,expr 12 \* 12


    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值