本文主要介绍Shell脚本编程的30分钟介绍(总结)。边肖认为这很好。现在分享给大家,给大家一个参考。来和边肖一起看看吧。
什么是Shell脚本
Shell脚本(英文:Shell script),又称外壳脚本和编程脚本,是一种计算机程序和文本文件。它的内容由一系列shell命令组成,这些命令由Unix Shell逐字翻译,然后进行操作。设计成脚本语言,操作方式等同于直译语言。Unix shell扮演命令行解释器的角色。在读取shell脚本后,它按顺序运行shell命令,然后输出结果。Shell脚本可用于系统管理、文件操作等。
例子
举个例子:
#!/bin/sh
cd ~
mkdir shell_tut
cd壳_啧啧
for((I=0;i10I));做
触摸测试_$i.txt
完成的
例子
第1行:指定脚本解释器。这里,/bin/sh用作解释器。
第2行:切换到当前用户的主目录。
第3行:创建一个目录shell_tut
第4行:切换到shell_tut目录
第5行:循环条件,共10个循环。
第6行:创建一个test_1…10.txt文件。
第7行:循环体结束
Cd、mkdir、touch都是系统自带的程序,通常在/bin或者/usr/bin目录下。For、do、done是sh脚本语言的关键词。
shell和shell脚本的概念
外壳是指提供接口的应用程序,用户可以通过该接口访问操作系统内核的服务。Ken Thompson的sh是第一个Unix Shell,Windows Explorer是典型的GUI Shell。
Shell脚本是为shell编写的脚本程序。业内的Shell通常是指shell脚本,但读者要知道,shell和shell脚本是两个不同的概念。出于习惯,为简洁起见,本文中的“shell编程”指的是shell脚本编程,而不是开发shell本身(如Windows Explorer扩展开发)。
环境
Shell编程和java、php编程是一样的,只要有一个可以写代码的文本编辑器和一个可以解释执行的脚本解释器。
OS
目前主流的操作系统都支持shell编程。本文描述的shell编程是指Linux下的shell,基本上讲的是POSIX标准下的功能,所以对Unix和BSD(比如Mac OS)也适用。
Linux
Linux的默认安装附带了一个shell解释器。
Mac OS
Mac OS不仅带来了sh和bash两个基础解释器,还内置了ksh、csh、zsh等不常用的解释器。
Windows上的模拟器
Windows出厂时没有内置shell解释器,需要自己安装。为了能够同时使用grep、awk、curl等工具,最好安装一个cygwin或者mingw来模拟linux环境。
cygwin
mingw
脚本解释器
sh
Bourne shell,POSIX(可移植操作系统接口)标准shell解释器,其二进制文件路径通常为/bin/sh,由贝尔实验室开发。
这篇文章是关于sh的。如果您使用其他语言进行shell编程,请参考相应语言的文档。
bash
Bash是Bourne shell的替代品,属于GNU项目,二进制文件路径通常是/bin/bash。通常业内都是bash,sh,Shell混用。比如你会经常在招聘运维工程师的文案中看到:熟悉Linux Bash编程,精通shell编程。
在CentOS中,/bin/sh是指向/bin/bash的符号链接:
[root@centosraw ~]# ls -l /bin/*sh
-rwxr-xr-x. 1根root 903272 Feb 22 05:09 /bin/bash
-rwxr-xr-x. 1根根106216 2012年10月17日/bin/dash
lrwxrwxrwx。1根根4月22日10:22 /bin/sh - bash
但在Mac OS上不行。/bin/sh和/bin/bash是两个不同的文件,尽管它们的大小只相差大约100字节:
iMac:~吴晓$ ls -l /bin/*sh
-r-xr-xr-x 1根轮1371648 6 11月16日16:52 /bin/bash
-rwxr-xr-x 2根轮772992 6 11月16日16:52 /bin/csh
-r-xr-xr-x 1根轮2180736 6 11月16日16:52 /bin/ksh
-r-xr-xr-x 1根轮1371712 6 11月16日16:52 /bin/sh
-rwxr-xr-x 2根轮772992 11月6日16:52 /bin/tcsh
-rwxr-xr-x 1根轮1103984 6 11月16日16:52 /bin/zsh
高级编程语言
理论上,一种语言只要提供解释器(不仅仅是编译器),就可以胜任脚本编写。常见的解释性语言可用于脚本编写,如Perl、Tcl、Python、PHP和Ruby。Perl是最古老的脚本语言,近年来Python已经成为一些linux发行版的预置解释器。
编译语言,只要有解释器,也可以作为脚本编程。比如C shell内置(/bin/csh),Java有第三方解释器Jshell,Ada有付费解释器AdaScript。
下面是一个PHP Shell脚本的例子(假设文件名是test.php):
#!/usr/bin/php
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
for($ I=0;10美元;$i)
echo $ I。'\ n ';
执行:
/usr/bin/PHP test.php
或者:
chmod x test.php。/test.php
如何选择shell编程语言
熟悉 vs 陌生
如果你已经掌握了一门编程语言(如PHP、Python、Java、JavaScript),建议你直接用这种语言写脚本。虽然有些地方会有点啰嗦,但是你可以利用你在这个语言领域的经验(单元测试,单步调试,IDE,第三方类库)。
新的学习成本很小,只要学会如何使用shell解释器(Jshell,AdaScript)就可以了。
简单 vs 高级
如果你觉得用你熟悉的语言(比如Java,C)写shell脚本太啰嗦,你只想做备份文件,安装软件,下载数据,学习使用sh之类的事情。巴什会是个好主意。
Shell只定义了一个非常简单的编程语言。所以,如果你的脚本程序比较复杂,或者要操作的数据结构比较复杂,还是要用Python、Perl之类的脚本语言,或者你已经很擅长的高级语言。因为sh和bash在这方面比较弱,比如:
它的函数只能返回字符串,不能返回数组。
它不支持面向对象,你无法实现一些优雅的设计模式。
它同时被解释和执行。它甚至不像PHP那样是预编译的。如果你的脚本包含错误(比如调用不存在的函数),只要没有执行到这一行,就不会报错。
环境兼容性
如果您的脚本是使用sh或bash提供给其他用户的,那么您的脚本将具有最佳的环境兼容性。长期以来,perl一直是linux的标准,近年来,python也成为一些linux发行版的标准。至于mac os,默认安装了perl、python、ruby、php、java等主流编程语言。
第一个shell脚本
编写
打开一个文本编辑器,创建一个扩展名为sh的新文件(sh代表shell)。扩展不影响脚本的执行,所以当你看到名字的时候知道你的意思是好的。如果你用php写shell脚本,扩展名应该是php。
输入一些代码,第一行一般是这样的:
#!/bin/bash
#!/usr/bin/php
"#!"是一个约定的标签,它告诉系统这个脚本需要执行什么解释器。
运行
有两种方法可以运行Shell脚本:
作为可执行程序
chmod x测试. sh。/test.sh
注意必须写成。/test.sh而不是test.sh,对于其他二进制程序也是一样。直接写test.sh,linux系统会去路径查找是否有叫test.sh的,但是只有/bin、/sbin、/usr/bin、/usr/sbin等。都在路径中,而您的当前目录通常不在路径中,所以请编写它。
以这种方式运行bash脚本时,第一行必须写得正确,这样系统才能找到正确的解释器。
这里的‘系统’其实就是shell(想象一下Windows Explorer)的应用,但为了便于理解,我特意把它写成一个系统。既然这个系统引用shell,那么使用/bin/sh作为解释器的脚本可以省略第一行吗?是
作为解释器参数
这种操作方式是直接运行解释器,其参数是shell脚本的文件名,比如:
/bin/sh test.sh
/bin/PHP test.php
这样运行的脚本不需要在第一行指定解释器信息,写了也没用。
变量
定义变量
定义变量时,变量名称没有用美元符号($)标记,例如:
your_name='qinjx '
注意变量名和等号之间不能有空格,可能和你熟悉的所有编程语言都不一样。
除了显式直接赋值之外,还可以使用语句将值赋给变量,例如:
对于` ls /etc '中的文件
使用变量
要使用已定义的变量,只需在变量名前添加一个美元符号,例如:
your_name='qinjx '
echo $your_name
echo $ {您的姓名}
变量名外面的花括号是可选的,可以添加也可以不添加。添加花括号是为了帮助解释器识别变量的边界,例如下面的情况:
Ada Coffe Action Java中的技能;做
echo“我擅长$ { skill }脚本”
完成的
如果没有给skill变量加上花括号,写成echo我擅长$skillScript’,解释器就会把$ skill script当作一个变量(它的值为null),代码执行结果就不会是我们预期的那样。
建议所有变量都加花括号,这是很好的编程习惯。当IntelliIdea编写外壳脚本时,IDE会提示输入花括号。
重定义变量
已定义的变量可以重新定义,例如:
your_name='qinjx '
echo $your_name
your_name='阿里巴巴'
echo $your_name
这是合法的,但是注意第二次赋值不能写$your_name='alibaba ',使用变量的时候只能加美元符号。
注释
以“#”开头的行是注释,将被解释器忽略。
多行注释
sh中没有多行注释,每行只能加一个#号。就像这样:
# -
#这是一个自动输入ipa的脚本,基于webfrogs的ipa-build。https://github.com/webfrogs/xcode_shell/blob/master/ipa-build写的
#功能:自动打包etao ios app,输出是14通道的ipa包。
#特点:全自动包装,无需输入任何参数。
# -
# # # # #用户配置文件开始# # # #
#
#
#项目根目录,建议把这个脚本放在项目的根目录下,这里就不用改了。
#应用名称,确保与Xcode中产品下的target_name.app名称一致
#
# # # # #用户配置文件结束# # # #
如果在开发过程中,有一大段代码需要临时注释,过了一段时间又取消了注释,怎么办?每行加一个#符号太费劲了。你可以用一对花括号把这段要注释的代码括起来,定义成一个函数。如果没有地方调用这个函数,这段代码就不会被执行,达到和注释一样的效果。
字符串
是shell编程中最常用最有用的数据类型(除了数字和字符串,没有其他类型好用了,哈哈)。字符串可以使用单引号、双引号或不带引号。单引号和双引号的区别类似于PHP。
单引号
str='这是一个字符串'
单引号字符串的限制:
单引号中的任何字符都将按原样输出,单引号中的变量无效。
单引号不能出现在单引号字符串中(即使在对单引号使用转义符之后)。
双引号
str='你好,我知道你是' $your_name '!\n '
双引号中可以有变量。
转义字符可以出现在双引号中。
字符串操作
拼接字符串
your_name='qinjx '
greeting='hello,' $your_name '!'
greeting_1='您好,$ {您的姓名}!'
echo $greeting $greeting_1
获取字符串长度:
string='abcd '
Echo ${#string} # Output: 4
提取子字符串
string='阿里巴巴是一家伟大的公司'
Echo ${string:1:4} #输出:巴丽
查找子字符串
string='阿里巴巴是一家伟大的公司'
echo ` expr index ' $ string ' is `# Output:8,意思是:找出单词在这句话中的位置
数组
管道
条件判断
流程控制
与Java、PHP等语言不同,sh的进程控制不能为空,比如:
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
if(isset($ _ GET[' q ']){
搜索(q);
}
否则{
//什么都不做
}
你不能用sh/bash写这个。如果else分支没有语句,就不要写这个else了。
还要注意,sh中的if [$foo -eq 0]这个方括号和Java/PHP中if后面的括号有很大不同。它是一个可执行程序(像cd,ls,grep)。你想不出来吗?在CentOS上,它位于/usr/bin目录中:
ll /usr/bin/[
-rwxr-xr-x . 1 root root 33408 2012年6月22日/usr/bin/[
因为这里方括号是可执行程序,所以方括号后面必须加空格,不能写成好像[$foo -eq 0]
否则
如果
if条件
然后
命令1
命令2
.
命令n
船方不负担装货费用
写在一行中(对于终端命令提示符):
if ` PS-ef | grep ssh `;然后附和你好;船方不负担装货费用
结尾的fi是if反过来拼,后面还会有类似的。
否则
if条件
然后
命令1
命令2
.
命令n
其他
命令
船方不负担装货费用
如果,如果,如果
如果条件1
然后
命令1
elif条件2
命令2
其他
命令n
船方不负担装货费用
暂时
为
在开头的示例中演示了:
对于项目1和项目2中的变量.itemN
做
命令1
命令2
.
命令n
完成的
写一行:
对于项目1和项目2中的变量.itemNdo命令1;command2…完成;
的c样式
for((exp 1;EXP2EXP3))
做
命令1
命令2
命令3
完成的
在…期间
while条件
做
命令
完成的
无限循环
同时:
做
命令
完成的
或者
虽然是真的
做
命令
完成的
或者
for((;))
直到
直到条件
做
命令
完成的
情况
中的大小写“${opt}”
安装-傀儡-服务器’)
install_master $1
出口
;
安装-傀儡-客户端’)
安装客户端$1
出口
;
配置-傀儡-服务器’)
配置_傀儡_主人
出口
;
配置-傀儡-客户端’)
配置_傀儡_客户端
出口
;
退出’)
出口
;
* ) echo '错误的选项,请重新选择'
environmental systems applications center 环境系统应用程序中心
case的语法和C族语言的语法非常不同。它需要一个esac(即大小写相反)作为结束标记。case的每个分支都标有一个右括号和两个分号来表示中断。
函数
定义
调用
文件包含
您可以使用源代码和。关键词,如:
来源。/function.sh。/function.sh
在bash中,源代码和。是等价的。它们都读取function.sh的内容并执行其内容(类似于PHP中的include)。为了更好的可移植性,推荐第二种书写方法。
包含文件与执行文件是一样的。你还应该写下文件的路径,而不仅仅是文件名。例如,在上面的示例中:/function.sh
不会写:function.sh
如果function.sh是用户传入的参数,如何获取它的绝对路径?方法是:
Real_path=`readlink -f $1`#$1是用户输入的参数,比如function.sh。$real_path
用户输入
执行脚本时传入。
在脚本运行中输入
选择菜单
stdin和stdout
常用的命令
sh脚本和系统命令的组合具有强大的功能。在字符处理领域,有三个火枪手:grep、awk和sed。grep负责查找特定的行,awk可以将行拆分成多个字段,sed可以执行更新、插入、删除等写操作。
ps
查看流程列表
grep
排除grep本身
查找与目标相邻的结果
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。