shell脚本入门

shell脚本入门

学习 shell脚本 的目的是更好的管理github博客以及服务器。

为了给博客写一些自动化运维的脚本,比如定期创建hexo生成器的备份,定期生成和部署等等,shell脚本配合crontab,这样使用hexo博客的时候就只需要一篇一篇的书写博客就行了,生成部署备份的工作都可以交由crontab定期运行shell脚本来完成,定期创建新备份的同时还可以同时删除老备份,这样即使是失误破坏了hexo生成器也可以迅速找到之前的备份用于恢复。


shell

shell 使用c语言编写的程序。

shell既是命令语言又是编程语言。

shell是一层给linux内核与用户之间建立桥梁的中间层。用户通过shell访问linux内核功能。

windows中的explorer就是GUI的shell。

shell脚本

shell脚本 是为shell编写的脚本程序。我们通常说的shell是指shell脚本,但我们要知道shell和shell脚本是两个不同的概念。故而,我们所说的shell编程指的是shell脚本编写,而不是shell自身。

shell环境

只需要一个文本编辑器和一个脚本解释器。

文本编辑器不用多说,脚本解释器就是 bash zsh 等等。

常见的有:

Bourne Shell: /usr/bin/sh /bin/sh

Bounrne Again Shell: bin/bash

C Shell: /usr/bin/csh

K Shell: /usr/bin/ksh

Shell for Root: /sbin/sh

最常见的就是 bash ,也就是Bounrne Again Shell,bash也是绝大多数linux系统的默认shell解释器。

一般情况下,不区分Bourne Shell和Bounrne Again Shell,也就是 #!/bin/sh 可以改为 #!/bin/bash

编写shell脚本

  1. 新建file.sh文件,扩展名不影响脚本,.sh只是用来让用户知道这是个shell脚本而已。
1
2
#!/bin/bash
echo 'hello world!'

以上的 #! 后面带shell解释器路径,用于告诉shell这个脚本用什么解释器执行。

  1. 运行脚本
1
2
3
4
5
6
$ chmod +x file.sh
# 给脚本添加执行权限,此时ls后发现.sh文件已经变色了,因为它已经获取了执行权限。

$ ./file.sh
$ /local/shellScript/file.sh
# 输入脚本路径执行,绝对路径和相对路径均可

还有 /bin/bash file.sh , /bin/sh file.sh 这几种方法,意思是直接使用特定解释器解释脚本文件,无需在脚本文件里第一行添加 #! 声明。

shell变量

定义变量

变量命名规范:

  1. 变量名不能加美元符号。
  2. 变量名和等于号之间不能有空格。
  3. 命名只能用字母、数字、下划线,且不能以数字开头。
  4. 不能有空格。
  5. 不能使用bash里面的关键字。

正确变量命名:

1
2
#!/bin/bash
web_site0="herotiga.github.io"

还可以使用语句给变量赋值:

1
2
3
4
#!/bin/bash
for file in 'ls /etc'
# or
for file in $(ls /etc)

使用变量

在定义过的变量名之前加上 $ 即可:

1
2
3
4
#!/bin/bash
website="herotiga.github.io"
echo $website
echo ${website}

加不加花括号都行,花括号用于识别变量边界,最好加上花括号。

可以重复定义之前定义过的变量:

1
2
3
4
5
#!/bin/bash
website="herotiga.github.io"
echo $website
website="baidu.com"
echo $website

只读变量:

使用 readonly 命令可以将变量设置为只读:

1
2
3
4
5
#!/bin/bash
website="herotiga.github.io"
readonly website

website="baidu.com"

以上先定义变量后设置为只读,再重新定义变量,现在运行看看:

1
/bin/bash: NAME: This variable is read only.

删除变量

使用 unset 命令删除变量:

1
2
#!/bin/bash
unset website

unset命令不能删除只读变量。

变量类型

  1. 局部变量:定义在脚本或命令中,仅仅在当前shell实例中生效,其他shell无法访问局部变量。
  2. 环境变量:所有程序都能访问。
  3. shell变量:是特殊变量,其中一部分是环境变量一部分是局部变量。这些变量保证了shell正常运行。

shell字符串

字符串可以用单引号双引号或者不用引号。

1
2
#!/bin/bash
str='this is a string'

单引号

  1. 单引号中的所有字符都会原样输出,故而不能有变量。
  2. 单引号包裹中间不能出现单独的一个单引号。

双引号

  1. 双引号中可以有变量。
  2. 双引号中可以出现转义字符。

故而尽量使用双引号

拼接字符

1
2
3
4
5
6
my_name="mason"
greeting="hello, "$my_name" !" # hello, mason !
greeting="hello, {$my_name} !" # hello, mason !

greeting='hello, '$my_name' !' # hello, mason !
greeting='hello, ${my_name} !' # hello, ${my_name} !

获取字符串长度

1
2
str="my name is barry allen."
echo ${#str} # 23

提取子串

下标从0开始

1
2
str="my name is barry allen."
echo ${str:0:2} # my

查找子串

查找字符 i 首次出现的位置:

1
2
str="my name is barry allen."
echo `expr index "$string" i`

shell数组

bash支持一维数组,数组长度不限。

参考

  1. 菜鸟教程

评论