php发展

注册

 

发新话题 回复该主题

Shell脚本编程30分钟入门 [复制链接]

1#
什么是Shell脚本示例

看个例子吧:

#!/bin/shcd~mkdirshell_tutcdshell_tutfor((i=0;i10;i++));dotouchtest_$i.txtdone

示例解释

第1行:指定脚本解释器,这里是用/bin/sh做解释器的

第行:切换到当前用户的home目录

第行:创建一个目录shell_tut

第行:切换到shell_tut目录

第5行:循环条件,一共循环10次

第6行:创建一个test_1…10.txt文件

第7行:循环体结束

cd,mkdir,touch都是系统自带的程序,一般在/bin或者/usr/bin目录下。for,do,done是sh脚本语言的关键字。

shell和shell脚本的概念

shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。KenThompson的sh是第一种UnixShell,WindowsExplor是一个典型的图形界面Shell。

shell脚本(shellscript),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shellscript是两个不同的概念。由于习惯的原因,简洁起见,本文出现的“shell编程”都是指shell脚本编程,不是指开发shell自身(如WindowsExplor扩展开发)。

环境

shell编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

OS

当前主流的操作系统都支持shell编程,本文档所述的shell编程是指Linux下的shell,讲的基本都是POSIX标准下的功能,所以,也适用于Unix及BSD(如MacOS)。

Linux

Linux默认安装就带了shell解释器。

MacOS

MacOS不仅带了sh、bash这两个最基础的解释器,还内置了ksh、csh、zsh等不常用的解释器。

Windows上的模拟器

windows出厂时没有内置shell解释器,需要自行安装,为了同时能用gp,awk,curl等工具,最好装一个cygwin或者mingw来模拟linux环境。

cygwin

mingw

脚本解释器sh

即Bourneshell,POSIX(PortableOperatingSystemInterface)标准的shell解释器,它的二进制文件路径通常是/bin/sh,由BellLabs开发。

本文讲的是sh,如果你使用其它语言用作shell编程,请自行参考相应语言的文档。

bash

Bash是Bourneshell的替代品,属GNUProject,二进制文件路径通常是/bin/bash。业界通常混用bash、sh、和shell,比如你会经常在招聘运维工程师的文案中见到:熟悉LinuxBash编程,精通Shell编程。

在CentOS里,/bin/sh是一个指向/bin/bash的符号链接/p>

[root

centosraw~]#ls-l/bin/*sh-rwxr-xr-x.1rootrootFeb05:09/bin/bash-rwxr-xr-x.1rootrootOct/bin/dashlrwxrwxrwx.1rootrootMar10:/bin/sh-bash

但在MacOS上不是,/bin/sh和/bin/bash是两个不同的文件,尽管它们的大小只相差字节左右/p>

iMacwuxiao$ls-l/bin/*sh-r-xr-xr-x1rootwheelNov16:5/bin/bash-rwxr-xr-xrootwheelNov16:5/bin/csh-r-xr-xr-x1rootwheelNov16:5/bin/ksh-r-xr-xr-x1rootwheelNov16:5/bin/sh-rwxr-xr-xrootwheelNov16:5/bin/tcsh-rwxr-xr-x1rootwheelNov16:5/bin/zsh

高级编程语言

理论上讲,只要一门语言提供了解释器(而不仅是编译器),这门语言就可以胜任脚本编程,常见的解释型语言都是可以用作脚本编程的,如:Perl、Tcl、Python、PHP、Ruby。Perl是最老牌的脚本编程语言了,Python这些年也成了一些linux发行版的预置解释器。

编译型语言,只要有解释器,也可以用作脚本编程,如Cshell是内置的(/bin/csh),Java有第三方解释器Jshell,Ada有收费的解释器AdaScript。

如下是一个PHPShellScript示例(假设文件名叫test.php):

#!/usr/bin/php?phpfor($i=0;$i10;$i++)echo$i.\n;

执行:

/usr/bin/phptest.php

或者:

chmod+xtest.php./test.php

如何选择shell编程语言熟悉vs陌生

如果你已经掌握了一门编程语言(如PHP、Python、Java、JavaScript),建议你就直接使用这门语言编写脚本程序,虽然某些地方会有点啰嗦,但你能利用在这门语言领域里的经验(单元测试、单步调试、IDE、第三方类库)。

新增的学习成本很小,只要学会怎么使用shell解释器(Jshell、AdaScript)就可以了。

简单vs高级

如果你觉得自己熟悉的语言(如Java、C)写shell脚本实在太啰嗦,你只是想做一些备份文件、安装软件、下载数据之类的事情,学着使用sh,bash会是一个好主意。

shell只定义了一个非常简单的编程语言,所以,如果你的脚本程序复杂度较高,或者要操作的数据结构比较复杂,那么还是应该使用Python、Perl这样的脚本语言,或者是你本来就已经很擅长的高级语言。因为sh和bash在这方面很弱,比如说:

它的函数只能返回字串,无法返回数组

它不支持面向对象,你无法实现一些优雅的设计模式

它是解释型的,一边解释一边执行,连PHP那种预编译都不是,如果你的脚本包含错误(例如调用了不存在的函数),只要没执行到这一行,就不会报错

环境兼容性

如果你的脚本是提供给别的用户使用,使用sh或者bash,你的脚本将具有最好的环境兼容性,perl很早就是linux标配了,python这些年也成了一些linux发行版的标配,至于macos,它默认安装了perl、python、ruby、php、java等主流编程语言。

第一个shell脚本编写

打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell脚本,扩展名就用php好了。

输入一些代码,第一行一般是这样:

#!/bin/bash#!/usr/bin/php

“#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。

运行

运行Shell脚本有两种方法:

作为可执行程序

chmod+xtest.sh./test.sh

注意,一定要写成./test.sh,而不是test.sh,运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin,/sbin,/usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。

通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。

这里的系统,其实就是shell这个应用程序(想象一下WindowsExplor),但我故意写成系统,是方便理解,既然这个系统就是指shell,那么一个使用/bin/sh作为解释器的脚本是不是可以省去第一行呢?是的。

作为解释器参数

这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:

/bin/shtest.sh/bin/phptest.php

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

变量定义变量

定义变量时,变量名不加美元符号($),如:

your_name=qinjx

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。

除了显式地直接赋值,还可以用语句给变量赋值,如:

forfilein`ls/etc`

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name=qinjxecho$your_nameecho${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

forskillinAdaCoffeActionJava;doechoIamgoodat${skill}Scriptdone

如果不给skill变量加花括号,写成echoIamgoodat$skillScript,解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号,这是个好的编程习惯。IntelliJIDEA编写shellscript时,IDE就会提示加花括号。

重定义变量

已定义的变量,可以被重新定义,如:

your_name=qinjxecho$your_nameyour_name=alibabaecho$your_name

这样写是合法的,但注意,第二次赋值的时候不能写$your_name=alibaba,使用变量的时候才加美元符。

注释

以“#”开头的行就是注释,会被解释器忽略。

多行注释

sh里没有多行注释,只能每一行加一个#号。就像这样:

#--------------------------------------------#这是一个自动打ipa的脚本,基于webfrogs的ipa-build书写:

分享 转发
TOP
发新话题 回复该主题