LINUX快速入门第八章:Shell基础

我们平时所说的 Shell 可以理解为 Linux 系统提供给用户的使用界面。Shell 为用户提供了输入命令和参数并可得到命令执行结果的环境。当一个用户登录 Linux 之后,系统初始化程序 init 就根据 /etc/passwd 文件中的设定,为每个用户运行一个被称为 Shell(外壳)的程序。

确切地说,Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至编写一些程序。

Shell 处在内核与外层应用程序之间,起着协调用户与系统的一致性、在用户与系统之间进行交互的作用。图 1 是 Linux 系统层次结构图,Shell 接收用户输入的命令,并把用户的命令从类似 abed 的 ASCII 码解释为类似 0101 的机器语言,然后把命令提交到系统内核处理;当内核处理完毕之后,把处理结果再通过 Shell 返回给用户。

换句话说:

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

Shell 与其他 Linux 命令一样,都是实用程序,但它们之间还是有区别的。一旦用户注册到系统后,Shell 就被系统装入内存并一直运行到用户退出系统为止;而一般命令仅当被调用时,才由系统装入内存执行。

与一般命令相比,Shell 除了是一个命令行解释器,同时还是一门功能强大的编程语言,易编写,易调试,灵活性较强。作为一种命令级语言,Shell 是解释性的,组合功能很强,与操作系统有密切的关系,可以在 Shell 脚本中直接使用系统命令。大多数 Linux 系统的启动相关文件(一般在 /etc/rc.d 目录下)都是使用 Shell 脚本编写的。

同传统的编程语言一样,Shell 提供了很多特性,这些特性可以使 Shell 脚本编程更为有用,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及中断处理等。

说了这么多,其实我们在 Linux 中操作的命令行界面就是 Linux 的 Shell,也就是 Bash,但是我们的图形界面是 Shell 吗?其实从广义讲,图形界面当然也是 Shell,因为它同样用来接收用户的操作,并传递到内核进行处理。不过,这里的 Shell 主要指的是 Bash。

Shell 脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。

Shell的分类

目前 Shell 的版本有很多种,如 Bourne Shell、C Shell、Bash、ksh、tcsh 等,它们各有特点,下面简要介绍一下。

最重要的 Shell 是 Bourne Shell,这个命名是为了纪念此 Shell 的发明者 Steven Bourne。从 1979 年起,UNIX 就开始使用 Boume Shell。Bourne Shell 的主文件名为 sh,开发人员便以 sh 作为 Bourne Shell 的主要识别名称。

虽然 Linux 与 UNIX 一样,可以支持多种 Shell,但 Boume Shell 的重要地位至今仍然没有改变,许多 UNIX 系统中仍然使用 sh 作为重要的管理工具。它的工作从开机到关机,几乎无所不包。在 Linux 中,用户 Shell 主要是 Bash,但在启动脚本、编辑等很多工作中仍然使用 Bourne Shell。

C Shell 是广为流行的 Shell 变种。C Shell 主要在 BSD 版的 UNIX 系统中使用,发明者是柏克莱大学的 Bill Joy。C Shell 因为其语法和 C 语言类似而得名,这也使得 UNIX 的系统工程师在学习 C Shell 时感到相当方便。

Bourne Shell 和 C Shell 形成了 Shell 的两大主流派别,后来的变种大都吸取这两种 Shell 的特点,如 Korn、 tcsh 及 Bash。

Bash Shell 是 GNU 计划的重要工具之一,也是 GNU 系统中标准的 Shell。Bash 与 sh 兼容,所以许多早期开发出来的 Bourne Shell 程序都可以继续在 Bash 中运行。现在使用的 Linux 就使用 Bash 作为用户的基本 Shell。

Bash 于 1988 年发布,并在 1995-1996年推出Bash 2.0。在这之前,广为使用的版本是1.14,Bash 2.0增加了许多新的功能,以及具备更好的兼容性。表 2 中详细列出了各版本的具体情况。

注意,Shell 的两种主要语法类型有 Bourne 和 C,这两种语法彼此不兼容。Boume 家族主要包括 sh、ksh、Bash、psh、zsh;C 家族主要包括 csh、tcsh(Bash 和 zsh 在不同程序上支持 csh 的语法)。

本章讲述的脚本编程就是在 Bash 环境中进行的。不过,在 Linux 中除了可以支持 Bash,还可以支持很多其他的 Shell。我们可以通过 /etc/shells 文件来査询 Linux 支持的 Shell。命令如下:

在 Linux 中,这些 Shell 是可以任意切换的,命令如下:

用户信息文件 /etc/passwd 的最后一列就是这个用户的登录 Shell。命令如下:

大家可以看到,root 用户和其他可以登录系统的普通用户的登录 Shell 都是 /bin/bash,也就是 Linux 的标准 Shell,所以这些用户登录之后可以执行权限允许范围内的所有命令。不过,所有的系统用户(伪用户)因为登录 Shell 是 /sbin/ndogin,所以不能登录系统。

笔记:

sh/bash/csh/Tcsh/ksh/pdksh等shell的区别



  • LINUX蹇熷叆闂ㄧ鍏珷:Shell鍩虹
    绛旓細2銆佸紑澶寸▼搴忓繀椤讳互涓嬮潰鐨勮寮濮嬶紙蹇呴』鏂瑰湪鏂囦欢鐨勭涓琛岋級锛氾紒/bin/sh绗﹀彿#锛佺敤鏉ュ憡璇夌郴缁熷畠鍚庨潰鐨勫弬鏁版槸鐢ㄦ潵鎵ц璇ユ枃浠剁殑绋嬪簭銆傚湪杩欎釜渚嬪瓙涓垜浠娇鐢/bin/sh鏉ユ墽琛岀▼搴忋3銆佹部鐫鍓嶉潰鐨勮建杩癸紝鎺ヤ笅鏉ユ槸Linux涓璼hell鑴氭湰鐨勫涔犮傝繖瀵逛簬鐢熶俊宸ョ▼甯堝悗缁鐞嗗ぇ閲(娴烽噺鏇村悎閫備簺)鏁版嵁鏄潪甯搁潪甯搁噸瑕佺殑锛屼絾鏄悓鏍...
  • LINUX蹇熷叆闂ㄧ鍏珷:Shell鍩虹
    绛旓細娉ㄦ剰锛孲hell 鐨勪袱绉嶄富瑕佽娉曠被鍨嬫湁 Bourne 鍜 C锛岃繖涓ょ璇硶褰兼涓嶅吋瀹广侭oume 瀹舵棌涓昏鍖呮嫭 sh銆乲sh銆丅ash銆乸sh銆亃sh锛汣 瀹舵棌涓昏鍖呮嫭 csh銆乼csh锛圔ash 鍜 zsh 鍦ㄤ笉鍚岀▼搴忎笂鏀寔 csh 鐨勮娉曪級銆傛湰绔犺杩扮殑鑴氭湰缂栫▼灏辨槸鍦 Bash 鐜涓繘琛岀殑銆備笉杩囷紝鍦 Linux 涓櫎浜嗗彲浠ユ敮鎸 Bash锛岃繕鍙互鏀寔寰堝...
  • Linux涓殑sh鍛戒护鐨勮缁嗚В閲
    绛旓細-c string锛氬懡浠や粠-c鍚庣殑瀛楃涓茶鍙栥-i锛氬疄鐜拌剼鏈氦浜掋-n锛氳繘琛宻hell鑴氭湰鐨勮娉曟鏌ャ-x锛氬疄鐜皊hell鑴氭湰閫愭潯璇彞鐨勮窡韪備簩銆Linux涓殑sh鍛戒护鐨勫叿浣撲緥瀛 浣跨敤-x閫夐」璺熻釜鑴氭湰璋冭瘯shell鑴氭湰锛岃兘鎵撳嵃鍑烘墍鎵ц鐨勬瘡涓琛屽懡浠や互鍙婂綋鍓嶇姸鎬侊細[root@AY1307311912260196fcZ satools]# sh -x check_ssh_login.sh...
  • linux鏂囦欢涓殑sh鏄粈涔堟剰鎬?
    绛旓細linux涓.sh鏂囦欢鏄剼鏈枃浠讹紝涓鑸兘鏄痓ash鑴氭湰銆傝剼鏈枃浠惰嫳鏂囦负Script銆傚疄闄呬笂鑴氭湰灏辨槸绋嬪簭锛屼竴鑸兘鏄敱搴旂敤绋嬪簭鎻愪緵鐨勭紪绋嬭瑷銆傚簲鐢ㄧ▼搴忓寘鎷祻瑙堝櫒(javaScript銆乂BScript)銆佸濯掍綋鍒涗綔宸ュ叿锛屽簲鐢ㄧ▼搴忕殑瀹忓拰鍒涗綔绯荤粺鐨勬壒澶勭悊璇█涔熷彲浠ュ綊鍏ヨ剼鏈箣绫汇傝剼鏈枃浠剁被浼间簬DOS鎿嶄綔绯荤粺涓殑鎵瑰鐞嗘枃浠讹紝瀹冨彲浠ュ皢涓嶅悓鐨勫懡...
  • linux涓.sh鏂囦欢鎬庝箞杩愯
    绛旓細1銆佺‘淇.sh鏂囦欢鍏锋湁鎵ц鏉冮檺锛氬湪缁堢涓紝浣跨敤ls-l鍛戒护鏌ョ湅鏂囦欢鏉冮檺銆傚鏋.sh鏂囦欢娌℃湁鎵ц鏉冮檺锛屽彲浠ヤ娇鐢╟hmod +x filename.sh鍛戒护涓烘枃浠舵坊鍔犳墽琛屾潈闄愩傚叾涓紝filename.sh鏄杩愯鐨勮剼鏈枃浠跺悕銆2銆佹墦寮缁堢锛氬湪 Linux 涓紝鎵撳紑涓涓粓绔獥鍙c3銆佸垏鎹㈠埌.sh鏂囦欢鎵鍦ㄧ殑鐩綍锛氫娇鐢╟d鍛戒护鍒囨崲鍒.sh鏂囦欢鎵鍦...
  • linux杩愯sh鏂囦欢鍛戒护linux杩愯sh
    绛旓細鍐嶈緭鍏ワ細sudo./*.sh鍙畨瑁呭埌浠绘剰鐩綍锛./*.sh鍙畨瑁呭埌褰撳墠鐢ㄦ埛鏈夋潈闄愮殑鐩綍 .bin鏂囦欢瀹夎鏂规硶锛氳繍琛岀粓绔埌鏂囦欢鐩綍涓 鍦ㄧ粓绔緭鍏ワ細sudochmod+x*.bin 鍐嶈緭鍏ワ細sudo./*.bin鍙畨瑁呭埌浠绘剰鐩綍锛./*.bin鍙畨瑁呭埌褰撳墠鐢ㄦ埛鏈夋潈闄愮殑鐩綍 鍏嶈垂鎻愪緵鏈鏂Linux鎶鏈暀绋嬩功绫嶏紝鍏ラ棬鑷涔︾睄銆linux灏辫杩欎箞瀛︺嬶紝...
  • linux 鍛戒护涓殑sh鏄粈涔堟剰鎬??
    绛旓細1銆sh鏄linux涓繍琛宻hell鐨勫懡浠わ紝鏄痵hell鐨勮В閲婂櫒锛宻hell鑴氭湰鏄痩inux涓3灞備笌鍛戒护琛岀晫闈紝鐢ㄦ埛鍙互鍦╯hell鑴氭湰杈撳叆鍛戒护鏉ユ墽琛屽悇绉嶅悇鏍风殑浠诲姟銆傝杩愯shell鑴氭湰锛岄閫夐渶瑕佺粰shell鑴氭湰鏉冮檺锛岃繖閲岄噷浠ello.sh鏂囦欢涓轰緥锛岄鍏堥渶瑕佹寜涓嬧渃rtl+shift+T鈥濇墦寮缁堢绐楀彛锛2銆佹帴鐫鍏堢粰鈥渉ello.sh鈥濇枃浠舵坊鍔爔鏉冮檺chmod ...
  • linux鎬庝箞杩愯sh鏂囦欢
    绛旓細鍦Linux涓紝杩愯.sh鏂囦欢鎸囩殑鏄墽琛屼竴涓猄hell鑴氭湰鏂囦欢锛孲hell鑴氭湰鏄竴绉嶆枃鏈枃浠讹紝鍏朵腑鍖呭惈涓绯诲垪鍛戒护锛岃繖浜涘懡浠ゆ寜椤哄簭鎵ц锛屽彲浠ョ敤浜庤嚜鍔ㄥ寲鎵ц涓绯诲垪鎿嶄綔銆傚湪Linux涓紝杩愯.sh鏂囦欢锛圫hell 鑴氭湰鏂囦欢锛夋湁鍑犵鏂规硶锛屼綘鍙互閫夋嫨鍏朵腑涓绉嶉傚悎浣犵殑鏂瑰紡锛1銆佺洿鎺ヨ繍琛岋細缁.sh鏂囦欢娣诲姞鎵ц鏉冮檺锛屽苟鐩存帴鍦ㄧ粓绔腑杩愯...
  • linux鎬庝箞杩愯sh鏂囦欢linux鎬庝箞杩愯sh
    绛旓細1銆乼ouchhello.sh 2銆乿imhello.sh閿叆i鎻掑叆#!/bin/shechohelloworld;閿叆:esc:wq 3銆乧hmod700hello.sh4.銆佹墽琛./hello.sh Linux涓嬮潰濡備綍杩愯SH鏂囦欢锛熷懡浠よ涓嬮潰:1.chmod绌烘牸"+x"绌烘牸浣犵殑sh鏂囦欢鍚(+x鏄竴涓暣浣,涓嶈鎷嗗紑)2.杈撳叆"./浣犵殑sh鏂囦欢鍚"鍗冲彲鎵ц涓句緥:1chmod+xhelloworld.sh2./...
  • linux涓sh鍛戒护鎬庝箞閫鍑烘潵?
    绛旓細linux缁堢涓緭鍏sh鍛戒护鍚庤閫鍑簊h涓鑸湁涓ょ鏂规硶銆1銆佹墽琛宔xit鍛戒护閫鍑 exit鍛戒护鏄痵hell鍐呭缓鐨勫懡浠わ紝鐢ㄤ簬閫鍑哄綋鍓峴hell銆傝鏄庯細鍏堟墽琛屼簡sh鍛戒护锛岃繘鍏ュ悗锛岃緭鍏xit鍥炶溅鍗冲彲閫鍑 2銆佷篃鍙互鎸夊揩鎹烽敭ctrl+d閿紝閫鍑簊h
  • 本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网