一.shell是什么
人和计算机内核之间的中介
二.linux当中的shell有哪些
1.bash
主流,也是绝大多数linux系统默认
2.sh
3.csh
类c语言的shell
4.tcsh
和csh类似,相当于升级版
5.nologin
也是一种shell,禁止用户登录
三.shell--脚本
扩建语言,动态语言,是一种编程语言,控制软件的程序,只有被调动才会运行
脚:把保存在文本中的代码执行起来
本:代码是保存在文本当中,特定条件(运行代码的条件)
四.shell脚本的作用
1.自动化运维
2.批量化重复操作,可以通过脚本和计划任务来进行
3.减轻了管理人员的工作量
4.避免配置出错
五.shell脚本的结构
1.vim first.sh(默认以sh结尾的文件是脚本文件)
2.#!/bin/bash
3.#this is my first shell-script
4.开执行语句:所有linux可执行命令都可以是代码内容
六.shell脚本运行
1.调试模式
脚本没有权限的情况下的运行模式
bash 脚本文件
sh 脚本文件
source 脚本文件(点命令,真正执行)
root@wth-virtual-machine:~# bash firsh.sh
2.赋权执行
chmod 777 脚本文件
./脚本文件
root@wth-virtual-machine:~# chmod 777 first.sh
root@wth-virtual-machine:~# ls
first.sh snap
root@wth-virtual-machine:~# ./first.sh
当前所在目录
/boot
展示其中以vml开头的文件
lrwxrwxrwx 1 root root 24 10月 28 10:10 vmlinuz -> vmlinuz-6.8.0-47-generic
-rw-r--r-- 1 root root 14M 2月 21 2024 vmlinuz-6.5.0-18-generic
-rw------- 1 root root 15M 10月 2 22:43 vmlinuz-6.8.0-47-generic
lrwxrwxrwx 1 root root 24 10月 28 10:10 vmlinuz.old -> vmlinuz-6.5.0-18-generic
3.定时任务
脚本必须要是绝对路径
七.重定向
1.重定向输入
< 从指定的文件文件获取
2.重定向输出
> 只能把标准输出保存到文件当中去,会覆盖
root@wth-virtual-machine:/opt# cat test.txt
123123123123123123123123123123123123
root@wth-virtual-machine:/opt# ls > test.txt
root@wth-virtual-machine:/opt# ls
123 gongxiang1 gongxiang2 test.txt xy104 xy105
root@wth-virtual-machine:/opt# cat test.txt
123
gongxiang1
gongxiang2
test.txt
xy104
xy105
>> 只能把标准输出保存到文件当中去,不会覆盖
root@wth-virtual-machine:/opt# ls >> test.txt
root@wth-virtual-machine:/opt# cat test.txt
123
gongxiang1
gongxiang2
test.txt
xy104
xy105
123
gongxiang1
gongxiang2
test.txt
xy104
xy105
3.重定向错误输出
2> 将错误信息保存到指定的文件,会覆盖
root@wth-virtual-machine:/opt# lsss 2> test.txt
root@wth-virtual-machine:/opt# ls
123 gongxiang1 gongxiang2 test.txt xy104 xy105
root@wth-virtual-machine:/opt# cat test.txt
找不到命令 "lsss",您的意思是:
"lsns" 命令来自 Debian 软件包 util-linux (2.37.2-4ubuntu3.4)
"less" 命令来自 Debian 软件包 less (590-1ubuntu0.22.04.3)
"lssu" 命令来自 Debian 软件包 nilfs-tools (2.2.8-1)
尝试 apt install <deb name>
2>> 将错误信息保存到指定的文件,不会覆盖
4.混合输出
&> 会覆盖
&>> 不会覆盖
root@wth-virtual-machine:/opt# ls &>> test.txt
root@wth-virtual-machine:/opt# cat test.txt
找不到命令 "lsss",您的意思是:
"lsns" 命令来自 Debian 软件包 util-linux (2.37.2-4ubuntu3.4)
"less" 命令来自 Debian 软件包 less (590-1ubuntu0.22.04.3)
"lssu" 命令来自 Debian 软件包 nilfs-tools (2.2.8-1)
尝试 apt install <deb name>
123
gongxiang1
gongxiang2
test.txt
xy104
xy105
八.变量
1.变量名
系统定义好的,每个用户都可以使用(全局变量)一般情况下是不可以修改
自定义变量:主要是用户定义的名称和名称对应的参数
自定义变量名:
1.不要用系统的命令作为变量名称
2.不要使用中文
3.变量名不能使用特殊符号来开头,可以使用下划线开头
4.定义变量时,一定要是字母开头,不能数字开头
5.变量名最好是对应的名称的英文
2.变量值
int ------整数,没有小数点
string------字符串,字母或者数字组成,会用引号引起来
布尔-----ture false 为真还是为假(一般条件判断的返回值)
浮点------小数
3.打印变量值
echo $nmu==变量名
root@wth-virtual-machine:/opt# a=345
root@wth-virtual-machine:/opt# echo $a
345
4.拼接
echo ${num}shuai
root@wth-virtual-machine:/opt# echo "${a}789"
345789
5.变量的作用范围
1.全局变量(主要是系统定义的,不能改的)
vim /etc/profile
export a=1
export b=2
如果有需要一直不变的参数可以供所有使用,就可以配置
副作用:一旦有改动,增加了复杂性
2.环境变量(也是全局变量的一种)
系统创建的,设置用户的工作环境
echo $USER 当前登录用户
echo $HOME 当前用户的家目录
echo $PATH 查看当前的搜索路径
如何添加
1.chmod 777 /opt/123.txt
2.PATH="$PATH:/opt"
3.位置变量,脚本外传参
root@wth-virtual-machine:/opt# vim first.sh
root@wth-virtual-machine:/opt# sh first.sh 10 20
10 20
4.预定义变量(全局变量的一种,脚本解释器提供,不能修改)
$*
表示命令或者脚本需要处理的参数,区别在于处理的方式不同
$@
区别:
"\*",会把传入的参数当做一个整体来进行处理,不加双引号和@是一样的,都是一个个处
$@ , 加不加双引号,都会把参数一个一个的处理
$#: 记录传递给脚本参数的个数
$?: 记录的上一次执行命令的返回码,用来判断上一次执行的命令是否成功
0和非0
只有0表示上一次的命令执行成功,其他的都是失败
9.变量运算
1.整数运算
a=1
b=2
c=((a+$b))
echo $c
a=1
b=2
c=$(($a+$b))
echo $c
root@wth-virtual-machine:/opt# vim first.sh
root@wth-virtual-machine:/opt# bash first.sh
3
let i=10*10
echo $i
let i=10*10
echo $i
root@wth-virtual-machine:/opt# vim first.sh
root@wth-virtual-machine:/opt# bash first.sh
3
e=$(expr 19 \* 5)
echo $e
e=$(expr 19 \* 5)
echo $e
root@wth-virtual-machine:/opt# vim first.sh
root@wth-virtual-machine:/opt# bash first.sh
3
100
95
2.非整数运算
bc运算器
num=$(echo "4.4+5.5" | bc)
echo $num
num=$(echo "4.4+4.5" | bc)
echo $num
root@wth-virtual-machine:/opt# vim first.sh
root@wth-virtual-machine:/opt# bash first.sh
3
100
95
8.9
awk
num1=$(awk 'BEGIN{print 4.45*1.2}')
echo $num1
num1=$(awk 'BEGIN {print 4.4*1.2}')
echo $num1
root@wth-virtual-machine:/opt# vim first.sh
root@wth-virtual-machine:/opt# bash first.sh
3
100
95
8.9
5.28