shell脚本概述

shell 脚本并不是真正的编程语言,shell脚本是在linux的shell中运行,实际上shell脚本就是命令的集合,类似于windows的批处理命令,我们将需要做的操作写入一个shell脚本中,可以定时执行,一次执行多个命令,shell脚本是提高服务器管理维护的工具。

编写shell脚本

快速开始

下面实现一个脚本,输入日期和”Hello World!”:

  1. cd /usr/local/sbin 进入一个放shell脚本的目录
  2. vim first.sh 打开一个要编写的shell文件,后缀是.sh
  3. 输入shell脚本,并保存
    1
    2
    date
    echo "Hello World!"
  4. chomd +x first.sh 给脚本赋予执行权限
  5. ./first.sh 执行脚本

shell脚本使用变量

编写下列脚本

1
2
3
4
5
6
d=`date +%H:%M:%S`
echo "the scirpt start at $d"
echo 'wait 2 seconds'
sleep 2
d1=`date +%H:%M:%S`
echo "the scirpt start at $d1"

date +%H:%M:%S 是一整个命令,使用 反引号 包围起来
echo 回显时,如果有变量,需要使用双引号包围起来,变量前面加$符号
注意设置变量时不要有多余的空格
这里 d 和 d1 两个变量,保存了执行命令时的时间,所以需要两个分别来记录

数学运算

编写下列脚本

1
2
3
4
a=1
b=2
sum=$[$a+$b]
echo "$a+$b=$sum"

注意数学计算要用中括号[]括起来,并且前面加 $符号

用户输入交互

编写下列脚本,用户输入x和y,计算x+y并输出

1
2
3
4
read -p "please input a number x:" x
read -p "please input a number y:" y
sum=$[$x+$y]
echo "x is $x,y is $y,x+y = $sum"

脚本选项使用

编写脚本 option.sh

1
2
sum=$[$1+$2]
echo "x is $x,y is $y,x+y = $sum"

赋予执行权限后,使用命令 ./option.sh 88 99 进行执行,输出88+99的值

这里 $1$2 分别代表跟在脚本后的第一个和第二个选项, $0 代表脚本自身的名字

脚本使用判断

下面脚本判断输入是否大于60

1
2
3
4
read -p "please input your score:" a
if [ $a -gt 60 ];then
echo "you pass the exam"
fi

注意:逻辑表达式用[]括起来,注意 []前后的空格

两个整数之间的比较

字符串判断

文件判断

判断表达式

除了上面的if之外,还可以使用 else, elif 如下:

1
2
3
4
5
6
7
8
read -p "please input your score:" a
if [ $a -gt 60 ] && [ $a -lt 80 ];then
echo "you pass the exam"
elif [ $a -ge 80 ];then
echo "you are good at exam"
else
echo "you not pass the exam"
fi

case逻辑判断

1
2
3
4
5
6
7
8
9
10
11
read -p "input a number:" Num
case $Num in
1) echo 'you select 1'
;;
2) echo 'you select 2'
;;
3|4) echo 'you select 3 or 4'
;;
*) echo 'default'
;;
esac

* 代表其他所有情况

for 循环

1
2
3
for i in `seq 1 5`;do
echo $i
done

seq 1 5 表示 1 2 3 4 5 五个数,这是系统命令, 反引号中写的是系统命令
我们甚至可以写 ls 这个就会输入当前文件夹的所有文件

while循环

1
2
3
4
5
a=5
while [ $a -ge 1 ];do
echo $a
a=$[ $a -1 ]
done

until循环

1
2
3
4
5
a=5
until [ $a == 1 ];do
echo $a
a=$[ $a - 1 ]
done

until循环语法和while循环一样,区别在于 until 循环 满足添加会终止,while循环 不满足条件时终止

使用函数

1
2
3
4
5
6
function sumaa()
{
sumbb=$[$1+$2]
echo $sumbb
}
sumaa $1 $2

注意,函数一定要写在脚本的最前面

shell中的中断

break终中断

1
2
3
4
5
6
7
8
9
10
for i in `seq 1 5`
do
echo "$i"
if [ $i == 3 ]
then
break
fi
echo $i
done
echo -----

continue 中断

1
2
3
4
5
6
7
8
9
10
for i in `seq 1 5`
do
echo "$i"
if [ $i == 3 ]
then
continue
fi
echo $i
done
echo -----

continue 和 break 都是用于循环中,不同的是 break直接退出循环,continue 是跳过本次循环,进入下一次

exit

1
2
3
4
5
6
7
8
9
10
for i in `seq 1 5`
do
echo "$i"
if [ $i == 3 ]
then
exit
fi
echo $i
done
echo -----

exit命令是直接退出整个shell脚本


shell小练习

  1. 计算 1~100的和

    1
    2
    3
    4
    5
    sum=0
    for i in `seq 1 100`;do
    sum=$[$sum+$i]
    done
    echo $sum
  2. 输入数字n,计算1+n,如果n<1 重新输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    n=0
    sum=0
    while [ $n -lt 1 ];do
    read -p 'input n:' n
    done

    for i in `seq 1 $n`;do
    sum=$[$sum+$i]
    done
    echo $sum
  3. 编写shell脚本,将/root目录下所有目录复制到 /tem目录

    1
    2
    3
    4
    5
    6
    cd /root
    for f in `ls`;do
    if [ -d $f ];then
    cp -r $f /tmp/
    fi
    done

最后的练习

编写脚本实现下面功能
运行脚本提示,请输入你喜欢的操作系统(Windows 、Mac、Linux)
在用户输入windows后,提示一句话
在用户输入mac后,提示另一句话
在用户输入linux后,提示“真是伟大的选择”
直到用户输入linux后,脚本才运行结束,否则一直循环脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
read -p "input your opratiing system:    " x
echo $x
until [ $x == linux ];do
if [ $x == windows ];then
echo "first line"
elif [ $x == mac ];then
echo "second line"
else
echo "no such oprating system"
fi
read -p "input your opratiing system: " x
done
echo "good choice"