0%

Shell脚本学习笔记

Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell脚本是一种为Shell编写的脚本程序,一般听到的shell通常指shell脚本,但是我们要清楚shellshell脚本是两个不同的概念,因此为了简洁起见本文出现的shell编程都是指shell脚本编程,而不是指开发shell自身

Shell脚本

Shell编程Java编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。本文基于Mac OS系统对Shell编程进行介绍,其中Mac OS不仅带了sh、bash这两个最基础的脚本解释器,还内置了ksh、csh、zsh等不常用的解释器。

编写

打开文本编辑器,新建一个文件,扩展名为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的,PATH包括/bin, /sbin,/usr/bin/usr/sbin等路径,而当前目录通常不在PATH里,所以写成test.sh时系统是找不到的。所以我们需要用./test.sh告诉系统就在当前目录找。通过这种方式运行shell脚本,第一行一定要写对,好让shell程序查找到正确的解释器,所以使用/bin/sh作为解释器的脚本可以省去第一行

作为解释器参数

直接运行解释器,其参数就是shell脚本的文件名,比如

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

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

常用语法

变量

# 定义变量
# 注意,变量名和等号之间不能有空格!!!
my_name="huangning"

# 使用变量
# 使用定义过的变量,只要在变量名前面加美元符号即可,如:
echo $my_name
echo ${my_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当成一个变量(其值为空),代码执行结果就是I am good at

# 重定义变量
your_name="Henry"
echo $your_name

your_name="John"
echo $your_name

注意,第二次赋值的时候不能写$your_name="John",只用使用变量的时候才加美元符😊

注释

“#”开头的行就是注释,会被解释器忽略,其中shell里没有多行注释,只能每一行加一个#号。

#--------------------------------------------
# 这是shell脚本学习笔记

# 主题:变量
#--------------------------------------------

##### 变量创建 #####
#
#
##### 变量的使用 #####

如果需要达到批量注释的效果,可以将其用大括号括起来并定义成一个函数,不调用就可以起到注释的效果了

字符串

字符串是shell编程中最好用的数据类型了,字符串可以既可以用单引号,也可以用双引号,当然也可以不用引号🥳

字符串类型

# 无引号字符串
name=Hello
echo $name
# 无引号字符串内容中不能出现空格

# 单引号字符串
# 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
# 单引号字串中不能出现单引号,对单引号使用转义符后也不行
name='java'

# 双引号字符串
double="Hello, my favourite class is \" ${name}\"! \n"

# 双引号里可以有变量
# 双引号里可以出现转义字符
# 所以小编推荐大家使用双引号来表示字符串~

字符串操作

## 字符串拼接
my_name="huangning"
greeting_1="hello, my name is "$your_name"."
greeting_2="Nice to meet you!"
echo $greeting_1 $greeting_1

## 字符串长度获取
sentence="Current sentence length is:"
echo ${sentence} ${#sentence}

## 子字符串提取(左闭右闭区间)
info="I like dancing"
echo ${info:2:4}

条件判断

if [ `ls | grep picture` ]; then
echo "hello"
else
mkdir picture
fi

其中shell脚本中流程控制不能为空,而且if语句后面的方括号里是一个可执行程序,方括号中必须加空格

循环

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