1.Shell脚本概述
通过Shell中的各种命令,开发者和运维人员可以对服务器进行维护工作。
但每次都手动输入命令,工作效率太低,而且很容易出错,尤其是需要维护大量服务器时。
为了能够对服务器批量执行操作,我们可以将需要执行的命令写入文件,批量执行,这种文件便是Shell脚本。
Shell脚本一般是以.sh 结尾的文本文件,当然也可以省略扩展名。
2.Shell脚本首行
脚本文件第一行通过注释的方式指明执行脚本的程序。
在Shell脚本中,#开头的文本是注释,但第一句 #! 开头的这句话比较特殊,他会告诉Shell应该使用哪个程序来执行当前脚本。
常见方式有:
#!/bin/sh
#!/bin/bash
#!/usr/bin/env bash
Python脚本的第一句一般是:#!/usr/bin/env python
3.第一个脚本
(1)创建a.sh文件
(2)将下面文本写入a.sh文件中:
#!/bin/bash
echo "Hello World"
echo "I love Linux"
(3)执行chmod a+x a.sh 对脚本授予可执行权限
(4)输入./a.sh 执行脚本
(5)查看脚本的退出状态:echo $?
Linux中的所有程序执行结束后都有状态码。
状态码为零表示正常,状态码为正整数代表异常退出。
效果展示:

4.变量
(1)定义
变量的定义与其他语言差距不大,需要注意的是赋值前后没有空格。
a=123
(2)使用
打印变量a,使用变量时,变量名前面必须加上$符号
echo "$a"
printf "$a\n"
(3)注意引号的差别
双引号将变量a拼接到字符串中,一起打印
单引号将字符串原样打印,不会对变量进行特殊处理
echo "--$a--"
echo '--$a--'
运行结果:

(4)数值运算
这里的数值和运算符都是expr命令的参数。
第一种方式:(此种方式,在相乘时,需要在乘号前加上‘\’,且运算符前后必须要有空格,否则会报错)
expr 1 + 2
expr 1 - 1
expr 4 \* 2
expr 4 / 2
第二种方式:(此种方式,不需要在在乘号前加上‘\’,也不需要运算符前后必须要有空格)
expr $[1+2]
expr $[1 - 1]
expr $[4 * 2]
expr $[4/2]
两种方式的运行结果相同:

(5)定义当前Shell下的全局变量
定义:通过export语句定义全局变量
前面我们在设置python环境时,就曾定义过全局变量:export PATH=$ HOME/.local/bin:$ PATH
定义完后,在终端里用source加载脚本:source ./.bashrc
(6)常用的系统环境变量:
$ PATH:可执行文件目录;
$ PWD:当前目录;
$ HOME:家目录;
$ USER:当前用户名;
$ UID:当前用户的uid;
运行结果:

5.分支语句(if)
格式:
if command
then
commands
elif command
then
commands
else
commands
fi
(1)if语句检查判断的依据实际上是,后面所跟的命令的状态码:0为True,其他值为False
#!/bin/bash
a=12
if ls
then echo 'True'
else echo 'False'
fi
运行结果:

(2)条件测试命令:[ …]
shell提供了一种专用做条件测试的语句[ … ]
这一对方括号本质上是一个命令,里面的条件是其参数,所以‘[’ 的后面和 ‘]’ 的前面必须有空格,否则会报错。
其可以进行三种比较:
数值比较、字符串比较、文件比较
用法:
if [condition]
then
commands
fi
例如:
#!/bin/bash
a=12
if [ $a == "13" ]
then echo 'True'
else echo 'False'
fi
运行结果:

(3)条件列表
数值比较:

字符串比较:

文件比较:

6.循环语句(for)
Shell中的循环结构有三种:for、while和until,这里重点介绍for循环
(1)for循环的基本格式:
for 变量 in 序列
do
要执行的命令
done
例如:打印并标明1到10中的寄偶数
for i in `seq 1 10`
do
if [[ $[ $i % 2] == 0 ]]
then
echo "偶数: $i"
else
echo "奇数: $i"
fi
done
运行结果:

seq START END 语句用来产生一个数字序列
$[ NUM1 + NUM2 ] 语句⽤来进⾏基本的数学运算
[[ … ]] 语句⽤来更⽅便的进⾏⽐较判断
(2)C语言风格的 for 循环:
for ((i=0; i<10; i++))
do
echo "num is $i"
done
运行结果:

(3)while循环
while [ -f "a.sh" ]
do
echo True
done

因存在a.sh文件,所以执行死循环,一直打印True.
7.函数
(1)函数定义
定义时,function不是必须的,可以省略
#!/bin/bash
#定义一个函数
function foo(){
echo "Hello World"
}
#调用函数
foo
运行结果:

在终端或脚本中直接输⼊函数名即可,不需要小括号
(2)函数的参数
传参也只需将参数加到函数名后面,以空格做间隔,像正常使用命令那样
#!/bin/bash
get_type(){
echo "执⾏者是: $0"
echo "第1个参数:$1"
echo "第2个参数:$2"
echo "参数数量是: $#"
echo "全部的参数: $@"
echo "全部的参数: $*"
}
get_type a b c d
运行结果:

8.获取用户输入
read -p "请输入:" xxx
echo "您输入的是:$xxx"
运行结果:

774

被折叠的 条评论
为什么被折叠?



