一、shell简介
shell是一个命令行解释器,它可以接收用户输入的命令,然后调用操作系统的内核去执行这些命令 ,再把执行的结果返回给用户。
这种交互的方式,对于一些简单的操作来说是非常方便的。但是如果要执行一些复杂的操作,或者是需要重复执行一些命令的时候,这样的方式就显得比较麻烦了。
比如需要再凌晨的时候自动备份数据,或者需要定时清理一些日志文件等等。
这个时候我们就可以把想要执行的命令写入到一个文件中,然后再通过执行这个文件,来一次性执行所有的命令,这个文件就是一个Shell脚本,它可以用来编写一些自动化的任务。比如安装软件,清理数据,运维巡检等
二、基础语法
1、第一行
#! /bin/bash
- 用来表示这个脚本文件使用的是bash解释器
2、变量
变量的作用域是从定义的地方开始一直到脚本结束
如果想要在函数中定义一个局部变量的话,需要在前面加local,
local num = $1
$1
表示函数的第一个参数$0
: 当前脚本的名称$#
: 传递给脚本或函数的位置参数的个数$?
: 上一命令的退出状态码。0表示没有错误,非0值表示有错误$*
: 传递给脚本或函数的位置参数,双引号包围作为一个整体$@
: 传递给脚本或函数的位置参数$$
: 当前shell进程的进程ID(PID)$!
: 最后一个后台命令的进程$1-n
: 脚本或函数的位置参数
3、赋值
=
两边不能有空格!-
将一个命令的输出结果赋值给一个变量:
使用命令替换语法:反引号`` 或者$() ,后者更推荐
# number=`shuf -i 1-10 -n 1` number=$(shuf -i 1-10 -n 1) echo $number
4、关系运算符
只能用于数字
le
:小于等于gt
:大于ge
:大于等于eq
:等于ne
:不等于
5、逻辑运算符
-
||
: 或 -
!
: 非 -
&&
: 与
6、字符串运算符
-
=
: 相等 -
!=
: 不相等 -
-z
: 检查字符串长度是否为0,为0返回true -
-n
: 检查字符串长度是否不为0,不为0返回true -
$
:检查字符串是否不为空,不为空返回true -
<
:检查第一个字符串是否按字典顺序小于第二个字符串 -
>
:检查第一个字符串是否按字典顺序大于第二个字符串
7、if条件判断语句
- 中括号两边需要有空格
- if开头,fi结尾
# 小于2的数不是素数
if [ $num -lt 2 ]; then
return
fi
8、for循环语句
# 检查从2到sqrt(num)的数
for ((i=2; i*i<=num; i++));do
if [ $((num % i)) -eq 0 ]; then
return 1 # 返回1,表示不是素数
fi
done
9、while循环语句
- 关键字:while do done
- 循环控制:continue break
while true:
do
number=$(shuf -i 1-10 -n 1)
echo "please guess a number:"
read guess
if [[ $guess -eq $number ]];then
echo "bingo~Do you want to continue(y/n):"
read chioce
if [[ "$choice" == "y" ]] || [[ "$choice" == "Y" ]]; then
number=$(shuf -i 1-10 -n 1)
continue
else
break
fi
elif [[ $guess -lt $number ]];then
echo "guess too small"
else
echo "guess too big"
fi
done
10、读取命令行输入
- read
#! /bin/bash
echo "please input your name:"
read name
echo "hello,$name"
11、读取脚本参数
- $1:表示第一个参数
#! /bin/bash name=$1 company=$2 echo "hello, $name, welcom $company"
./name.sh kkite xiaoyan
12、读取环境变量
设置环境变量:
脚本:
#! /bin/bash echo "hello~ $name,welcom $company"
三、小练习
1、猜数字游戏
#! /bin/bash
echo "hello~ $name,welcome $company"
while true:
do
number=$(shuf -i 1-10 -n 1)
echo "please guess a number:"
read guess
if [[ $guess -eq $number ]];then
echo "bingo~Do you want to continue(y/n):"
read chioce
if [[ "$choice" == "y" ]] || [[ "$choice" == "Y" ]]; then
number=$(shuf -i 1-10 -n 1)
continue
else
break
fi
elif [[ $guess -lt $number ]];then
echo "guess too small"
else
echo "guess too big"
fi
done