返回顶部
首页 > 资讯 > 操作系统 >Shell脚本编程30分钟入门(小结)
  • 192
分享到

Shell脚本编程30分钟入门(小结)

Shell脚本编程入门Shell脚本入门 2022-06-04 22:06:50 192人浏览 独家记忆
摘要

什么是Shell脚本 shell脚本(英语:Shell script),又称Shell命令稿、程序化脚本,是一种电脑程序与文本文件,内容由一连串的shell命令组成,经由Unix Shell直译其内容后运作。被当成是一

什么是Shell脚本

shell脚本(英语:Shell script),又称Shell命令稿、程序化脚本,是一种电脑程序与文本文件,内容由一连串的shell命令组成,经由Unix Shell直译其内容后运作。被当成是一种脚本语言来设计,其运作方式与直译语言相当,由Unix shell扮演命令行解释器的角色,在读取shell脚本之后,依序运行其中的shell命令,之后输出结果。利用shell脚本可以进行系统管理,文件操作等。

示例

看个例子吧:


#!/bin/sh

cd ~

mkdir shell_tut

cd shell_tut

 

for ((i=0; i<10; i++)); do

    touch test_$i.txt

done

 

示例解释
•第1行:指定脚本解释器,这里是用/bin/sh做解释器的
•第2行:切换到当前用户的home目录
•第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脚本的概念

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

shell脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。由于习惯的原因,简洁起见,本文出现的“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(Portable Operating System Interface)标准的shell解释器,它的二进制文件路径通常是/bin/sh,由Bell Labs开发。

本文讲的是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

高级编程语言

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

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

如下是一个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编程语言

熟悉 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发行版的标配,至于mac os,它默认安装了perl、python、ruby、php、java等主流编程语言。

第一个shell脚本

编写

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

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


#!/bin/bash

#!/usr/bin/php

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

运行

运行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作为解释器的脚本是不是可以省去第一行呢?是的。

作为解释器参数

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


/bin/sh test.sh

/bin/php test.php

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

变量

定义变量

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


your_name="qinjx"

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

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


for file in `ls /etc`

使用变量

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


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当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

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

重定义变量

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


your_name="qinjx"

echo $your_name

your_name="alibaba"

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里Product下的target_name.app名字一致

#

##### 用户配置区 结束 #####

如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

字符串

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

单引号


str='this is a string'

单引号字符串的限制:
•单引号里的任何字符都会原样输出,单引号字符串中的变量是无效
•单引号字串中不能出现单引号(对单引号使用转义符后也不行)

双引号


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

获取字符串长度:


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

提取子字符串


string="alibaba is a great company"

echo ${string:1:4} #输出:liba

查找子字符串


string="alibaba is a great compaAAkbyCny"

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

数组

管道

条件判断

流程控制


和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

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 else

if condition1

then

    command1

elif condition2

    command2

else

    commandN

fi

for while

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

while

while condition

do

    command

done

无限循环

while :

do

    command

done

或者

while true

do

    command

done

或者

for (( ; ; ))

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语言差别很大,它需要一个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

用户输入

执行脚本时传入

脚本运行中输入

select菜单

stdin和stdout

常用的命令

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

ps

查看进程列表

grep

排除grep自身

查找与target相邻的结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

--结束END--

本文标题: Shell脚本编程30分钟入门(小结)

本文链接: https://lsjlt.com/news/20285.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Shell脚本编程30分钟入门(小结)
    什么是Shell脚本 Shell脚本(英语:Shell script),又称Shell命令稿、程序化脚本,是一种电脑程序与文本文件,内容由一连串的shell命令组成,经由Unix Shell直译其内容后运作。被当成是一...
    99+
    2022-06-04
    Shell脚本编程入门 Shell脚本入门
  • Shell脚本编程入门编写教程
    这篇文章主要讲解了“Shell脚本编程入门编写教程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Shell脚本编程入门编写教程”吧!例子一:绘制特殊图形代码如下:#!/bin/bash&nb...
    99+
    2023-06-09
  • Linux Shell 脚本编程入门教程
    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在...
    99+
    2022-06-04
    脚本 入门教程 Linux
  • shell 脚本之用ab每隔30分钟并发一次休息10分钟
    一、脚本如下: #!/bin/bash echo "程序开始启动!" echo "程序每隔15分钟停一次休息10分钟" while true do echo "本轮循环开始执行! 本次并发测试30分钟!" ab ...
    99+
    2022-06-04
    ab每隔30分钟并发 ab并发
  • 一篇教会你写90%的shell脚本(入门小结)
    shell脚本? 在说什么是shell脚本之前,先说说什么是shell。 shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如linux中的Shell命令就包括ls、cd、p...
    99+
    2022-06-04
    shell脚本入门 shell 入门
  • 5个Shell脚本编程入门练习例子
    例子一:绘制特殊图形 #!/bin/bash MAX_NO=0 echo -n "Enter Number between (5 to 9) : " read MAX_NO i...
    99+
    2022-06-04
    脚本 入门 例子
  • shell脚本中如何使用ab每隔30分钟并发一次休息10分钟
    这篇文章主要为大家展示了“shell脚本中如何使用ab每隔30分钟并发一次休息10分钟”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“shell脚本中如何使用ab每隔30分钟并发一次休息10分钟”...
    99+
    2023-06-09
  • Linux Shell脚本系列教程(一):Shell入门
    一、Shell简介 诸多类Unix操作系统的设计令人惊叹。即便是在数十年后的今天,Unix式的操作系统架构仍是有史以来最佳的设计之一。这种架构最重要的一个特性就是命令行界面或者shell。shell环境使得...
    99+
    2022-06-04
    脚本 入门 教程
  • linux shell(.sh)脚本编写和运行入门
    编写第一个shell脚本 在gedit中编写.sh格式的文件,保存为a.sh。 代码: #! /bin/bash # employ bash shell player1=xiaoming # define a ...
    99+
    2022-06-04
    linux shell脚本编写运行 shell脚本编写 编写shell脚本
  • Bash Shell脚本编程笔记总结(一)
    本文是上课笔记总结,涉及细节知识点会在以后文章说明!bash脚本编程:脚本程序:解释器解释执行;shell: 交互式接口;编程环境;shell: 能够提供一些内部命令,并且能通过PATH环境变量找到外部命令...
    99+
    2024-04-02
  • Shell脚本编程的示例分析
    这篇文章给大家分享的是有关Shell脚本编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是Shell脚本Shell脚本(英语:Shell script),又称Shell命令稿、程序化脚本,是一种电...
    99+
    2023-06-09
  • 分享一个入门级可控多线程shell脚本代码
    说到shell可控多线程,网上分享的大部分是管道控制的方案。这种方案,张戈博客也曾经实战并分享过一次:《Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点》,感兴趣的朋友可以看看。 分享一个...
    99+
    2022-06-04
    多线程 入门级 脚本
  • Shell 脚本编写入门指南:从 Java 开始学起
    Shell 脚本是一种非常强大的工具,可以让你通过简单的命令快速地完成复杂的任务。它可以让你自动化很多繁琐的工作,例如文件操作、系统管理、进程管理等等。在这篇文章中,我们将从 Java 开始学习 Shell 脚本编写,帮助你更好地理解 S...
    99+
    2023-10-15
    django linux shell
  • 用于检测进程的shell脚本代码小结
    一个简单的shell脚本,用来找出关键的服务是否正在运行,适用于Linux或Unix操作系统。该脚本还可以使用电子邮件发送通知。 代码: #!/bin/bash# Name : service.chk 服...
    99+
    2022-06-04
    小结 脚本 进程
  • Shell 脚本自动输入密码的三种方式小结
    目录方式一方式二方式三注意,如果创建.sh文件后不可以执行,请执行sudo chmod 755 文件名.sh来修改权限。 方式一 使用 echo “密码” | (管道符) 使用场景: sudo 命...
    99+
    2022-07-01
    Shell 自动输入密码 Shell 自动输入
  • 用Python编写自己的Shell API脚本:从入门到精通
    Python是一种广泛使用的编程语言,而Shell是一种命令行解释器。Python可以通过编写Shell API脚本来扩展其命令行功能。本文将介绍如何用Python编写自己的Shell API脚本,从入门到精通。 安装Python 在编...
    99+
    2023-10-16
    关键字 shell api
  • shell脚本编程之数组的示例分析
    这篇文章将为大家详细讲解有关shell脚本编程之数组的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数组就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用...
    99+
    2023-06-09
  • 如何编写Linux下CentOS查后门程序的shell脚本
    这篇文章主要讲解了“如何编写Linux下CentOS查后门程序的shell脚本”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何编写Linux下CentOS查后门程序的shell脚本”吧!每...
    99+
    2023-06-09
  • Shell脚本入门之编写格式与执行方式的实现
    目标 1、掌握shell脚本编写规范 2、掌握执行shell脚本文件的3种方式与区别 Shell脚本文件编写规范  脚本文件后缀名规范 shell脚本文件就是一个文本文件, 后缀名建议使用 .sh 结尾 首行格...
    99+
    2022-06-04
    Shell 编写格式 Shell 执行方式
  • Linux命令行和shell脚本编程的示例分析
    小编给大家分享一下Linux命令行和shell脚本编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一个脚本文件代码如下:#!/bin/bashech...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作