Shell编程
如今,不会Linux的程序员都不意思说自己是程序员,而不会shell编程就不能说自己会Linux。说起来似乎shell编程很屌啊,然而不用担心,其实shell编程真的很简单。
一.背景
1.1.什么是shell编程
高大上的解释,往往让人摸不住头脑。一句话概括就是:shell编程就是对一堆Linux命令的逻辑化处理。
Shell是操作系统的最外层, Shell可以合并编程语言以控制进程和文件,以及启动和控制其它程。shell通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。
Shell是用户与 Linux操作系统之间沟通的桥采。用户可以输入命令执行,又可以利用Shell脚本编程去运行。
1.2 为什么要会shell编程
举个简单的例子,我们做javaweb开发的,在以前,如果要在本地将程序打包,然后部署到远程服务器(抛开现在的ci, 原始的方法), 我们以前的做法通常会经历如下几个步骤:
-
拉取最新代码(git pull)
-
编译打包
-
上传并部署到远程服务器
每次打包都要经历这一个阶段,效率低又烦躁。而此时,我们可以编写一个shell脚本,然后每次只需要运行一下这个shell脚本,即可实现打包部署这一系列动作,彻底解放双手,多好
1.3 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,由于易用和免费,Bash在日常工作中被广泛使用,也是大多数 Linux系统默认的Shell。
接下来我们条写一个简单的shell本。(shell脚本一般文件名以.sh结尾,同时文件第一行定义该脚本为shell脚本)
1.4 bash查看
echo $BASH
二 .入门
2.1 第一个shell程序
vi first_shell.sh //打开一个文件
#!/bin/bash //表明这是一个shell脚本 #Filename:first_shell.sh //这是一个注释,没有实际性的意义 #auto echo hello world //注释,脚本功能描述,自动打印"hello world" 的意思,没有实际性的意义 #by authers kds 2020-4 //注释,作者,时间,没有实际性的意义 echo "Hello World!" //打印hello world mkdir -p /local/2020/04/ //mkdir -p :递归创建目录,即使上级目录不存在,会按目录层级自动创建目录
esc :退出编辑
wq :保存
2.2 测试脚本是否有问题
没有任何输出则表示脚本没问题
sh -n first_shell.sh
2.3执行脚本
chomd o+x first_shell.sh //添加执行权限 ./first_shell.sh //运行
三.shell编程之变量详解
Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量, shell给一个变量赋值,实际上就是定义了变量,在 Linux支持的所有shell中,都可以用赋值符号(=)为变景赋值。
shell变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell脚本中使用。而环境变量则可以在创建它们的 shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shel1变量。
例如在脚本里面定义A=123,定义这样一个变景,前面变量名,后面是变量的值。
3.1 引用变景可以使用$A,把变景放在脚本里面会出现什么样的效果呢?
如下:
vi test.sh
#!/bin/bash //表明这是一个shell脚本 #Author kds 2020-4-27 A=369 echo "Printf variables equal is $A"
执行脚本:
/usr/bin/bash first_shell.sh
结果会显示到:
Printf variables equal is 369
简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了。
假如定义变景 name= mayun
执行echo $name将会显示 mayun
3.2 shell常见的系统变量解析:
$0 当前程序的名称
$n 当前程序的第n个参数,n=1,2,…9
$* 当前程序的所有参数(不包括程序本身)
$# 当前程序的参数个数(不包括程序本身)
$? 命令或程序执行完后的状态,一般返回0表示执行成功(直接 echo $? 表示查看上一个命令是否执行成功)。
$UID 当前用户的ID
$PWD 当前所在的目录
vi auto_var.sh
#!/bin/bash #auto print variables #Author kds 2020-4-27 #-e:激活转义字符。 echo -e '