免费注册 查看新帖 |

  平台 论坛 博客 文库
最近访问板块
查看: 1760246 | 回复: 799

[学习共享] shell 十三問? [复制链接]

      论坛徽章:
      1
      1 [收藏(0)] [报告]
      发表于 2003-12-09 02:48 |只看该作者 |倒序浏览

      来源:商界网 网址:http://www.mxy4grjo.cn/a/www.hnonline.com.cn/

      播报:

        •   病害严重时,病叶曲屈、干枯早落,仅存梢部幼嫩叶片。本网所公布的产品信息,仅为提供可能的更多的交易机会,对交易双方的信誉、履约能力等不做任何保证。VIP会员。

            我们租了两小块地,几平方米的土地上要种上十几种菜,种植方式不科学导致收成很差,*后不了了之。上海丹弗香精香料有限公司,是一家致力于开发和研制高品质肉味(咸味)香精、香基的国内独资公司。

            高透明魔芋胶2018-05-2216:28高透明魔芋胶是用魔芋精粉为原料,使用了食品级酒精提纯去除精粉中的淀粉、灰粉、纤维素、色素、生物碱等杂质,从而得到高纯度魔芋胶,其干基含量达80-95%。高访问量现网站日访问量平均在20万人次左右,访问群体专业集中,全国覆盖面广。

            三是不断加强日常监督检查。03:(人民币)25000元封二:18000元12000元彩色:6000元20000元封三:15000元10000元黑白:3000元04:(人民币)50000元50000元(参展证、参观证和记者证)20000元05::每场10000元/小时早鸟价2023年8月23日2023年8月23-25日14届上海国际餐饮食材展的新老客户7000元/9㎡优惠

          重点推荐:Libros, fotos y arte chinos llegan a ciudad mexicana de Guadalajara en apertura Feria Internacional del Libro Spanish.xinhuanet.com 马铃薯也借着胶味领鲜的品牌东风,让全国各地越来越多的客商认可采购。本网提醒各用户,谨慎选择交易对象,以避免不必要的经济或其他损失。

          Libros, fotos y arte chinos llegan a ciudad mexicana de Guadalajara en apertura Feria Internacional del Libro  Spanish.xinhuanet.com

          我在 CU 的日子並不長,有幸在 shell 版上與大家結緣。
          除了跟眾前輩學習到不少技巧之外,也常看到不少朋友的問題。
          然而,在眾多問題中,我發現許多瓶頸都源於 shell 的基礎而已。
          每次要解說,卻總有千言萬語不知從何起之感...

          這次,我不是來回答,而是準備了關於 shell 基礎的十三個問題要問大家﹗
          希望 shell 學習者們能夠透過尋找答案的過程,好好的將 shell 基礎打紮實一點...
          當然了,這些問題我也會逐一解說一遍。只是,我不敢保證甚麼時候能夠完成這趟任務。
          除了時間關係外,個人功力實在有限,很怕匆忙間誤導觀眾就糟糕了。
          若能拋磚引玉,誘得其他前輩出馬補充,那才真的是功德一件﹗

          shell 十三問:

          1) 為何叫做 shell ?
          http://bbs.chinaunix.net/viewthr ... p;page=2#pid1454336
          2) shell prompt(PS1) 與 Carriage Return(CR) 的關係? (2008-10-30 02:05 最後更新)
          http://bbs.chinaunix.net/viewthr ... p;page=2#pid1467910
          3) 別人 echo、你也 echo ,是問 echo 知多少?( 2008-10-30 02:08 最後更新)
          http://bbs.chinaunix.net/viewthr ... p;page=3#pid1482452
          4) " "(雙引號) 與 ' '(單引號)差在哪?  (2008-10-30 02:07 最後更新)
          http://bbs.chinaunix.net/viewthr ... p;page=4#pid1511745
          5) var=value?export 前後差在哪? (2008-10-30 02:12 最後更新)
          http://bbs.chinaunix.net/viewthr ... p;page=5#pid1544391
          6) exec 跟 source 差在哪? (2008-10-30 02:17 最後更新)
          http://bbs.chinaunix.net/viewthr ... p;page=6#pid1583329
          7) ( ) 與 { } 差在哪?
          http://bbs.chinaunix.net/viewthr ... p;page=6#pid1595135
          8) $(( )) 與 $( ) 還有${ } 差在哪? (2008-10-30 02:20 最後更新)
          http://bbs.chinaunix.net/viewthr ... p;page=7#pid1617953
          9) $@ 與 $* 差在哪?
          http://bbs.chinaunix.net/viewthr ... p;page=7#pid1628522
          10) && 與 || 差在哪? (2008-10-30 02:21 最後更新)
          http://bbs.chinaunix.net/viewthr ... p;page=7#pid1634118
          11) > 與 < 差在哪? (2008-10-30 02:24 最後更新)
          http://bbs.chinaunix.net/viewthr ... p;page=7#pid1636825
          12) 你要 if 還是 case 呢? (2008-10-30 02:25最後更新)
          http://bbs.chinaunix.net/viewthr ... p;page=8#pid1679488
          13) for what? while 與 until 差在哪? (2008-10-30 02:26最後更新)
          http://bbs.chinaunix.net/viewthr ... p;page=8#pid1692457

          補充問題:
          b1) [^ ] 跟 [! ] 差在哪?
          Part-I(Wildcard): (2008-10-30 02:25 最後更新)
          http://bbs.chinaunix.net/viewthr ... ;page=16#pid2930144
          Part-II(Regular Expression): (2008-10-30 02:26 最後更新)
          http://bbs.chinaunix.net/viewthr ... ;page=16#pid2934852


          --------------
          說明:
          1) 歡迎大家補充/擴充問題。
          2) 我接觸電腦中文名稱時是在台灣,因此一些術語或與大陸不同,請自行轉換。
          3) 我會不定時"逐題"說明(以 Linux 上的 bash 為環境)。同時,也會在任何時候進行無預警修改。請讀者自行留意。
          4) 本人於本系列所發表的任文章均可自由以電子格式(非印刷)引用、修改、轉載,且不必註明出處(若能註明 CU 更佳)。
          當然,若有錯漏或不當結果,本人也不負任何責任。
          5) 若有人願意整理成冊且付印者,本人僅保留著作權,版權收益之 30% 須捐贈與 CU 論壇管理者,剩餘不究。

          ---------
          建議參考討論:
          1) shaoping0330 兄關於變量替換的補充:
          (連結在改版後已經失效)

          2) shaoping0330 兄關於 RE 的說明:
          http://bbs.chinaunix.net/forum/viewtopic.php?t=393964

          3) 關於 nested subshell 的討論:
          (連結在改版後已經失效)

          4) 關於 IFS 的討論:
          http://bbs.chinaunix.net/forum/viewtopic.php?t=512925

          ---------
          * 感謝 lkydeer 兄整理 word/pdf 版本方便大家参考:
          http://bbs.chinaunix.net/viewthr ... &extra=page%3D2

          [ 本帖最后由 網中人 于 2008-11-4 02:12 编辑 ]

          评分

          参与人数 2可用积分 +5 信誉积分 +5 收起 理由
          substr函数 + 5 赞一个!
          mocou + 5 精品文章

          查看全部评分

          论坛徽章:
          0
          2 [报告]
          发表于 2003-12-09 02:54 |只看该作者

          shell 十三問?

          感谢版主~~ 我也在学习Shell编程,开始打个好基础。

          论坛徽章:
          1
          3 [报告]
          发表于 2003-12-09 07:24 |只看该作者

          shell 十三問?

          很有“杀伤力”的问题,希望大家踊跃参与,共同商榷!

          论坛徽章:
          0
          4 [报告]
          发表于 2003-12-09 09:01 |只看该作者

          shell 十三問?

          好问题!值得仔细琢磨琢磨...

          论坛徽章:
          0
          5 [报告]
          发表于 2003-12-09 09:53 |只看该作者

          shell 十三問?

          晕了~~这些题我一个也说不清楚
              

          论坛徽章:
          0
          6 [报告]
          发表于 2003-12-09 10:17 |只看该作者

          shell 十三問?

          只想知道答案。

          论坛徽章:
          0
          7 [报告]
          发表于 2003-12-09 10:31 |只看该作者

          shell 十三問?

          关于第一个问题,什么是shell

          作者:Rick Rummel


          介绍
          你可以做许多事情而不必知道它们实际上如何运作。比如,你不必懂得发动机燃烧的物理原理就可以开汽车。缺乏电子知识也不会阻止
          你用CD机听音乐。不知道什么是Shell和它的工作原理,你还是可以使用UNIX。但是,知道这些你可以更好地利用UNIX。
          一个UNIX系统有三种具有代表性的Shell可用:Bourne
          shell,Korn shell,C shells。它们会在11,12,13章讨论。在这一章中,你会学到:

          什么是Shell
          Shell可以为你做什么
          Shell和整个系统的关系



          内核与Shell


          坚果的壳保护其内部的核,同样一个UNIX
          shell提供一个外设的保护层。当你启动一台基于UNIX的计算机时,UNIX的程序被调入计算机的内存里,直到你关机。这个程序叫做内
          核(kernel),它执行许多底级和系统级的工作。内核有责任解释基本指令并将其送到处理器。内核也负责运行和调度进程,以及执行所
          有的输入输出。内核是UNIX系统的心脏,内核有且只有一个。

          你也许对内核职责的关键性有点迷惑,而内核指令同样的复杂和高技术性。为了对用户屏蔽内核的复杂性,也为了保护内核以免用户误操
          作造成损害,在内核的周围建了一个外壳(shell)。用户向shell提出请求,shell解释并将请求传给内核。这一节剩下的部分解释这个外层
          是如何建立的。

          一旦内核调入内存,他就准备执行用户的请求。然而,用户首先得连接登录,然后发出请求。不管怎样,用户登录,内核必须知道用户是
          谁以及如何与他通话。为了做到这点,内核调用两个特殊的程序,getty和login.对应每个用户的登录点--通常称为一个tty--内核调用
          getty程序。这个过程被称为spawning(spawn原意是产卵)。getty显示一个登录提示,接着不断地监视通话点等待用户名的输入。当
          getty取得任何输入时,它便调用login程序。login建立用户的身份并验证他登录的权利。login程序检查password(密码)文件。如果用
          户输入的密码不正确,控制将从登录点返回到getty。如果正确,login调用password文件里用户条目中所记录的程序并将控制交给它。这
          个程序也许是一个字处理软件或者是电子表格程序,不过一般是被称为shell的程序。

          假设有四个用户已经登录进系统。这四个用户中,有两个正使用Bourne shell,一个使用Korn
          shell,还有一个使用电子表格程序。每一个用户都得到一份shell的拷贝以服务它的请求,但是内核只有一个。使用shell不会阻碍用户使用
          电子表格或别的程序,但那些程序是运行在活动的shell下的。shell是一个单一用户专用的程序,它在用户和UNIX内核之间提供了一个界
          面。

          你不必一定要使用shell来存取UNIX。上面的例子中,有个用户使用电子表格取代了shell。当这个用户登录进来时,电子表格程序启动。
          当它退出电子表格程序时,他也就退出了系统。当强调安全性或者希望将用户与任何UNIX的界面屏蔽开时,这个技术挺有用。缺点是用
          户不能使用mail或其他UNIX的功能。

          因为login后可以执行任何程序--shell只是简单的一个程序--你就有可能编写自己的shell。事实上,三个独立开发的shell已经成为UNIX
          标准的一部分。它们是:


          Bourne shell,由Stephen Bourne开发
          Korn shell,由David Korn开发
          C shell,由Bill Joy开发

          shell的多样性使你可以选择最适合你或者你感到最亲近的界面。



          shell的功能



          不过你选择哪个标准的shell并没有多大关系,因为三个shell都有相同的目的:在UNIX下为用户提供一个界面。为了达到这个目标,三个
          shell都提供了相同的基本功能:


          命令行解释功能
          启动程序
          输入输出重定向
          管道连接
          文件名置换
          变量维护
          环境控制
          shell编程


          命令行解释



          当你登录进来,启动一个交互式的shell时,你会看到一个shell提示,通常是$,%或者#符号的形式。当你在提示符下敲进一行字符后,
          shell就试图解释它。shell提示符下的输入有时被称为一个命令行。命令行的基本格式是
          command arguments
          命令名 参数(一个或多个))

          command(命令)是可执行的UNIX命令,程序,实用工具,或shell程序。arguments(参数)被传递给执行程序。大多数的UNIX实
          用程序要求参数有以下的格式:
          option filenames
          选项 文件名(一个或多个))

          举个例子,在命令行下有

          $ ls -l
          file1 file2

          在这个命令行中有三个参数传递给ls,第一个是个选项,剩下的两个是文件名。shell为内核所做的事情之一是减少不需要的信息。对于计
          算机,空白(whit-espace)是一类无用信息;因此,有必要知道shell在遇到空白时做了些什么。空白由空格,水平制表符和换行符组成。
          考虑这个例子:

          $ echo part A part B part C

          part A part B part C

          这儿将命令行解释为有六个参数的echo命令并删除了参数之间的空白。假设如果你正在打印报告头想保留空白,你就得用引号将数据括起
          来就象下面所示:

          $echo part A part B part C

          part A part B part C

          单引号阻止shell检查引号里面。现在shell将这一行解释为带一个参数的echo命令,而这个参数正好是包含空白的字符串。

           

          启动程序


          当shell解释完命令行后,它就启动命令行中要求的程序。实际是内核执行这个程序。为了启动程序执行,shell在PATH环境变量指定的目
          录中搜索可执行文件。当它找到这个文件,就启动一个子shell来运行程序。你应该知道子shell不必影响它父亲的环境设置而建立和操纵自
          己的环境。比如一个子shell可以改变它的工作目录,当它运行完后,其父shell的工作目录仍保持不变。

           

          输入输出重定向



          shell在执行程序前进行重定向。考虑下面两个例子,其中使用wc单词统计工具统计有五行的数据文件:

          $wc -l fivelines

          5 fivelines

          $wc -l 5

          这里有一点微小的差异。在第一个例子中,wc知道它应该出去寻找名为fivelines的文件并对其进行操作。因为wc知道文件名,所以它将其
          显示给用户。在第二个例子中,wc仅看到数据而不知道这些数据从那里来,因为shell做了定位和重定向数据到wc的工作,也因此wc无法
          显示文件名。

           

          管道连接

            管道是输入输出重定向的特例,它将一个命令的输出直接连到另一个命令的输入,因此管道也是在调用程序前建立的。考虑下面的命
          令行:

          $who|wc -l

          5

          shell没将who的输出显示到屏幕上,而是定向到wc的输入。

           

          文件名置换

           


          shell有责任进行文件名的替换。shell在执行程序前做替换。举个例子:

          $echo
          *

          file1 file2 file3 file3x file4

          这儿,星号被扩展为五个文件名,并被传递给echo作为五个参数。如果你想显示一个星号,你应该用引号将它括起来。

             

          变量维护

            

          shell有能力进行变量维护。变量是存储数据为将来所用的场所。用等号(=)可以给变量赋值。

          $LOOKUP=/usr/mydir

          在这里,shell建立一个LOOKUP变量,并将/usr/mydir赋给它。稍后,你可以在命令行上通过在变量名之前加$符号来使用变量值。考虑
          这些例子:

          $echo $LOOKUP

          /usr/mydir

          $echo LOOKUP

          LOOKUP



          C-shell的用户应该注意:C-shell中的赋值不同于Bourne和Korn
          shell。C-shell使用set命令进行赋值。

          $set LOOKUP =
          /usr/mydir

          注意在等号两边要加空格。



          就象文件名的置换一样,变量名的置换也是在调用程序前进行。第二个例子省略了$符号。因此,shell只是简单地将字符串传递给echo作
          参数。在变量替换中,变量的值取代了变量名。例如在:

          $ls $LOOKUP/filename

          用/usr/mydir/filename做参数调用ls。  

          环境控制


          当login程序调用你的shell时,shell对你的环境进行设置,其中包括你的home(家)目录,你使用的终端类型以及用来搜索可执行文件的
          路径。环境被存储在环境变量中。举个例子,要改变终端类型,你需要改变TERM变量中的值,就象下面所示的:

          $echo $TERM

          vt 100

          $TERM=ansi

          $echo $TERM

          ansi



          注意在C-shell中,给环境变量赋值使用setenv命令。

          %setenv TERM
          vt100



          shell编程

           


          你已经看到shell可以用来解释命令行,维护变量,执行程序。另外shell还是一种编程语言。通过使用流程控制和条件判断来组合命令与变
          量赋值,你就拥有了一个有力的编程工具。使用shell作为一门编程语言,你可以使重复的任务自动化,写报告,甚至你可以建立和操纵自
          己的数据文件。



          来源:
          http://www.linuxeden.com/edu/doctext.php?docid=1337

          论坛徽章:
          0
          8 [报告]
          发表于 2003-12-09 11:50 |只看该作者

          shell 十三問?

          单引号‘’
          取消除单引号以外的任何字符的特殊含义。如:echo  ‘my name is  $name’其结果为:my name is $name ,此时$只作为一个普通字符使用了。

          双引号“”
          取消除双引号、$号以及_号以外的所有字符的特殊含义

          论坛徽章:
          0
          9 [报告]
          发表于 2003-12-09 11:51 |只看该作者

          shell 十三問?

          输入转向符〈
          用于指定输入的设备或文件。如:mail root〈message则将文件message 的内容发送给root。

          输出转向符 〉
          用于将输出发送到指定的设备或文件。如:lf 〉myfile 其结果是将lf的执行结果放到文件myfile中(同时清空文件中原有的数据),而不显示到屏幕上。

          论坛徽章:
          0
          10 [报告]
          发表于 2003-12-09 11:56 |只看该作者

          shell 十三問?

          && 和 ||
          其作用是使管道线有条件地执行。其使用方法为:
          command1 && command2:当且仅当command1执行成功后才执行command2
          command1 || command2:当且仅当command1执行失败后才执行command2
          12345678910... 80下一页
          返回列表
          雷锋28网 雷锋28网 程序设计 Shell shell 十三問?
          您需要登录后才可以回帖 登录 | 注册

          本版积分规则 发表回复

            

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

          清除 Cookies - ChinaUnix - Archiver - WAP - TOP
            
          分享:

          收藏

          --

          --

          无障碍浏览