什么是Shell 在Linux系统中,Shell是用户与系统内核之间进行交互的接口。 Shell这个单词的意思是 "外壳" ,它形象地表达出了Shell的作用。在UNIX以及Linux中,Shell就是套在内核外面的一层外壳。 正因为有Shell的存在,才向普通的用户隐藏了许多关于系统内核的细节。 Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大得多。 在UNIX或者Linux中,Shell既是用户交互的界面,也是控制系统的脚本语言。 Shell的分类 关于Shell的分类,在介绍Shell的历史的时候已经简单地介绍过一些了,下面对各种Shell程序做一个简单的概括。常见的几种Shell程序如下所述。 BourneShell:标识为sh,该Shell由SteveBourne在贝尔实验室时编写。在许多UNIX系统中,该Shell是root用户的默认的Shell。 BourneAgainShell:标识为bash,该Shell由BrianFox在1987年编写,是绝大多数Linux发行版的默认的Shell。 KornShell:标识为ksh,该Shell由贝尔实验室的DavidKorn在二十世纪八十年代早期编写。它完全向上兼容BourneShell并包含了CShell的很多特性。 C Shell:标识为csh,该Shell由BillJoy在BSD系统上开发。由于其语法类似于C语言,因此称为CShell。 对于这些Shell程序,其语法或多或少都有所区别。目前大部分人仍然建议使用标准的BourneAgainShell。 Shell不仅仅是充当用户与UNIX或者Linux交互界面的角色,还可以作为一种程序设计语言来使用。 通过Shell编程,可以实现许多非常实用的功能,提高系统管理的自动化水平 。在linux上搭建Shell编程环境 由于Linux本身都会默认安装Shell脚本的运行环境,所以通常情况下,并不需要用户额外安装什么软件。 在同一台Linux上面会同时安装多个Shell,并且,这些Shell的语法会有所不同,所以,用户在编写和执行Shell脚本的时候一定要弄清楚当前使用的是哪种Shell。用户可以使用系统变量$SHELL来获取当前系统默认的Shell。 echo $SHELL 从上面的输出结果可以得知,当前系统默认的Shell为bash。 我们都是指定使用的Shell为/bin/sh。实际上,在Linux中,这是一个指向/bin/bash的符号链接 ,如下: 这意味着,尽管我们在程序中指定的解释器为/bin/sh,但是实际上解释Shell脚本的是/bin/bash。 Shell作为一个软件包,当然也有版本,用户可以使用如下命令来查看bash的版本: echo $BASH_VERSION Shell 如何执行 Shell脚本程序有以下两种执行方式: (1)用户可以依次输入一系列的命令,交互式地执行它们; (2)用户也可以把所有的这些命令按照顺序保存在一个文件中,然后将该文件作为一个程序来执行。 交互式程序 在命令行上直接输入命令来交互式地执行Shell脚本是一种非常简单的方式。尤其是在测试Shell程序的时候,通过使用交互式方式,可以非常方便地得到程序执行的结果。 例:在当前目录中查找文件名包含"xml"这3个字符的文件。如果找到的话,则在当前屏幕上打印出来。我们可以在Shell提示符后面依次输入下面的代码: [root@linux~]# for filename in `ls .` > do > if echo "$filename" | grep "xml" > then > echo "$filename" > fi > done package.xml package.xml wbxml1.0.3 wbxml1.0.3 wbxml1.0.3.tgz wbxml1.0.3.tgz 命令行直接执行功能相同: for filename in `ls .`; do if echo "$filename" | grep "xml"; then echo "$filename"; fi; done 创建脚本 对于一组需要经常重复执行的Shell语句来说,将它们保存在一个文件中来执行是一种非常明智的做法。我们通常称这种包含多个Shell语句的文件为Shell脚本,或者Shell脚本文件。脚本文件都是普通的文本文件,可以使用任何的文本编辑器查看或者修改Shell脚本文件。 #! /bin/sh # for 循环开始 for filename in `ls .` do #如果文件名包含xml if echo "$filename" | grep "xml"; then #输出文件名 echo "$filename" fi done 从上面的代码可以得知,Shell程序中的注释以"#"符号开始,一直持续到该行的结束。请注意第一行#!/bin/sh,它是一种特殊形式的注释,其中,"#!"字符告诉系统同一行中紧跟在它后面的那个参数是用来执行本文件的程序。在这个例子中,/bin/sh是默认的Shell程序。当将脚本编辑完成之后,这个脚本还不能马上执行,把脚本设置为可执行。 Shell脚本的参数 从命令行传递给Shell脚本的参数又称为位置参数,这主要是因为Shell脚本会根据参数的位置来接收它们的值。在Shell脚本内部,用户可以通过一系列的系统变量来获取参数。这些变量的名称都是固定的,并且非常简单,只用1个字符表示,例如$0表示当前执行的脚本名称,$1表示传递给脚本的第1个参数等。 注: 由单引号或者双引号引起来的字符串作为一个参数进行传递,传递时会去掉引号。 对于包含空白字符或者其他的特殊字符的参数,需要使用单引号或者双引号进行传递。 变量$@可以以"参数1""参数2""参数3"……的形式返回所有的参数的值,因此,$@与"$1""$2""$3"……是等价的。如果用户传递的参数中包含空格或者其他的特殊字符,需要使用$@来获取所有的参数的值,不能使用$*。 变量$*以"参数1参数2参数3……"的形式将所有的参数作为一个字符串返回。通常情况下,参数值之间通过空格、制表符或者换行符来隔开,在默认情况下使用空格。 变量$#返回传递给脚本的参数的数量,不包括$0,即排除脚本的名称。 另外,如果用户传递的参数多于9个,则不能使用$10来引用第10个参数。为了能够获取第10个参数的值,用户必须处理或保存第1个参数,即$1,然后使用shift命令删除参数1并将所有剩余的参数下移1位,此时$10就变成了$9,依此类推。$#的值将被更新以反映参数的剩余数量。 参数扩展 用户需要编写一个脚本程序,并且这个脚本程序需要一个拥有许多值得参数,在程序中,用户希望根据这个参数的值来执行不同的操作。在这种情况下,单纯地依靠$1以及$2等变量已经不能满足需求了。此时,用户可以考虑使用参数扩展。 为了获取到这些参数的值,用户需要在Shell程序中使用getopts命令。 Shell脚本的基本元素 第2行,指定命令解读器:"#!/bin/bash"。 第4行,注释:说明某些代码的功能。 第5行,可执行语句:实现程序的功能。 指定命令解读器 通常会同时安装多个Shell程序,例如sh、bash或者csh等。而这些不同的Shell程序的语法会有些区别,那么到底使用哪个Shell来执行代码呢? 当用户在命令行中执行该程序时,当前的Shell会载入该程序的代码,并且读取其中的第2行,如果发现有"#!"标识,则表示当前的程序指定了解释并执行它的Shell。然后会尝试读取"#!"标识后面的内容,搜寻解释器的绝对路径。如果发现了指定的解释器,则会创建一个关于该解释器的进程,解释并执行当前脚本的语句。 Shell脚本的这个规定使得用户可以非常灵活地调用任何解释器,而不仅仅限于Shell程序。下面介绍如何在脚本文件中指定其他解释器程序。 在PHP脚本文件中指定PHP语言的解释器,然后执行文件中的PHP代码,代码如下: Shell脚本中的注释和风格 通过在代码中增加注释可以提高程序的可读性。传统的Shell只支持单行注释,其表示方法是一个井号"#",从该符号开始一直到行尾都属于注释的内容,如果需要多行注释内容的话,则在每行注释的开头都要加上"#"。 但是这并不意味着用户只能使用单行注释。实际上,用户还可以通过其他一些变通的方法来实现多行注释,其中,最简单的方法就是使用冒号":"配合heredocument,其语法如下: :<
露营热带火小众赛道,捧出百亿小巨头,小米华为争入局天下网商叶晨编辑王诗琪中秋节假期前,90后女孩小灵更新了露营设备。她用制冰机取代了保温杯装冰块,用电磁炉代替了卡式炉,还把家里的投屏仪和可移动幕布放进了车后备箱告别了气和火的过去,欧冠比赛,海法马卡比13巴黎圣日耳曼足球评论面对欧冠球队海法马卡比,巴黎圣日耳曼的状态显得慢热。最先破门的是海法马卡比,海法马卡比的球员切里轻轻一挑,球破门了。这时,巴黎圣日耳曼依然不急不缓,由梅西进了一球。上半场就12年总决赛雷霆对热火,詹皇场均28107,其他五位球星表现如何因为抱团的原因,杜兰特在过去几年拿下的荣誉被质疑含金量很低,其中就包括他得到的两届FMVP奖杯,在今年勇士夺冠之后,杜兰特抱团的呼声也是越来越高了,格林那一句你不来之前我们就是冠军一夜3消息!周琦曝无缘CBA,宏远迎马尚回归,郭艾伦辟谣续约辽篮对于CBA球迷而言,这个夏天最后的两个悬念,是周琦和郭艾伦这两位顶级本土球星,新赛季的最终去向究竟是哪里。其实悬念很快将会揭晓,因为CBA规定的注册截止期将至,至少我们可以知道,周欧冠变成追星现场!梅西传射助大巴黎逆转,马卡比秀出追星天花板欧冠小组赛第2比赛日,法甲班霸巴黎圣日耳曼浩浩荡荡奔赴以色列海港城市海法,挑战以甲豪强海法马卡比。大巴黎的到来,让海法这座海滨小城如过节一般,海法马卡比的主场更是座无虚席,球迷们云詹姆斯秀恩爱!一天17消息哈登马克西训练,施罗德暗示湖人感谢各位继续关注NBA长草期,和我一起了解NBA球星与球队最新动态。詹姆斯和保罗不满联盟处罚太阳老板的决定,库兹马与威少参加时装秀,戴维斯杜兰特训练,施罗德女儿身着湖人球衣疯狂暗示林昀儒打疯了!连续30横扫国乒选手,有望夺得3冠,8强已出一半北京时间9月15日下午,乒乓球WTT哈萨克斯坦赛混双8强名单已出一半,国乒组合1胜1负,陈垣宇陈熠03惨败不敌中国台北队的两大名将林昀儒陈思羽,而两位直拍新星徐海东吴洋晨则是30晋孔祥明与聂卫平离婚30年她再婚,为何没有退休金?他三婚后患癌头条创作挑战赛点击关注,每天都有名人故事感动您!孔祥明孔祥明曾是中国女子围棋的领军人物,是中国棋坛一代女中豪杰,也是我国围棋第一位女子八段棋手,享有中国女子围棋第一人的美誉。她三次CBA下赛季十大大前锋,大秋太稳,二飞全面,付豪进攻强CBA新赛季即将开打,下面盘点一下下赛季本土十大大前锋1胡金秋,今年25岁,身高2。11体重111公斤,上赛季场均21分7。6篮板1助攻,投篮命中率高达73,胡金秋是CBA投篮命中追上USB42。0标准Intel展示80Gbps的雷电新接口前不久USBIF官方公布了最新的USB42。0标准,速率最高提升到了80Gbps,是USB4的两倍,也是雷电4接口的2倍,但线缆需要升级为有源的。现在Intel也不甘示弱,同样展示华为手机平板鸿蒙系统设置(2)百度输入法华为版百度输入法华为版通知根据个人情况设置(同意)在输入面板点击左上角田字格更多设置登录账号(退出账号)根据个人情况设置输入设置基本设置中文词语联想模式默认(连续联想)根