Shell脚本编程28分钟入门


Shell脚本编程2陆分钟入门

作者:qinjx
原文地址:Shell脚本编程贰拾5分钟入门

什么是Shell脚本

什么是Shell脚本

什么是Shell脚本

示例

看个例子吗:

#!/bin/sh
cd ~
mkdir shell_tut
cd shell_tut

for ((i=0; i<10; i++)); do
    touch test_$i.txt
done

示例

看个例子吗:

#!/bin/sh
cd ~
mkdir shell_tut
cd shell_tut

for ((i=0; i<10; i++)); do
    touch test_$i.txt
done

示例

看个例证吗:

#!/bin/sh
cd ~
mkdir shell_tut
cd shell_tut

for ((i=0; i<10; i++)); do
    touch test_$i.txt
done

以身作则解释

  • 第壹行:指定脚本解释器,那里是用/bin/sh做解释器的
  • 第三行:切换来目前用户的home目录
  • 第壹行:创建多个目录shell_tut
  • 第4行:切换到shell_tut目录
  • 第④行:循环条件,一共循环拾肆遍
  • 第4行:创造贰个test_1…10.txt文件
  • 第⑧行:循环体为止

cd, mkdir, touch都以系统自带的顺序,一般在/bin或然/usr/bin目录下。for,
do, done是sh脚本语言的首要字。

以身作则解释

  • 第二行:指定脚本解释器,那里是用/bin/sh做解释器的
  • 第①行:切换来目前用户的home目录
  • 第②行:创制一个目录shell_tut
  • 第4行:切换到shell_tut目录
  • 第六行:循环条件,一共循环拾壹遍
  • 第4行:创设一个test_1…10.txt文件
  • 第柒行:循环体停止

cd, mkdir, touch都是系统自带的次序,一般在/bin可能/usr/bin目录下。for,
do, done是sh脚本语言的第③字。

示范解释

  • 第3行:内定脚本解释器,那里是用/bin/sh做解释器的
  • 第②行:切换成当前用户的home目录
  • 第1行:创立贰个目录shell_tut
  • 第4行:切换到shell_tut目录
  • 第④行:循环条件,一共循环十遍
  • 第④行:创立三个test_1…10.txt文件
  • 第⑩行:循环体停止

cd, mkdir, touch都以系统自带的程序,一般在/bin恐怕/usr/bin目录下。for,
do, done是sh脚本语言的重点字。

shell和shell脚本的定义

shell是指一种应用程序,那个应用程序提供了壹个界面,用户通过那一个界面访问操作系统内核的劳务。Ken
汤普森的sh是首先种Unix Shell,Windows
Explorer是贰个高人一等的图形界面Shell。

shell脚本(shell
script),是一种为shell编写的本子程序。业界所说的shell经常都以指shell脚本,但读者对象要明了,shell和shell
script是多个例外的定义。由于习惯的来由,简洁起见,本文出现的“shell编程”都以指shell脚本编程,不是指开发shell本人(如Windows
Explorer扩充开发)。

shell和shell脚本的概念

shell是指一种应用程序,那么些应用程序提供了壹个界面,用户通过那个界面访问操作系统内核的劳务。Ken
汤普森的sh是首先种Unix Shell,Windows
Explorer是1个良好的图形界面Shell。

shell脚本(shell
script),是一种为shell编写的本子程序。业界所说的shell日常都是指shell脚本,但读者对象要明了,shell和shell
script是两个差其他定义。由于习惯的因由,简洁起见,本文出现的“shell编程”都以指shell脚本编程,不是指开发shell本人(如Windows
Explorer增加开发)。

shell和shell脚本的定义

shell是指一种应用程序,这几个应用程序提供了3个界面,用户通过那几个界面访问操作系统内核的劳务。Ken
汤普森的sh是第3种Unix Shell,Windows
Explorer是2个超人的图形界面Shell。

shell脚本(shell
script),是一种为shell编写的本子程序。业界所说的shell寻常都是指shell脚本,但读者朋友要精晓,shell和shell
script是五个例外的定义。由于习惯的来头,简洁起见,本文现身的“shell编程”都是指shell脚本编程,不是指开发shell本身(如Windows
Explorer扩张开发)。

环境

shell编程跟java、php编程一样,只要有1个能编写代码的文书编辑器和多个能表明施行的脚本解释器就足以了。

环境

shell编程跟java、php编程一样,只要有三个能编写代码的公文编辑器和2个能诠释实施的剧本解释器就可以了。

环境

shell编程跟java、php编程一样,只要有一个能编写代码的文件编辑器和1个能分解实施的台本解释器就足以了。

OS

脚下主流的操作系统都支持shell编程,本文档所述的shell编程是指Linux下的shell,讲的着力都以POSIX标准下的效应,所以,也适用于Unix及BSD(如Mac
OS)。

OS

眼前主流的操作系统都资助shell编程,本文档所述的shell编程是指Linux下的shell,讲的骨干都是POSIX标准下的成效,所以,也适用于Unix及BSD(如Mac
OS)。

OS

眼下主流的操作系统都支持shell编程,本文档所述的shell编程是指Linux下的shell,讲的中坚都以POSIX标准下的功效,所以,也适用于Unix及BSD(如Mac
OS)。

Linux

Linux私行认同安装就带了shell解释器。

Linux

Linux暗许安装就带了shell解释器。

Linux

Linux暗中同意安装就带了shell解释器。

Mac OS

Mac
OS不仅带了sh、bash那三个最基础的解释器,还停放了ksh、csh、zsh等不常用的解释器。

Mac OS

Mac
OS不仅带了sh、bash那多个最基础的解释器,还放置了ksh、csh、zsh等不常用的解释器。

Mac OS

Mac
OS不仅带了sh、bash那八个最基础的解释器,还内置了ksh、csh、zsh等不常用的解释器。

Windows上的模拟器

windows出厂时未尝内置shell解释器,需求活动安装,为了同时能用grep, awk,
curl等工具,最好装多个cygwin可能mingw来模拟linux环境。

Windows上的模拟器

windows出厂风尚未放置shell解释器,必要活动安装,为了同时能用grep, awk,
curl等工具,最好装贰个cygwin大概mingw来模拟linux环境。

Windows上的模拟器

windows出厂时并未内置shell解释器,须要活动设置,为了同时能用grep, awk,
curl等工具,最好装壹个cygwin可能mingw来模拟linux环境。

本子解释器

剧本解释器

本子解释器

sh

即Bourne shell,POSIX(Portable Operating System
Interface)标准的shell解释器,它的二进制文件路径日常是/bin/sh,由BellLabs开发。

本文讲的是sh,若是你利用任何语言用作shell编程,请自行参考相应语言的文档。

sh

即Bourne shell,POSIX(Portable Operating System
Interface)标准的shell解释器,它的二进制文件路径平时是/bin/sh,由BellLabs开发。

正文讲的是sh,假使您使用其他语言用作shell编程,请自行参考相应语言的文档。

sh

即Bourne shell,POSIX(Portable Operating System
Interface)标准的shell解释器,它的二进制文件路径寻常是/bin/sh,由BellLabs开发。

正文讲的是sh,若是你使用其他语言用作shell编程,请自行参考相应语言的文档。

bash

Bash是Bourne shell的替代品,属GNU
Project,二进制文件路径平时是/bin/bash。业界一般混用bash、sh、和shell,比如您会时常在选聘运行工程师的文案中来看:纯熟Linux
Bash编程,通晓Shell编程。

在CentOS里,/bin/sh是一个指向/bin/bash的标记链接:

[root@centosraw ~]# ls -l /bin/*sh
-rwxr-xr-x. 1 root root 903272 Feb 22 05:09 /bin/bash
-rwxr-xr-x. 1 root root 106216 Oct 17  2012 /bin/dash
lrwxrwxrwx. 1 root root      4 Mar 22 10:22 /bin/sh -> bash

但在Mac
OS上不是,/bin/sh和/bin/bash是三个差距的公文,尽管它们的高低只相差100字节左右:

iMac:~ wuxiao$ ls -l /bin/*sh
-r-xr-xr-x  1 root  wheel  1371648  6 Nov 16:52 /bin/bash
-rwxr-xr-x  2 root  wheel   772992  6 Nov 16:52 /bin/csh
-r-xr-xr-x  1 root  wheel  2180736  6 Nov 16:52 /bin/ksh
-r-xr-xr-x  1 root  wheel  1371712  6 Nov 16:52 /bin/sh
-rwxr-xr-x  2 root  wheel   772992  6 Nov 16:52 /bin/tcsh
-rwxr-xr-x  1 root  wheel  1103984  6 Nov 16:52 /bin/zsh

bash

Bash是Bourne shell的替代品,属GNU
Project,二进制文件路径寻常是/bin/bash。业界一般混用bash、sh、和shell,比如你会时不时在选聘运行工程师的文案中观看:熟识Linux
Bash编程,精晓Shell编程。

在CentOS里,/bin/sh是二个指向/bin/bash的标志链接:

[root@centosraw ~]# ls -l /bin/*sh
-rwxr-xr-x. 1 root root 903272 Feb 22 05:09 /bin/bash
-rwxr-xr-x. 1 root root 106216 Oct 17  2012 /bin/dash
lrwxrwxrwx. 1 root root      4 Mar 22 10:22 /bin/sh -> bash

但在Mac
OS上不是,/bin/sh和/bin/bash是五个不相同的文本,即使它们的轻重缓急只相差100字节左右:

iMac:~ wuxiao$ ls -l /bin/*sh
-r-xr-xr-x  1 root  wheel  1371648  6 Nov 16:52 /bin/bash
-rwxr-xr-x  2 root  wheel   772992  6 Nov 16:52 /bin/csh
-r-xr-xr-x  1 root  wheel  2180736  6 Nov 16:52 /bin/ksh
-r-xr-xr-x  1 root  wheel  1371712  6 Nov 16:52 /bin/sh
-rwxr-xr-x  2 root  wheel   772992  6 Nov 16:52 /bin/tcsh
-rwxr-xr-x  1 root  wheel  1103984  6 Nov 16:52 /bin/zsh

bash

Bash是Bourne shell的替代品,属GNU
Project,二进制文件路径日常是/bin/bash。业界一般混用bash、sh、和shell,比如您会时不时在招聘运维工程师的文案中观望:纯熟Linux
Bash编程,精晓Shell编程。

在CentOS里,/bin/sh是1个指向/bin/bash的标记链接:

[root@centosraw ~]# ls -l /bin/*sh
-rwxr-xr-x. 1 root root 903272 Feb 22 05:09 /bin/bash
-rwxr-xr-x. 1 root root 106216 Oct 17  2012 /bin/dash
lrwxrwxrwx. 1 root root      4 Mar 22 10:22 /bin/sh -> bash

但在Mac
OS上不是,/bin/sh和/bin/bash是八个例外的公文,即便它们的大大小小只相差100字节左右:

iMac:~ wuxiao$ ls -l /bin/*sh
-r-xr-xr-x  1 root  wheel  1371648  6 Nov 16:52 /bin/bash
-rwxr-xr-x  2 root  wheel   772992  6 Nov 16:52 /bin/csh
-r-xr-xr-x  1 root  wheel  2180736  6 Nov 16:52 /bin/ksh
-r-xr-xr-x  1 root  wheel  1371712  6 Nov 16:52 /bin/sh
-rwxr-xr-x  2 root  wheel   772992  6 Nov 16:52 /bin/tcsh
-rwxr-xr-x  1 root  wheel  1103984  6 Nov 16:52 /bin/zsh

高档编程语言

力排众议上讲,只要一门语言提供问询释器(而不仅仅是编译器),那门语言就可以胜任脚本编程,常见的解释型语言都以足以作为脚本编程的,如:Perl、Tcl、Python、PHP、Ruby。Perl是最有名的本子编程语言了,Python那一个年也成了部分linux发行版的预置解释器。

编译型语言,只要有解释器,也可以当作脚本编程,如C
shell是停放的(/bin/csh),Java有第③方解释器Jshell,Ada有收费的解释器AdaScript。

正如是1个PHP Shell Script示例(假若文件名叫test.php):

#!/usr/bin/php
<?php
for ($i=0; $i < 10; $i++)
        echo $i . "\n";

执行:

/usr/bin/php test.php

或者:

chmod +x test.php
./test.php

高级编程语言

辩驳上讲,只要一门语言提供驾驭释器(而不仅仅是编译器),那门语言就可以胜任脚本编程,常见的解释型语言都以足以当作脚本编程的,如:Perl、Tcl、Python、PHP、Ruby。Perl是最知名的本子编程语言了,Python这么些年也成了一些linux发行版的预置解释器。

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

正如是2个PHP Shell Script示例(若是文件名叫test.php):

#!/usr/bin/php
<?php
for ($i=0; $i < 10; $i++)
        echo $i . "\n";

执行:

/usr/bin/php test.php

或者:

chmod +x test.php
./test.php

高级编程语言

辩护上讲,只要一门语言提供领悟释器(而不只是编译器),那门语言就足以胜任脚本编程,常见的解释型语言都以可以当做脚本编程的,如:Perl、Tcl、Python、PHP、Ruby。Perl是最有名的脚本编程语言了,Python那一个年也成了有的linux发行版的预置解释器。

编译型语言,只要有解释器,也得以当做脚本编程,如C
shell是置于的(/bin/csh),Java有第壹方解释器Jshell,Ada有收费的解释器艾达Script。

如下是三个PHP Shell Script示例(若是文件名叫test.php):

#!/usr/bin/php
<?php
for ($i=0; $i < 10; $i++)
        echo $i . "\n";

执行:

/usr/bin/php test.php

或者:

chmod +x test.php
./test.php

什么样拔取shell编程语言

怎么抉择shell编程语言

什么采纳shell编程语言

熟悉 vs 陌生

假若你已经控制了一门编程语言(如PHP、Python、Java、JavaScript),提出你就一直采纳那门语言编写脚本程序,固然某个位置会有点啰嗦,但你能使用在那门语言领域里的阅历(单元测试、单步调试、IDE、第1方类库)。

新增的就学开销很小,只要学会怎么采纳shell解释器(Jshell、AdaScript)就可以了。

熟悉 vs 陌生

如若你已经控制了一门编程语言(如PHP、Python、Java、JavaScript),提议你就直接利用那门语言编写脚本程序,尽管某个地方会有点啰嗦,但你能接纳在那门语言领域里的经历(单元测试、单步调试、IDE、第①方类库)。

增产的求学习开支用很小,只要学会怎么使用shell解释器(Jshell、AdaScript)就足以了。

熟悉 vs 陌生

若果你已经控制了一门编程语言(如PHP、Python、Java、JavaScript),指出你就径直行使这门语言编写脚本程序,即便有些地方会有点啰嗦,但你能运用在那门语言领域里的经验(单元测试、单步调试、IDE、第1方类库)。

增产的求学花费很小,只要学会怎么使用shell解释器(Jshell、AdaScript)就足以了。

简单 vs 高级

一旦你以为温馨深谙的言语(如Java、C)写shell脚本实在太啰嗦,你只是想做一些备份文件、安装软件、下载数据等等的事务,学着使用sh,bash会是多个好主意。

shell只定义了贰个万分不难的编程语言,所以,假诺你的剧本程序复杂度较高,或然要操作的数据结构相比较复杂,那么依然应当运用Python、Perl那样的脚本语言,恐怕是您本来就早已很擅长的高档语言。因为sh和bash在那方面很弱,比如说:

  • 它的函数只能够回去字串,不可以回去数组
  • 它不协助面向对象,你不只怕兑现部分优雅的设计情势
  • 它是解释型的,一边解释一边实践,连PHP那种预编译都不是,要是您的台本包括错误(例如调用了不存在的函数),只要没实施到这一行,就不会报错

简单 vs 高级

一经您认为温馨深谙的语言(如Java、C)写shell脚本实在太啰嗦,你只是想做一些备份文件、安装软件、下载数据等等的事务,学着使用sh,bash会是3个好主意。

shell只定义了贰个相当不难的编程语言,所以,要是您的本子程序复杂度较高,或然要操作的数据结构相比复杂,那么照旧应当利用Python、Perl那样的脚本语言,或然是你当然就曾经很善于的高档语言。因为sh和bash在那地方很弱,比如说:

  • 它的函数只可以回到字串,不只怕回去数组
  • 它不援救面向对象,你不能完结部分淡雅的设计形式
  • 它是解释型的,一边解释一边实践,连PHP那种预编译都不是,如果您的剧本包括错误(例如调用了不设有的函数),只要没实施到这一行,就不会报错

简单 vs 高级

万一你认为本身熟习的语言(如Java、C)写shell脚本实在太啰嗦,你只是想做一些备份文件、安装软件、下载数据等等的作业,学着使用sh,bash会是八个好主意。

shell只定义了3个相当简单的编程语言,所以,借使您的本子程序复杂度较高,可能要操作的数据结构比较复杂,那么依然应当利用Python、Perl那样的脚本语言,或许是你当然就已经很善于的高等语言。因为sh和bash在那位置很弱,比如说:

  • 它的函数只可以回到字串,不能回到数组
  • 它不匡助面向对象,你不大概落成部分优雅的设计情势
  • 它是解释型的,一边解释一边实践,连PHP那种预编译都不是,假诺你的本子包涵错误(例如调用了不设有的函数),只要没执行到这一行,就不会报错

条件包容性

只要您的脚本是提须要其余用户使用,使用sh恐怕bash,你的台本将全数最好的条件包容性,perl很已经是linux标配了,python那个年也成了一部分linux发行版的标配,至于mac
os,它暗中同意安装了perl、python、ruby、php、java等主流编程语言。

条件包容性

比方您的脚本是提要求其余用户使用,使用sh大概bash,你的台本将具有最好的条件包容性,perl很已经是linux标配了,python那么些年也成了部分linux发行版的标配,至于mac
os,它暗中认同安装了perl、python、ruby、php、java等主流编程语言。

环境包容性

假如您的脚本是提需求其余用户拔取,使用sh恐怕bash,你的剧本将享有最好的条件兼容性,perl很已经是linux标配了,python那几个年也成了有的linux发行版的标配,至于mac
os,它专擅认同安装了perl、python、ruby、php、java等主流编程语言。

第一个shell脚本

第一个shell脚本

第一个shell脚本

编写

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

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

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

“#!”是三个约定的标记,它报告系统那么些剧本需求什么样解释器来实施。

编写

开拓文本编辑器,新建3个文本,增添名为sh(sh代表shell),扩张名并不影响脚本执行,见名知意就好,如若你用php写shell
脚本,伸张名就用php好了。

输入一些代码,第③行一般是如此:

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

“#!”是三个预订的号子,它告诉系统那几个剧本须求哪些解释器来实施。

编写

开拓文本编辑器,新建2个文本,增加名为sh(sh代表shell),扩大名并不影响脚本执行,见名知意就好,倘若您用php写shell
脚本,扩张名就用php好了。

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

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

“#!”是3个预订的号子,它告诉系统那个本子须求哪些解释器来施行。

运行

运作Shell脚本有二种情势:

运行

运维Shell脚本有二种艺术:

运行

运营Shell脚本有二种形式:

用作可执行程序

chmod +x test.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那么些应用程序(想象一下Windows
Explorer),但自作者故意写成连串,是造福精晓,既然那一个种类就是指shell,那么二个用到/bin/sh作为解释器的脚本是还是不是可以节省第叁行吧?是的。

用作可执行程序

chmod +x test.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那么些应用程序(想象一下Windows
Explorer),但本人有意写成种类,是便宜了然,既然这些系列就是指shell,那么三个使用/bin/sh作为解释器的脚本是否能够节约第叁行啊?是的。

用作可执行程序

chmod +x test.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这么些应用程序(想象一下Windows
Explorer),但作者蓄意写成体系,是有利领会,既然那几个系统就是指shell,那么八个应用/bin/sh作为解释器的脚本是还是不是可以省去第三行啊?是的。

用作解释器参数

那种运营格局是,直接运行解释器,其参数就是shell脚本的文书名,如:

/bin/sh test.sh
/bin/php test.php

那种办法运转的本子,不必要在首先行钦赐解释器音信,写了也没用。

作为解释器参数

那种运维格局是,直接运营解释器,其参数就是shell脚本的文本名,如:

/bin/sh test.sh
/bin/php test.php

那种办法运转的台本,不必要在首先行钦定解释器音讯,写了也没用。

作为解释器参数

那种运营格局是,直接运营解释器,其参数就是shell脚本的文件名,如:

/bin/sh test.sh
/bin/php test.php

那种方法运维的本子,不要求在率先行指定解释器音信,写了也没用。

变量

变量

变量

概念变量

概念变量时,变量名不加法郎符号($),如:

your_name="qinjx"

只顾,变量名和等号之间不能够有空格,那只怕和你精晓的享有编程语言都不雷同。

除去显式地直接赋值,还是能够用语句给变量赋值,如:

for file in `ls /etc`

概念变量

概念变量时,变量名不加欧元符号($),如:

your_name="qinjx"

小心,变量名和等号之间不能有空格,那大概和你熟谙的富有编程语言都不同等。

除却显式地直接赋值,还是能够用语句给变量赋值,如:

for file in `ls /etc`

概念变量

概念变量时,变量名不加英镑符号($),如:

your_name="qinjx"

只顾,变量名和等号之间不或许有空格,那说不定和您熟习的富有编程语言都分歧。

而外显式地一直赋值,还足以用语句给变量赋值,如:

for file in `ls /etc`

采用变量

应用2个定义过的变量,只要在变量名前边加日币符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

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

for skill in Ada Coffe Action Java do
    echo "I am good at ${skill}Script"
done

如若不给skill变量加花括号,写成echo “I am good at
$skillScript”,解释器就会把$skillScript当成3个变量(其值为空),代码执行结果就不是大家期望的规范了。

推荐给拥有变量加上花括号,那是个好的编程习惯。AMDliJ IDEA编写shell
script时,IDE就会唤醒加花括号。

动用变量

使用一个定义过的变量,只要在变量名前边加泰铢符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了辅助解释器识别变量的境界,比如下边那种景色:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

比方不给skill变量加花括号,写成echo “I am good at
$skillScript”,解释器就会把$skillScript当成二个变量(其值为空),代码执行结果就不是我们盼望的指南了。

引进给全体变量加上花括号,那是个好的编程习惯。速龙liJ IDEA编写shell
script时,IDE就会指示加花括号。

运用变量

动用1个定义过的变量,只要在变量名后面加美金符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了扶持解释器识别变量的边界,比如上面那种场所:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

只要不给skill变量加花括号,写成echo “I am good at
$skillScript”,解释器就会把$skillScript当成三个变量(其值为空),代码执行结果就不是我们意在的样子了。

推荐给拥有变量加上花括号,那是个好的编程习惯。英特尔liJ IDEA编写shell
script时,IDE就会唤起加花括号。

重定义变量

已定义的变量,可以被再度定义,如:

your_name="qinjx"
echo $your_name

your_name="alibaba"
echo $your_name

那般写是合法的,但注意,第②次赋值的时候不可以写$your_name=”alibaba”,使用变量的时候才加新币符。

重定义变量

已定义的变量,可以被再一次定义,如:

your_name="qinjx"
echo $your_name

your_name="alibaba"
echo $your_name

如此这般写是法定的,但注意,第贰回赋值的时候不可以写$your_name=”alibaba”,使用变量的时候才加新币符。

重定义变量

已定义的变量,可以被再度定义,如:

your_name="qinjx"
echo $your_name

your_name="alibaba"
echo $your_name

这么写是官方的,但注意,第贰遍赋值的时候无法写$your_name=”alibaba”,使用变量的时候才加美元符。

注释

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

注释

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

注释

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

多行注释

sh里没有多行注释,只可以每一行加3个#号。就好像这么:

#--------------------------------------------
# 这是一个自动打ipa的脚本,基于webfrogs的ipa-build书写:https://github.com/webfrogs/xcode_shell/blob/master/ipa-build

# 功能:自动为etao ios app打包,产出物为14个渠道的ipa包
# 特色:全自动打包,不需要输入任何参数
#--------------------------------------------

##### 用户配置区 开始 #####
#
#
# 项目根目录,推荐将此脚本放在项目的根目录,这里就不用改了
# 应用名,确保和Xcode里Product下的target_name.app名字一致
#
##### 用户配置区 结束  #####

借使在支付进度中,境遇大段的代码须求暂且注释起来,过一会儿又撤除注释,怎么办吧?每一行加个#标志太讨厌了,可以把这一段要诠释的代码用一对花括号括起来,定义成壹个函数,没有地点调用这么些函数,那块代码就不会履行,达到了和注释一样的功能。

多行注释

sh里没有多行注释,只可以每一行加2个#号。如同那样:

#--------------------------------------------
# 这是一个自动打ipa的脚本,基于webfrogs的ipa-build书写:https://github.com/webfrogs/xcode_shell/blob/master/ipa-build

# 功能:自动为etao ios app打包,产出物为14个渠道的ipa包
# 特色:全自动打包,不需要输入任何参数
#--------------------------------------------

##### 用户配置区 开始 #####
#
#
# 项目根目录,推荐将此脚本放在项目的根目录,这里就不用改了
# 应用名,确保和Xcode里Product下的target_name.app名字一致
#
##### 用户配置区 结束  #####

只要在支付进度中,蒙受大段的代码要求暂且注释起来,过会儿又裁撤注释,如何做呢?每一行加个#标志太困难了,可以把这一段要诠释的代码用一对花括号括起来,定义成壹个函数,没有地点调用这么些函数,那块代码就不会实施,达到了和注释一样的功效。

多行注释

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

#--------------------------------------------
# 这是一个自动打ipa的脚本,基于webfrogs的ipa-build书写:https://github.com/webfrogs/xcode_shell/blob/master/ipa-build

# 功能:自动为etao ios app打包,产出物为14个渠道的ipa包
# 特色:全自动打包,不需要输入任何参数
#--------------------------------------------

##### 用户配置区 开始 #####
#
#
# 项目根目录,推荐将此脚本放在项目的根目录,这里就不用改了
# 应用名,确保和Xcode里Product下的target_name.app名字一致
#
##### 用户配置区 结束  #####

假诺在开发进度中,碰到大段的代码须求一时注释起来,过会儿又撤消注释,如何做吧?每一行加个#标志太费事了,可以把这一段要诠释的代码用一对花括号括起来,定义成三个函数,没有地点调用这些函数,这块代码就不会实施,达到了和注释一样的效用。

字符串

字符串是shell编程中最常用最实用的数据类型(除了数字和字符串,也没啥其余项目好用了,哈哈),字符串可以用单引号,也得以用双引号,也足以毫不引号。单双引号的区分跟PHP类似。

字符串

字符串是shell编程中最常用最有效的数据类型(除了数字和字符串,也没啥其他类型好用了,哈哈),字符串能够用单引号,也得以用双引号,也得以不要引号。单双引号的区分跟PHP类似。

字符串

字符串是shell编程中最常用最管用的数据类型(除了数字和字符串,也没啥其余品类好用了,哈哈),字符串可以用单引号,也可以用双引号,也可以毫无引号。单双引号的区分跟PHP类似。

单引号

str='this is a string'

单引号字符串的限量:

  • 单引号里的别样字符都会原样输出,单引号字符串中的变量是不行的
  • 单引号字串中不能冒出单引号(对单引号使用转义符后也丰富)

单引号

str='this is a string'

单引号字符串的界定:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是不行的
  • 单引号字串中不只怕冒出单引号(对单引号使用转义符后也要命)

单引号

str='this is a string'

单引号字符串的限定:

  • 单引号里的其余字符都会原样输出,单引号字符串中的变量是不著见效的
  • 单引号字串中不可以冒出单引号(对单引号使用转义符后也要命)

双引号

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
  • 双引号里可以有变量
  • 双引号里可以出现转义字符

双引号

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
  • 双引号里可以有变量
  • 双引号里可以现身转义字符

双引号

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
  • 双引号里能够有变量
  • 双引号里可以出现转义字符

字符串操作

字符串操作

字符串操作

拼接字符串

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"

echo $greeting $greeting_1

拼接字符串

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"

echo $greeting $greeting_1

拼接字符串

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"

echo $greeting $greeting_1

得到字符串长度:

string="abcd"
echo ${#string} #输出:4

赢得字符串长度:

string="abcd"
echo ${#string} #输出:4

获取字符串长度:

string="abcd"
echo ${#string} #输出:4

领取子字符串

string="alibaba is a great company"
echo ${string:1:4} #输出:liba

领取子字符串

string="alibaba is a great company"
echo ${string:1:4} #输出:liba

领到子字符串

string="alibaba is a great company"
echo ${string:1:4} #输出:liba

查找子字符串

string="alibaba is a great company"
echo `expr index "$string" is`#输出:8,这个语句的意思是:找出单词is在这名话中的位置

查找子字符串

string="alibaba is a great company"
echo `expr index "$string" is`#输出:8,这个语句的意思是:找出单词is在这名话中的位置

查找子字符串

string="alibaba is a great company"
echo `expr index "$string" is`#输出:8,这个语句的意思是:找出单词is在这名话中的位置

更多

参见本文档末尾的参考资料中Advanced Bash-Scripting Guid Chapter
10.1

更多

参见本文档末尾的参考资料中Advanced Bash-Scripting Guid Chapter
10.1

更多

参见本文档末尾的参考资料中Advanced Bash-Scripting Guid Chapter
10.1

数组

数组

数组

管道

管道

管道

规范判断

原则判断

标准化判断

流程控制

和Java、PHP等语言差异,sh的流水线控制不可为空,如:

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    //do nothing
}

在sh/bash里可无法如此写,假若else分支没有言语执行,就绝不写这些else。

还要小心,sh里的if [ $foo -eq 0
],这么些方括号跟Java/PHP里if后边的圆括号大不一致,它是2个可执行程序(和cd,
ls, grep一样),相不到吧?在CentOS上,它在/usr/bin目录下:

ll /usr/bin/[
-rwxr-xr-x. 1 root root 33408 6月  22 2012 /usr/bin/[

正因为方括号在此处是2个可执行程序,方括号前面总得加空格,无法写成if
[$foo -eq 0]

流程控制

和Java、PHP等语言不均等,sh的流程控制不可为空,如:

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    //do nothing
}

在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 6月  22 2012 /usr/bin/[

正因为方括号在那里是五个可执行程序,方括号前面总得加空格,不恐怕写成if
[$foo -eq 0]

流程控制

和Java、PHP等语言不等同,sh的流程控制不可为空,如:

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    //do nothing
}

在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 6月  22 2012 /usr/bin/[

正因为方括号在那边是一个可执行程序,方括号前面总得加空格,不可能写成if
[$foo -eq 0]

if else

if else

if else

if

if condition
then
    command1 
    command2
    ...
    commandN 
fi

写成一行(适用于极端命令指示符):

if `ps -ef | grep ssh`;  then echo hello; fi

最终的fi就是if倒过来拼写,前边还会遇上类似的

if

if condition
then
    command1 
    command2
    ...
    commandN 
fi

写成一行(适用于极端命令指示符):

if `ps -ef | grep ssh`;  then echo hello; fi

最后的fi就是if倒过来拼写,后边还会赶上类似的

if

if condition
then
    command1 
    command2
    ...
    commandN 
fi

写成一行(适用于极端命令指示符):

if `ps -ef | grep ssh`;  then echo hello; fi

最后的fi就是if倒过来拼写,后边还会境遇类似的

if else

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

if condition1
then
    command1
elif condition2
    command2
else
    commandN
fi

if else-if else

if condition1
then
    command1
elif condition2
    command2
else
    commandN
fi

if else-if else

if condition1
then
    command1
elif condition2
    command2
else
    commandN
fi

for while

for while

for while

for

在开篇的以身作则里演示过了:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

写成一行:

for var in item1 item2 ... itemN; do command1; command2… done;

for

在开赛的以身作则里演示过了:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

写成一行:

for var in item1 item2 ... itemN; do command1; command2… done;

for

在开业的以身作则里演示过了:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

写成一行:

for var in item1 item2 ... itemN; do command1; command2… done;

C风格的for

for (( EXP1; EXP2; EXP3 ))
do
    command1
    command2
    command3
done

C风格的for

for (( EXP1; EXP2; EXP3 ))
do
    command1
    command2
    command3
done

C风格的for

for (( EXP1; EXP2; EXP3 ))
do
    command1
    command2
    command3
done

while

while condition
do
    command
done

while

while condition
do
    command
done

while

while condition
do
    command
done

无限循环

while :
do
    command
done

或者

while true
do
    command
done

或者

for (( ; ; ))

最为循环

while :
do
    command
done

或者

while true
do
    command
done

或者

for (( ; ; ))

极致循环

while :
do
    command
done

或者

while true
do
    command
done

或者

for (( ; ; ))

until

until condition
do
    command
done

until

until condition
do
    command
done

until

until condition
do
    command
done

case

case "${opt}" in
    "Install-Puppet-Server" )
        install_master $1
        exit
    ;;

    "Install-Puppet-Client" )
        install_client $1
        exit
    ;;

    "Config-Puppet-Server" )
        config_puppet_master
        exit
    ;;

    "Config-Puppet-Client" )
        config_puppet_client
        exit
    ;;

    "Exit" )
        exit
    ;;

    * ) echo "Bad option, please choose again"
esac

case的语法和C
family语言差异很大,它要求2个esac(就是case反过来)作为完毕标记,各种case分支用右圆括号,用八个分集团表示break

case

case "${opt}" in
    "Install-Puppet-Server" )
        install_master $1
        exit
    ;;

    "Install-Puppet-Client" )
        install_client $1
        exit
    ;;

    "Config-Puppet-Server" )
        config_puppet_master
        exit
    ;;

    "Config-Puppet-Client" )
        config_puppet_client
        exit
    ;;

    "Exit" )
        exit
    ;;

    * ) echo "Bad option, please choose again"
esac

case的语法和C
family语言差异很大,它需求二个esac(就是case反过来)作为已毕标记,各个case分支用右圆括号,用七个子公司表示break

case

case "${opt}" in
    "Install-Puppet-Server" )
        install_master $1
        exit
    ;;

    "Install-Puppet-Client" )
        install_client $1
        exit
    ;;

    "Config-Puppet-Server" )
        config_puppet_master
        exit
    ;;

    "Config-Puppet-Client" )
        config_puppet_client
        exit
    ;;

    "Exit" )
        exit
    ;;

    * ) echo "Bad option, please choose again"
esac

case的语法和C
family语言差异很大,它须要二个esac(就是case反过来)作为达成标记,每一种case分支用右圆括号,用多少个支行表示break

函数

函数

函数

定义

定义

定义

调用

调用

调用

文本蕴涵

可以运用source和.关键字,如:

source ./function.sh
. ./function.sh

在bash里,source和.是等效的,他们都以读入function.sh的故事情节并推行其故事情节(类似PHP里的include),为了更好的可移植性,推荐应用第二种写法。

富含一个文件和在推行多少个文书一律,也要写那些文件的途径,不可以光写文件名,比如上述例子中:

. ./function.sh

不得以编写:

. function.sh

假如function.sh是用户传入的参数,如何得到它的相对路径呢?方法是:

real_path=`readlink -f $1`#$1是用户输入的参数,如function.sh
. $real_path

文本包括

能够利用source和.关键字,如:

source ./function.sh
. ./function.sh

在bash里,source和.是等效的,他们都以读入function.sh的始末并实施其故事情节(类似PHP里的include),为了更好的可移植性,推荐使用第③种写法。

含蓄3个文书和推行三个文书一律,也要写这么些文件的路线,不可以光写文件名,比如上述例子中:

. ./function.sh

不可以创作:

. function.sh

假使function.sh是用户传入的参数,怎样收获它的相对路径呢?方法是:

real_path=`readlink -f $1`#$1是用户输入的参数,如function.sh
. $real_path

文本包含

可以接纳source和.关键字,如:

source ./function.sh
. ./function.sh

在bash里,source和.是等效的,他们都以读入function.sh的故事情节并履行其内容(类似PHP里的include),为了更好的可移植性,推荐应用第叁种写法。

包括壹个文书和推行壹个文书一律,也要写那个文件的门径,无法光写文件名,比如上述例子中:

. ./function.sh

不得以创作:

. function.sh

假如function.sh是用户传入的参数,怎么着赢得它的绝对路径呢?方法是:

real_path=`readlink -f $1`#$1是用户输入的参数,如function.sh
. $real_path

用户输入

用户输入

用户输入

推行脚本时传出

履行脚本时传出

施行脚本时传出

本子运行中输入

本子运营中输入

本子运转中输入

select菜单

select菜单

select菜单

stdin和stdout

stdin和stdout

stdin和stdout

常用的授命

sh脚本结合系统命令便有了强大的威力,在字符处理领域,有grep、awk、sed三剑客,grep负责找出特定的行,awk能将行拆分成两个字段,sed则足以兑现立异插入删除等写操作。

常用的一声令下

sh脚本结合系统命令便有了强劲的威力,在字符处理领域,有grep、awk、sed三刀客,grep负责找出一定的行,awk能将行拆分成三个字段,sed则可以兑现立异插入删除等写操作。

常用的命令

sh脚本结合系统命令便有了强有力的威力,在字符处理领域,有grep、awk、sed三刀客,grep负责找出特定的行,awk能将行拆分成多个字段,sed则足以落成立异插入删除等写操作。

ps

查阅进程列表

ps

翻开进程列表

ps

翻看进度列表

grep

grep

grep

排除grep自身

排除grep自身

排除grep自身

找寻与target相邻的结果

摸索与target相邻的结果

搜寻与target相邻的结果

awk

awk

awk

sed

sed

sed

插入

插入

插入

替换

替换

替换

删除

删除

删除

xargs

xargs

xargs

curl

curl

curl

汇总案例

归结案例

总结案例

参考资料

参考资料

参考资料

相关文章