1. 什么是 shell?
shell 是一个程序,采用 c 语言进行编写的,是用户和 linux 内核沟通的桥梁。它既是一种命令语言,又是一种解释性的编程语言。
- kernel:为软件服务,接受用户或者软件指令驱动硬件,完成工作
- shell:命令解释器
- user:用户接口,对接用户
shell 脚本就是将完成一个任务的所有命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行的权限。
2. shell 基础用法
2.1 如何书写一个 shell 脚本
shell 脚本命名
命名要做到见明知意,比如:check_memory.sh,检查内存的脚本
虽然 linux 系统中,文件没有扩展名的概念,但是建议使用 .sh 结尾
shell 脚本格式
shell 脚本开头必须指定脚本运行环境以 #! (特例)符合组合来组成。比如:#!/bin/bash 指定该脚本的运行解析是由 /bin/bash 来完成
脚本组成
#1. 解释环境
#!/usr/bin/env bash | python | perl
#2. 注释说明
# Author: name
# CreateTime: 2023-04-22 17:07
# Description: 描述信息
#3. 执行代码
2.2 如何运行 shell 脚本
chmod u+x filename
bash filename
2.3 shell 中的特殊符号
~: 家目录 cd~代表进入用户家目录
!: 执行历史命令 !! 执行上一条命令
$: 变量中取内容符
+ - * / %: 对应数学运算 加 减 乘 除 取余
&: 后台执行
*: shell 中的通配符,匹配所有
?: shell 中的通配符,匹配除回车以外的一个字符
;: 分号可以在shell 中一行执行多个命令,命令之间用分号分隔
|: 管道符,上一个命令的输出作为下一个命令的输入 cat filename | grep "abc"
: 转义字符
``: 反引号,命令中执行命令 echo "today is `date + %F`"
'': 单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不解释变量
"": 双引号,脚本中出现的字符串可以用双引号引起来
2.4 shell 重定向
> 重定向输入 覆盖原有数据
>> 重定向追加输入,在原数据的末尾添加
< 重定向输出 wc -l < /etc/passwd
10 ));
then
echo "yes"
else
echo "no"
fi
#!/bin/bash
if [[ "aa" == aa* ]]
then
echo "yes"
else
echo "no"
fi
7.3 for
7.3.1 语法一
for var in value1 value2 value3 ...
do
commands
done
#!/bin/bash
for var in value1 value2 value3 value4
do
echo "输出:$var"
done
#!/bin/bash
for i in `seq 1 9`
do
echo "输出:$i"
done
#!/bin/bash
for i in `seq 9 -1 1`
do
echo "输出:$i"
done
7.3.2 语法二
for ((变量;条件;自增减运算))
do
commands
done
#!/bin/bash
for ((i=1;i/home/null
if [ $? -eq 0 ]
then
echo "`date +"%F %H:%M:%S"`: $1 is UP"
else
echo "`date +"%F %H:%M:%S"`: $1 is DOWN"
fi
# 脚本节奏控制,每隔5s执行一次
sleep 5
done
7.4.2 continue
跳过循环中的某次循环
#!/bin/bash
for (( i=1;i >= == 5{print $0}' num
6
7
8
9
10
[root@localhost shell]# awk '$1 == 5{print $0}' num
5
[root@localhost shell]# awk 'BEGIN{print 1 + 1}'
2
[root@localhost shell]# awk 'BEGIN{print 1 * 2}'
2
[root@localhost shell]# awk 'BEGIN{print 1 - 2}'
-1
[root@localhost shell]# awk 'BEGIN{print 1 / 2}'
0.5
逻辑运算
[root@localhost shell]# awk 'BEGIN{print 1 >= 2 && 1 = 2 && 1 = 2 || 1 = 2 || 1 5) print $0}' num
6
7
8
9
10
[root@localhost shell]# awk '{if($1 % 2 != 0) print $1" jishu" ;else print $1" ou"}' num
1 jishu
2 ou
3 jishu
4 ou
5 jishu
6 ou
7 jishu
8 ou
9 jishu
10 ou
# -v 指定变量和默认值
[root@localhost shell]# awk -v sum=0 '{sum+=$1}END{print sum}' num
55
[root@localhost shell]# cat num2
1 2 3
4 5 6
7 8 9
# 每行累加并输出 for
[root@localhost shell]# awk '{sum=0;for(i=1;i