当前位置:文档之家› linux shell基础

linux shell基础

linux shell基础
linux shell基础

Linux shell 基础

1Shell的作用及常见种类

对于Linux内核来说,用户直接发出的操作指令它是―听不懂‖的,而SHELL程序在其中恰恰起到了类似于―翻译官‖的角色,它将用户输入的字符串―翻译‖成内核能够理解的控制指令,从而操作系统内核完成各种任务。

这就好比一个只会西班牙语的经理要带领一群只会说越南语的员工干活一样,中间肯定需要一个懂得两种语言的―翻译官‖(Shell)

?Shell是一个特殊的应用程序,它负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行

?交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是

大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,

shell也终止了。

1.1Shell的种类

●Bourne Shell

首个重要的标准Unix Shell是1970年底在V7 Unix(A T&T第7版)中引入的,并且以它的创始科技部基础条件平台―国家气象网络计算应用节点建设‖(2004DKA50730)资助者Stephen Bourne的名字命名。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。

● C Shell

Bill Joy于20世纪80年代早期,在Berkeley的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL 风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替

换、作业控制等功能。

●Korn Shell

有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C shell用来交互。为了改变这种状况,A T&T的bell实验室David Korn 开发了Korn shell。ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn shell广受用户的欢迎。它还新增了数学计算,进程协作(c oprocess)、行内编辑(inline editing)等功能。Korn Shell 是一个交互式的命令解释器和命令编程语言.它符合POSIX——一个操作系统的国际标准.POSIX不是一个操作系统,而是一个目标在于应用程序的移植性的标准——在源程序一级跨越多种平台。

●Bourne Again Shell (bash)

bash是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat, Slac kware, Caldera)都以bash 作为缺省的shell,并且运行sh时,其实调用的是bash。

●POSIX Shell

POSIX shell 是Korn shell的一个变种. 当前提供POSIX shell的最大卖主是Hew lett-Pac kard。在HP-UX 11.0 , POSIX shell 就是/bin/sh,而bsh 是/usr/old/bin/sh.

●各主要操作系统下缺省的shell:

AIX 下是Korn Shell.

Solaris缺省的是Bourne shell.

FreeBSD缺省的是C shell

HP-UX缺省的是POSIX shell.

1.2Shell环境的切换

?用户每次登录系统后自动加载的Shell程序,大多数Linux系统采用/bin/bash 作为默认登录Shell

?/etc/shells 文件记录了系统支持的有效登录Shell

?登录Shell :用户每次登录到Linux系统时自动加载的Shell程序

?直接输入Shell名称可开启新Shell,新运行的Shell程序作为当前Shell 程序的子进程,需要返回到原来的Shell环境时可以执行―exit‖命令或者

按Ctrl+D快捷键

?执行chsh命令,修改自己的登录Shell(从下次登录开始生效)

2Bash的常用功能

2.1.1Bash的命令历史

命令历史是Bash中用于提高命令输入效率的一项功能,能够让用户快速的

重复执行已经输入过的命令,减少重复输入工作。bash在一个历史缓冲区

中保留你执行的命令,并且允许你通过上和下的光标键在先前的命令间循

环以再次调用它们。

2.1.2查看历史命令

2.1.2.1使用↑、↓按键逐条翻看,允许编辑并重复执行

2.1.2.2执行:history 查看历吏命令

2.1.3清除历史命令

2.1.

3.1执行:history –c

2.1.4调用历史命令

2.1.4.1!n:执行历史记录中的第n条命令

2.1.4.2!str:执行历史记录中最近一次以―str‖开头的命令

2.1.5设置记录历史命令的条数

2.1.5.1修改HISTSIZE 参数(默认为1000条)

2.2Bash的命令别名

2.2.1命令别名

2.2.2为使用频率较高的复杂命令行设置简短的调用名称

2.2.3存放位置:~/.bashrc

2.2.4查看命令别名

如果你频繁地使用参数相同的某个命令,你可以让bash为它创建一个别名。这个别名将组合需要的参数,所以你无需记住它们或每次手工输入它们。

2.2.4.1格式:alias [别名]

2.2.4.2设置命令别名

2.2.4.2.1执行:alias 别名='实际执行的命令'

2.2.5取消已设置的命令别名

2.2.5.1格式:unalias 别名

2.3Bash的标准输入输出

2.3.1Linux 系统使用文件来描述系统的硬件、设备等资源,在用户通过操

作系统处理信息的过程中,包括以下几类交互设备文件

?标准输入:从该设备接收用户输入的数据

?标准输出:通过该设备向用户输出数据

?标准错误:通过该设备报告执行出错信息

2.3.2Bash的重定向操作

2.3.2.1标准输出重定向实例(一)

注意:ls命令正常输出在屏幕上,但使用了标准输出后,则将内容输出在file文件中

2.3.2.2标准输出重定向实例(二)

注意:“echo”命令是用于回显,本例中将“123456”回显到屏幕上。如果结合输出重定向,来实现修改文件的作用。(类拟vi命令)

2.3.2.3“>>”追加重输出定向实例(一)

注意:当多次使用输出重定向时,后面的输出会将前面的内容覆盖。因此要想将每次输出添加到上一次内容的后面则需要使用“>>”追加重输出定向。

2.3.2.4―2>‖错误输出输定向实例(一)

注意:当命令出现错误是不能使用输出重定向输出到文件里的,这时候需要使用错误输出重定向“2>”

2.3.2.5“&>”操作符应用实例(一)

注意:“&>”操作符可以将正确的命令和错误的命令都添加到文件中

2.3.2.6“<”输入重定向实例(一)

注意:管理员使用passwd 命令为用户设置密码时,每次都需要重复两次密码字符串,非常繁琐,若先编辑一个文档pass.txt 将密码写入,使用passwd 命令并结合–-stdin 选项,则可以从文件中读取并自动设置。

2.4管道操作

管道操作为不同命令之间的协同工作提供了一种机制。“|”左侧的命令输出的结果,将作为右侧的输入。

2.4.1管道实例(一)查看是否安装vsftpd软件包

2.4.2管道实例(二)过滤出/etc/vsftpd/vsftpd.conf 文件有效的字段

注意:这里的grep –v 是过滤的意思,“^#”是指以#号开头的部分,“^$”是指空行

2.4.3管道实例(三)使用管道来取出根分区占用百分比

注意:使用df –lh 命令来查看分区,我们要取出的是35 ,根分区是/dev/sdb3

我们的思路是:先取出一行,再取出某一段。这里的awk ?{print $5}‘是取出第5列的的意思,cat –d ―%‖–f 1 是以“%”为间隔取出的列的意思。

3Shell变量的应用

变量是一段有名字的连续存储空间。在源代码中通过定义变量来申请并命名这样的存储空间,并通过变量的名字来使用这段存储空间。变量是程序中数据的临时存放场所。在代码中可以只使用一个变量,也可以使用多个变量,变量中可以存放单词、

数值、日期以及属性。变量分为:用户自定义变量、环境变量、预定义变量、位置变量。

3.1用户自定义变量实例(一)

注意:a是变量名称,使用“=”来赋值,“12”是变量值,自定义变量格式为:变量名=变量值,“=”两边不要有空格。取值时使用“echo”命令,但要注意变量名前要加“$”符号代表引用。

3.2为变量赋值常用的方法

3.2.1双引号(“”)

注意:如果赋值为字符串,中间有空格,必须用“”双引号,当使用双引号里面有变量时,则会将变量里的内容取出赋值给外面的变量

3.2.2单引号(‘’)

注意:当使用单引号里面有变量时,并不会解释变量里的内容

3.2.3反撇号(` `)

注意:反撇号(` `)是键盘上“~”用于将命令执行结果赋值给变量。反撇号在实际工作上应用比较广泛。

3.2.4反撇号实例二查找bind相关的软件包,并将其卸载

注意:本例中通过反撇号,先执行rpm –qa |grep bind 找出bind的所有软件包,在用rpm –e 卸载

3.2.5还可以使用$( ) 来实现嵌套的执行

注意:反撇号不能嵌套,而$()可以

3.2.6Read命令

注意:read命令可以实现从键盘输入为变量赋值,例中a 和 b 是两个变量赋值时必须用空格隔开。

3.3变量的作用范围

注意:自定义变量“a”的值只在当前的shell之中有效,当切换到其他shell时则无效。

注意:如果将shell定义为全局变量,定义变量时必须加上关键字“export”

3.4清除自定义变量

注意:使用unset 命令,后面加上变量名即可

3.5环境变量

环境变量是系统自定义的,它包含了一个或者多个应用程序所将使用到的信息。例如$PA TH,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到PA TH中指定的路径去找。用户通过设置环境变量,来更好的运行进程,环境变量包含:$USER、$LOGNAME、$UID、$PA TH等。

3.5.1$USER表示当前登录的用户

3.5.2$UID表示当前用户的ID号

3.5.3$PA TH表示当前shell命令所查找的路径

注意:如果将PA TH变量设置为空则,将无法直接执行命令(必须加全路径才能运行)

3.5.4环境变量的配置文件/etc/profile

注意:当我们新安装软件,也要将命令路径加入到PA TH路径里。否则无法运行。最后将结果保存到/etc/profile下面。

3.6位置变量

共十个,$0 ----$ 10 我们要运行一些程序,当然要带一些参数,这些参数用位

置来表示,称为位置变量,第一个位置变量$0 表示名字,其余就自行定义了。

注意:先定义一个脚本,在脚本里返回三个位置变量,$0 $1 $2 默认这三个变量里没有值,需要我们传入。这里使用“sh”命令执行脚本。并传入三个参数分别为:12 23 34,那么$0值为a.sh 、$1值为12、$2值为23 本例没有返回$3的值。

3.7预定义变量

与定义变量是由Bash预先第一好的特殊变量,用户只能使用而不能创建。

3.8$#:表示命令行的位置参数的数量

3.9$*:表示所有位置参数的内容

3.10$?:表示执行命令返回结果0 为真1 为假

注意:如果查找到了为真,反之则为假

3.11$$:表示当前进程号

注意:21362 为当前shell 的进程号

3.12$!:表示当前进程进程名

4Shell脚本

什么是脚本?

(Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,毕竟它使用了Linux/Unix下的命令。)

注意:脚本头部需要#!/bin/bash 开头,执行方法包含四种:“sh”“./”全路径“.”

4.1.1使用“./”运行脚本

注意:使用“./”运行脚本必须给脚本执行权限。

4.1.2使用“全路径”运行脚本

注意:全路径也必须给执行权限。

4.1.3使用“.”运行脚本

注意:使用“.”执行脚本不需要执行权限

4.1.4使用“sh”运行脚本

5Shell 应用实例

每隔3天对数据库目录做一次完整备份

统计/var/lib/mysql 目录占用的空间大小、查看当前的日期,并记录到临时文件/tmp/dbinfo.txt 中

将/tmp/dbinfo.txt 文件、/var/lib/mysql 目录进行压缩归档,备份到/opt/dbbak/目录中备份后的包文件名中要包含当天的日期信息

最后删除临时文件/tmp/dbinfo.txt

[root@localhost ~]# vi /opt/dbbak.sh

#!/bin/bash

DAY=`date +%Y%m%d`

SIZE=`du -sh /var/lib/mysql`

echo "Date: $DAY" >> /tmp/dbinfo.txt

echo "Data Size: $Size" >> /tmp/dbinfo.txt

cd /opt/dbbak

tar zcf mysqlbak-${DAY}.tar.gz /var/lib/mysql /tmp/dbinfo.txt rm -f /tmp/dbinfo.txt

linux+shell脚本语言基础知识

linux shell脚本语言基础知识 一.shell简介 Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的界面,更确切的说,shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用Shell脚本编程,完成更加复杂的操作。 shell是一个命令解释器,它从输入设备读取命令,再将其转为计算机可以了解的指令,然后执行它。在linux中,shell又不仅是简单的命令解释器,而且是一个全功能的编程环境。 Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell (/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种就足够了。通常用Bash,也就是Bourne Again Shell进行编程。 二.shell使用 1.建立和运行shell程序 shell脚本程序:按照一定的语法结构把若干linux命令组织在一起,是这些命令按照我们的要求完成一定的功能。它可以进行类似程序的编写,并且不需要编译就能执行。(只需修改其权限) 像编写高级语言的程序一样,编写shell程序需要一个文本编辑器,如VI和VIM,通常使用VIM文本编辑器,支持更便利的插入模式。 首先使用VIM编辑器编辑一个hello.sh文件: #!/bin/bash #hello world example

linux操作系统之Shell编程

shell1.sh 显示日期和时间。 #!/bin/bash echo “current time is `date`” //date要加反引号 shell2.sh 显示文件名,并显示位置参数(执行时带一个参数)。(①$0是一个特殊的变量,它的内容是当前这个shell程序的文件名;②$1是一个位置参数,位置参数之间用空格分隔,shell取第一个位置参数替换程序文件中的$1,第二个替换$2,依次类推。) #!/bin/bash echo “the program name is $0” //$0是一个特殊的变数 echo “the first para is $1” //$1是一个位置参数 echo “the program exit” //执行时带一个参数如./shell2.sh abcd shell3.sh 判断并显示位置参数 #!/bin/bash if [ -d “$1”];then echo “$1 is directory ,existed” else echo “$1 does not exist ,now create it” mkdir $1 echo “$1 is created” fi //执行时带一个参数 shell4.sh 问候用户 #!/bin/bash user=`whoami` case $user in teacher) echo “hello teacher”;; root) echo “hello root”;; *) echo “hello $user,welcome” esac 1、求1+2+3+...+100的和是? #!/bin/bash

linux的shell技巧(很实用)

引言 Shell作为Unix系操作系统当中最有魅力且不可或缺的组件,经过数十载的洗礼不仅没有被淘汰,而且愈加变得成熟稳健,究其原因,大概因为它是个非常稳固的粘合剂,能够把大量功能强大的组件任意配搭,总能很好很快地完成用户的任务。 1.以sudo运行上条命令 $sudo!! 大家应该都知sudo,不解释。但通常出现的情况是,敲完命令执行后报错才发现忘了sudo。这时候,新手用户就会:按上箭头,按左箭头,盯着光标回到开始处,输入sudo,回车;高手用户就蛋定多了,按Ctrl-p,按Ctrl-a,输入sudo,回车。 这里介绍这个是天外飞仙级别的,对,就直接sudo!!。 当然这几种解决方式效果是完全一样的,只是款不一样,嗯,不解释。 两个感叹号其实是bash的一个特性,称为事件引用符(event designators)。!!其实相当于!-1,引用前一条命令,当然也可以!-2,!-50。默认情况下bash会在~/.bash_history文件内记录用户执行的最近500条命令,history命令可以显示这些命令。 关于事件引用符的更多用法可以深入阅读The Definitive Guide to Bash Command Line History。 2.以HTTP方式共享当前文件夹的文件 $python-m SimpleHTTPServer 这命令启动了Python的SimpleHTTPServer模块,考虑到Python在绝大多数的Linux发行版当中都默认安装,所以这个命令很可能是最简单的跨平台传文件的方法。 命令执行后将在本机8000端口开放HTTP服务,在其他能访问本机的机器的浏览器打开ttp://ip:8000即打开一个目录列表,点击即可下载。 3.在以普通用户打开的vim当中保存一个root用户文件 :w!sudo tee% 这题目读起来纠结,其实是很常见的,常常忘记了sudo就直接用vim编辑/ etc内的文件,(不过也不一定,vim发现保存的文件无法保存时候会提示)等

Linux下最常用的Shell命令的介绍

有些人仍然会有这种愚蠢的想法,他们认为使用Linux就必须使用Linux shell命令。胡说!你可以不懂得任何Linux命令,比如说ps,grep,ls等,但是你仍然可以使用很多现代的Linux桌面发行版。 Linux的系统管理员与桌面用户不一样,他们不像桌面用户一样使用Cinnamon,GNOME,Unity,或者KDE,他们所有的时间都是用Linux命令。 对于桌面用户来讲,若是了解一部分Linux命令,你可以更好的使用Linux,体验它的魅力,下面列举出了一些: Shell基础: 你可以通过打开Linux的terminal(终端)来执行Shell命令。Shell的种类有很多种,例如CSH,Bourne Shell,Korn Shell。在现在的大多数Linux发行版中,默认的Shell一般都是Bourne again shell(bash)。 想看看你的Shell是哪一种,执行下面的命令 echo $SHELL 在Linux中,$符号代表一个shell变量。所有的shell都用这种方式使用变量。有一些shell 变量在你的系统启动的时候就有了默认值。例如,$SHELL;$LOGNAME是你的登录名,而$PATH变量指明了你的shell命令的搜索范围。 echo命令的作用就是打印出你的输入。如果你的输入具有shell的特殊意义,例如shell变量,他就输出变量的值。 一个重要的地方是,你要注意文本的大小写。例如,ls,是DOS的dir命令的Linux版本。这个命令列出当前工作目录下的文件列表。如果你输入的是LS,你得到的只能是“找不到命令”的错误信息。 另外在Linux shell命令中一个重要的地方是,你可以将命令串起来。这是Unix/Linux从第一天开始就有的巧妙的特点。最简单的将命令连起来的办法就是使用“|”,我们称之为“pipe”。第一个命令的输出就是下一个命令的输入。 Linux命令有自己的语法规则: 基本的语法就像这样: command -option file 例如:

LinuxShell脚本教程(一):Shell入门

LinuxShell脚本教程(一):Shell入门 LinuxShell脚本教程(一):Shell入门 在这里我们介绍的是Bashshell(BourneAgainShell),它是目前大多数GUN/Linux系统默认的shell环境。书中所有的实验都是在Ubuntu14.04LTS环境下完成的。 在ubuntu14.04LTS系统中,已经默认安装了一个Terminal,我们可以通过多种方法打开终端。这里介绍两种: 方法一:通过系统自带的检索系统,我们可以轻松找到终端(Terminal),单击即可打开。检索系统可以通过快速启动栏右上角的按钮启动。 方法二:为了之后可以方便的打开终端,建议将终端固定在快速启动栏。操作方法为:通过方法一打开终端后,快速启动栏会出现一个终端的图表,在图表上单击鼠标右键,选择“固定在启动栏”即可将终端固定在快速启动栏。 默认情况下,终端提示符为:username@hostname或者 root@hostname#。代表普通用户,#代表root用户。 例如:我在打开终端后,提示符为:wxb@ubuntu:~$。 root是linux系统中权限最高的用户,能力大风险也大,因此不介意使用root用户作为登陆系统的.默认用户。 通常情况下,对于个人版linux操作系统,系统上会存在两个用户,即用户自己以及root用户。对于使用者来说,时有需要切换用户,以执行一些普通用户不能执行的操作,此处提供两种方法切换用户。 方法一:临时切换。顾名思义,这种切换方法仅仅是临时的,当指令执行完成后,就会切换到原来的用户。切换指令为:sudocommand,sudo是superuserdo的简写。

Linux操作系统下shell的工作原理

Linux下shell的工作原理 Bourne shell 允许您执行文件名替换。 命令参数经常是文件名。可以自动产生文件名的列表,作为命令行上的参数。要这样做,请指定shell 识别为模式匹配字符的字符。当命令包含这样的字符时,shell 使用目录中的文件名替换它。 注:Bourne shell 不支持基于等价字符分类的文件名扩展。 Bourne Shell 最初的UNIX shell是由Stephen R. Bourne于20世纪70年代中期在新泽西的AT&T贝尔实验室编写的,这就是Bourne shell。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。 C Shell Bill Joy于20世纪80年代早期,在Berkeley的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。 Korn Shell 有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C shell用来交互。为了改变这种状况,AT&T的bell实验室David Korn开发了Korn shell。ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn shell广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑(inline editing)等功能。Korn Shell 是一个交互式的命令解释器和命令编程语言.它符合POSIX——一个操作系统的国际标准.POSIX不是一个操作系统,而是一个目标在于应用程序的移植性的标准——在源程序一级跨越多种平台。 Bourne Again Shell (bash) bash是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat, Slackware, Caldera)都以bash作为缺省的shell,并且运行sh时,其实调用的是bash。 POSIX Shell POSIX shell 是Korn shell的一个变种. 当前提供POSIX shell的最大卖主是Hewlett-Packard。在HP-UX 11.0 , POSIX shell 就是/bin/sh,而bsh是/usr/old/bin/sh.

Linux目前流行Shell一览

Linux目前流行Shell一览(图) 本刊2005年4月期刊登的《Linux Shell编程入门》一文,介绍了在Linux中进行Shell教本编程的部分知识。由于篇幅所限没有介绍太多介绍目前主要Shell的种类,在此进行补充。 目前流行的Shell有bash、ksh、csh,用一个图表表示它们的关系如图。 bash bash是Linux系统默认使用的Shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,内部命令一共有40个。Linux使用它作为默认的Shell是因为它有以下的特色:(1)可以使用类似DOS下面的doskey的功能,用上下方向键查阅和快速输入并修改命令。 (2)自动通过查找匹配的方式,给出以某字串开头的命令。 (3)包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。 ksh ksh是Korn Shell的缩写,由Eric Gisin编写,共有42条内部命令。该Shell最大的优点是几乎和商业发行版的ksh完全相容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。 csh csh是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该Shell其实是指向/bin/tcsh这样的一个Shell,也就是说,csh其实就是tcsh。 shell编程之 shell问答录 前些天在CU上讨论一个统计正在执行的脚本数量的问题过程中,发现自己对于shell如何执行命令方面了解还是甚少,惭愧惭愧...期间得到waker兄的指点,在此表示感谢!他的说法除了个别地方不太准确外,基本上是正确的。这些天抽时间找了些资料研究了一下,又

从Linux程序中执行shell(程序、脚本)并获得输出结果

Contents 1. 前言 2. 使用临时文件 3. 使用匿名管道 4. 使用popen 5. 小结 1. 前言 Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作。比如实现一个ping程序来测试网络的连通性,实现ping函数需要写上200~300行代码,为什么不能直接调用系统的ping命令呢?通常在程序中通过system函数来调用shell命令。但是,system函数仅返回命令是否执行成功,而我们可能需要获得shell命令在控制台上输出的结果。例如,执行外部命令ping后,如果执行失败,我们希望得到ping的返回信息。 2. 使用临时文件 首先想到的方法就是将命令输出重定向到一个临时文件,在我们的应用程序中读取这个临时文件,获得外部命令执行结果,代码如下所示: #define CMD_STR_LEN 1024 int mysystem(char* cmdstring, char* tmpfile) { char cmd_string[CMD_STR_LEN]; tmpnam(tmpfile); sprintf(cmd_string, "%s > %s", cmdstring, tmpfile); return system(cmd_string); } 这种使用使用了临时文件作为应用程序和外部命令之间的联系桥梁,在应用程序中需要读取文件,然后再删除该临时文件,比较繁琐,优点是实现简单,容易理解。有没有不借助临时文件的方法呢? 3. 使用匿名管道 在<>一书中给出了一种通过匿名管道方式将程序结果输出到分页程序的例子,因此想到,我们也可以通过管道来将外部命令的结果同应用程序连接起来。方法就是fork一个子进程,并创建一个匿名管道,在子进程中执行shell命令,并将其标准输出dup 到匿名管道的输入端,父进程从管道中读取,即可获得shell 命令的输出,代码如下: int mysystem(char* cmdstring, char* buf, int len) { int fd[2]; pid_t pid;

linux_Shell(脚本)编程入门_实例讲解详解

linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell 使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash的大姐,bourne shell中运行)。 如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: chmod +x filename 然后,您可以通过输入: ./filename 来执行您的脚本。 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写: 变量名=值 取出变量值可以加一个美元符号($)在变量前面:

LinuxBashShell入门教程

BASH 的基本语法 ?最简单的例子—— Hello World! ?关于输入、输出和错误输出 ?BASH 中对变量的规定(与C 语言的异同) ?BASH 中的基本流程控制语法 ?函数的使用 2.1 最简单的例子—— Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是Hello World 程序,那么我们今天也就 从这个例子出发,来逐步了解BASH。 用vi 编辑器编辑一个hello 文件如下:#!/bin/bash # This is a very simple exampleecho Hello World 这样最简单的一个BASH 程序就编写完了。这里有几个问题需要说明一下: 一,第一行的#! 是什么意思二,第一行的/bin/bash 又是什么意思三,第二行是注释吗四,echo 语句五,如何执行该程序 #! 是说明hello 这个文件的类型的,有点类似于Windows 系统下用不同文件后缀来表示不同文件类型的意思(但不相同)。Linux 系统根据"#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过"man magic"命令及/usr/share/magic 文件来了解这方面的更多内容。在BASH 中第一行的"#!" 及后面的"/bin/bash" 就表明该 文件是一个BASH 程序,需要由/bin 目录下的bash 程序来解释执行。BASH 这个程序 一般是存放在/bin 目录下,如果你的Linux 系统比较特别,bash 也有可能被存放在 /sbin 、/usr/local/bin 、/usr/bin 、/usr/sbin 或/usr/local/sbin 这样的目录下;如果还找不到,你可以用"locate bash" "find / -name bash 2> /dev/null" 或"whereis bash" 这三 个命令找出bash 所在的位置;如果仍然找不到,那你可能需要自己动手安装一个BASH 软件包了。 第二行的"# This is a ..." 就是BASH 程序的注释,在BASH 程序中从“#”号(注意:后 面紧接着是“!”号的除外)开始到行尾的多有部分均被看作是程序的注释。的三行的echo 语句的功能是把echo 后面的字符串输出到标准输出中去。由于echo 后跟的是"Hello World" 这个字符串,因此"Hello World"这个字串就被显示在控制台终端的屏幕上了。需要注意的是BASH 中的绝大多数语句结尾处都没有分号。 如何执行该程序呢?有两种方法:一种是显式制定BASH 去执行: $ bash hello 或$ sh hello (这里sh 是指向bash 的一个链接,“lrwxrwxrwx 1 root root 4 Aug 20 05:41 /bin/sh -> bash”) 或者可以先将hello 文件改为可以执行的文件,然后直接运行它,此时由于hello 文件第 一行的"#! /bin/bash" 的作用,系统会自动用/bin/bash 程序去解释执行hello 文件的:$ chmod u+x hello$ ./hello 此处没有直接“$ hello”是因为当前目录不是当前用户可执行文件的默认目录,而将当前目 录“.”设为默认目录是一个不安全的设置。

(完整版)Linux下Shell编程

Linux下Shell编程 本文内容 ?Shell命令行的运行 ?编写、修改权限和执行shell程序的步骤 ?在shell程序中使用参数和变量 ?表达式比较、循环结构语句和条件结构语句 ?在shell程序中使用函数和调用其他shell程序 一、Shell命令行书写规则 学习目标 Shell命令行的书写规则 对shell命令行基本功能的理解有助于编写更好的shell程序,在执行shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(:)分隔命令,例如: [root@localhost root]# ls a* -l;free;df 长shell命令行可以使用反斜线字符(\)在命令行上扩充,例如: [root@localhost root]#echo “this is \ >long command” This is long command 注意: “>”符号是自动产生的,而不是输入的。 二、编写/修改权限及执行shell程序的步骤 学习目标 编写shell程序 执行shell程序 Shell程序有很多类似C语言和其他程序设计语言的特征,但是又没有程序语言那样的复杂。Shell程序是指放在一个文件中的一系列Linux命令和实用程序。在执行的时候,通过Linux操作系统一个接一个地解释和执行每条命令。首先,来编写第一个shell程序,从中学习shell程序的编写、修改权限、执行过程。 (一)编辑shell程序 编辑一个内容如下的源程序,保存文件名为date,可将其存放在目录/bin下。 [root@localhost bin]#vi date #!/bin/sh echo “Mr.$USER,Today is:” echo &date “+%B%d%A” echo “Wish you a lucky day!”

Linux常用shell命令大全

第2讲 Linux常用shell命令 使用LINUX虚拟机的快照3 以下文章由影视网收集于提供https://www.doczj.com/doc/f812445333.html, 实验目的: 掌握Linux常用命令 实验步骤: 一、基本命令 1、立即关机并重启动,执行如下命令: shutdown -r now 或者reboot 2、立即关机,执行如下命令: shutdown -h now 或者poweroff 3、等待2分钟关机并重启动,执行如下命令: shutdown -r 2 4、等待2分钟关机,执行如下命令: shutdown -h 2 5、使用当前用户的历史命令,执行如下操作: history 将会显示使用过的每条命令及其序号,可利用序号重复执行该命令。 例如输入!1并回车,将会重复执行第1条历史命令。 也可用上下光标键调出某条历史命令,然后按回车键重复执行。还可用上下光标键调出某条历史命令,修改后按回车键执行。 6、清除当前用户的历史命令,执行如下命令: history -c 此时用向上光标键将会调不出任何历史命令。 7、命令提示键:输入命令开头一个或几个字母,然后按1次【Tab】键,系统会自动补全能够识别的部分;再按1次【Tab】键,系统显示出符合条件的所有命令供用户选择。 例如输入group后按两次键,将会显示以group开头的所有命令。 8、显示内核版本号,执行如下命令: uname -r 注:内核版本号不同于软件发行版本号。例如,RHEL 5.4的内核版本号是2.6.18-164.el5,软件发行版本号是5.4。 9、清除屏幕,执行如下命令: clear 10、显示操作系统时钟,执行如下命令: date 11、加载光盘到/media,执行如下命令: mount /dev/cdrom /media 12、卸载光盘,执行如下命令: umount /dev/cdrom 或者 umount /media 注意:不要在/media或其子目录中执行此命令,否则将会出现“设备忙错误”。 13、查看存储设备,执行如下命令: fdisk –l 14、加载U盘到/media

Linux Shell概述

Linux Shell概述 英文shell的本意是“壳”。它形象地说明了shell在Linux系统中的作用。shell 就是紧紧包裹在Linux内核外面的一个壳程序。用户让操作系统做的所有任务,都是通过shell与系统内核的交互来完成的。shell所处的地位,就相当于DOS中的https://www.doczj.com/doc/f812445333.html,程序,但比https://www.doczj.com/doc/f812445333.html,的功能更加强大。 shell是用户与操作系统的内核之间的接口,是系统的用户界面,并且具有相当丰富的功能。利用shell可以编写出代码简捷,但功能很强的脚本文件。 1 了解Shell Shell是使用Linux系统的基本环境。虽然不使用Shell,通过X Window也能操作Linux,但是,无论如何看待文本环境下的工作,都可以肯定地说,一旦全面体验到纯文本的强大功能,就会被它所折服。文本就是简洁,文本就是速度。管理网络的系统管理员在使用Shell方面是最有经验的。那些被迫在慢速调制解调器连接上使用图形工具的用户很快也会被折服。 Shell提供了用户与操作系统之间通信的方式,可以以交互方式(从键盘输入,并且可以立即得到响应)执行,也可以以非交互方式(shell script方式)执行。这里的shell script是放在文件中的一串shell和操作系统命令,它们可以重复使用,本质上,shell script是将命令行命令简单地组合到一个文件里面。 此外,shell还可分为交互式shell和非交互式shell。其中,交互式模式是指shell 等待用户的输入,并且执行用户提交的命令,由于需要与用户进行交互,因而被称为交互式shell;这种模式也是大多数用户所熟悉的:登录、执行一些命令、退出,当用户退出系统后,shell也就终止了。shell也可以在非交互式模式下运行,在这种模式下,shell不与用户进行交互,而是读取存放在文件中的命令,并且执行它们,当读到文件尾时,shell将终止。 shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,那么shell就是围绕内核的外层。当从shell或者其他程序向Linux传送命令时,内核就会作出相应的反应。shell作为一个命令语言解释程序,拥有内建的shell 命令集;shell也能被系统中其他应用程序调用。用户在提示符后输入的命令都是先由shell解释,然后再传给Linux内核的。 1.2 shell的特点 Linux 系统为用户提供了shell 高级程序设计语言,大大方便了管理人员对系

Linux简单的shell实现(附源代码)

Linux下Shell的实现说明文档 作业一实验要求: Shell能够解析的语法为: commandline := pipecommand | pipecommand "&" commandline | empty pipecommand := redirectcommand | pipecommand "|" redirectcommand redirectcommand := command ">" outfile | command "<" infile | command "<" infile ">" outfile | command ">" outfile "<" infile | command command := program | command argument 1、需求说明和分析: 本作业要求为实现一个类似于bash的shell。要求支持后台命令,管道,重定向这三个基本功能。并在此基础上,实现一些简单的内部命令,例如cd,pwd等等。 2、设计方案: 1、首先利用readline()函数读到用户输入的shell命令,采用一个数组来保存shell 命令,数组有固定的大小。 2、在main()函数中根据字符串中是否存在"&" 字符判断是否为后台进程。如果是 后台命令则判断是否是多条指令,如果不是将分割后的命令传递给pipel()函数,如果是的话分割之后利用while循环将命令传递给pipel()函数。如果不是后台进 程,需要用waitpid()函数等待子进程结束后父进程才继续。 3、在pipel()函数中,将shell命令根据"|" 字符分割成一个个重定向命令,利用fork ()得到子进程,并完成管道的设置,然后对每个重定向命令调用redirect()函数(如果没有"|",则将整个shell命令调用redirect()函数)。 4、在redirect函数里面,根据有没有”>”,”<”来判断是否需要重定向。如果不需要重定 向,就直接对参数列表调用execv(char *, char **)函数执行命令。如果需要重定向,进行相应的处理,再调用execv()函数。 3、储存结构 1、帮助文档的结构,方便Help命令的构建。 struct HELP_DOC { char *usage[lengthOfBUILTIN_COMMANDS]; //用法 char *info[lengthOfBUILTIN_COMMANDS]; //介绍 }; 2、后台命令管理链表的结构,用于jobs指令的后台储存。

linux shell基础

Linux shell 基础 1Shell的作用及常见种类 对于Linux内核来说,用户直接发出的操作指令它是―听不懂‖的,而SHELL程序在其中恰恰起到了类似于―翻译官‖的角色,它将用户输入的字符串―翻译‖成内核能够理解的控制指令,从而操作系统内核完成各种任务。 这就好比一个只会西班牙语的经理要带领一群只会说越南语的员工干活一样,中间肯定需要一个懂得两种语言的―翻译官‖(Shell) ?Shell是一个特殊的应用程序,它负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行 ?交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是 大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后, shell也终止了。 1.1Shell的种类 ●Bourne Shell 首个重要的标准Unix Shell是1970年底在V7 Unix(A T&T第7版)中引入的,并且以它的创始科技部基础条件平台―国家气象网络计算应用节点建设‖(2004DKA50730)资助者Stephen Bourne的名字命名。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。 ● C Shell Bill Joy于20世纪80年代早期,在Berkeley的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL 风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替

Linux主要shell命令详解

Linux主要shell命令详解 shell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性。 什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。 shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。 shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。 有一些命令,比如改变工作目录命令cd,是包含在shell内部的。还有一些命令,例如拷贝命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。 shell 首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。然后shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。 shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。 当普通用户成功登录,系统将执行一个称为shell的程序。正是shell进程提供了命令行提示符。作为默认值(TurboLinux系统默认的shell是BASH),对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。

相关主题
文本预览
相关文档 最新文档