<ruby id="x69ha"><address id="x69ha"></address></ruby>
    1. <tbody id="x69ha"></tbody>

          1. <th id="x69ha"></th>
          2. <dd id="x69ha"><track id="x69ha"></track></dd>
            <rp id="x69ha"></rp>
              免费注册 查看新帖 |

            Chinaunix

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

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

            论坛徽章:
            1
            荣誉版主
日期:2011-11-23 16:44:17
            跳转到指定楼层
            1 [收藏(0)] [报告]
            发表于 2003-12-09 02:48 |只看该作者 |倒序浏览
            我在 CU 的日子並不長,有幸在 shell 版上與大家結緣。
            除了跟眾前輩學習到不少技巧之外,也?吹讲簧倥笥训膯栴}。
            然而,在眾多問題中,我發現許多瓶頸都源於 shell 的基礎而已。
            每次要解說,卻總有千言萬語不知從何起之感...

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

            shell 十三問:

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

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


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

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

            2) shaoping0330 兄關於 RE 的說明:
            http://www.245567157.cn/forum/viewtopic.php?t=393964

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

            4) 關於 IFS 的討論:
            http://www.245567157.cn/forum/viewtopic.php?t=512925

            ---------
            * 感謝 lkydeer 兄整理 word/pdf 版本方便大家参考:
            http://www.245567157.cn/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
            荣誉版主
日期:2011-11-23 16:44:17
            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
            您需要登录后才可以回帖 登录 | 注册

            本版积分规则 发表回复

            DTCC2020中国数据库技术大会 限时8.5折

            【架构革新 高效可控】2020年6月4日~6日第十一届中国数据库技术大会将在北京隆重召开。

            大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

            http://dtcc.it168.com


            大会官网>>
            2019香港一肖精选中特资料
              

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

            清除 Cookies - ChinaUnix - Archiver - WAP - TOP