0
点赞
收藏
分享

微信扫一扫

Linux基础和Shell编程

Linux简介和作者等

Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的,同时他也是Git的作者。 Linux是一个典型的GPL通用公共许可证项目,只要你遵循GNU的GPL保证开源,任何人都有权利自由的使用和修改Linux底层源码,因为这个特性,市面上的Linux发行版层出不穷。 <br> Linux的主要实现就是内核,然后是系统自带库,shell,应用程序 内核包括:设备驱动程序,进程管理内存管理,文件系统,网络协议栈等 系统库包括:C标准库,数学库,动态链接库,线程库,第三方库等 shell:命令行解释器,接受用户传来的命令通过它调用api来传递给操作系统运行 应用程序:Linux软件。 cgi-bin_mmwebwx-bin_webwxgetmsgimg_&MsgID=8716338019634766361&skey=@crypt_4382b39a_b5924f41c6f332a274ccb3a7fa6e1b20&mmweb_appid=wx_webfilehelper.webp 发行版就是将如图上面的东西编辑打包在一起形成一个新的操作系统。常见的发行版是CentOS,Ununtu,KALI,debian等等

安装虚拟机

在电脑安装Vmware之后创建一个虚拟机,这里不做教程自行搜索 Vmware 16 下载 https://www.123pan.com/s/2BtiVv-3Ke8.html Centos7 镜像下载 https://mirrors.aliyun.com/centos/7/isos/x86_64/?spm=a2c6h.25603864.0.0.6aa74511u1Gh2p 目标大数据项目当个机器的硬盘要大于 80G,内存要大于 2G <br> 也可以使用docker,或者使用云服务器的云大数据环境,例如阿里天池。

Linux二级目录讲解

/bin:存放基本用户命令的二进制文件,例如 ls、cp、mv 等。这些命令在单用户模式和所有用户环境中都可用。 /boot:存放启动引导程序和内核文件,包括 grub 启动引导程序和内核映像文件(如 vmlinuz)。 <br> 挂载分区 /dev:存放设备文件。这些文件是对系统中各种设备(如硬盘、终端、打印机)的抽象。 /dev/null: 黑洞文件,在这里面的信息不存在默认删除 /media:挂载点目录,用于挂载可移动媒体设备(如 CD-ROM、USB 设备)。系统会在该目录下创建子目录并挂载设备。 /mnt:临时挂载点目录,用于手动挂载临时文件系统。 <br> /etc:存放系统配置文件和脚本,包括系统启动、网络配置、用户管理等。 /home:存放用户的主目录,每个用户都有一个自己的子目录(如 /home/username),用于存放用户的个人文件和设置。 /root:超级用户(root 用户)的主目录。与 /home 目录下的普通用户主目录不同。 <br> /lib和/lib64:存放系统的共享库文件,这些库文件是系统和应用程序运行所需的基本函数库。 /opt:用于安装附加的可选软件包。通常用于存放第三方应用程序。 /proc:虚拟文件系统目录,包含关于正在运行的进程和系统状态的文件。这些文件不是实际存储在磁盘上的,而是由内核动态生成的。 <br> /sbin:存放系统管理员使用的基本系统二进制文件,例如 fdisk、ifconfig 等。普通用户通常无权运行这些命令。 /sys:虚拟文件系统目录,类似于 /proc,用于存放关于系统和硬件信息的文件。这些文件由内核生成,用于表示设备和内核结构。 /tmp:存放临时文件。系统和应用程序在运行过程中会在此目录中存放临时文件。通常,该目录中的文件会在系统重启时删除。 <br> /usr:存放用户二进制文件和只读数据,包括二进制文件、库文件、文档等。常见子目录有: ● /usr/bin:存放用户使用的二进制文件(除了基本命令之外的其他命令)。 ● /usr/sbin:存放系统管理员使用的二进制文件。 ● /usr/lib:存放系统和用户程序的库文件。 ● /usr/share:存放共享的、独立于架构的数据文件(如文档、配置文件示例等)。 <br> /var:存放变量文件,如日志文件、邮件队列、打印机队列等。内容经常变化。 ● /var/log:存放系统日志文件。 ● /var/spool:存放任务队列文件,例如打印机队列、邮件队列。 ● /var/tmp:存放临时文件,重启后通常不会删除。 <br>

vi/vim 编辑器

vi是Linux中默认使用的原版编辑器,vim是他的增强版需要手动安装 yum install vim -y。使用方法是一样的,但是vim添加一些新的功能等实现更好的显示和使用 vi中常用的 有三种模式,命令模式,插入模式和尾行模式 默认是命令模式 image.webp 模式切换:打开文件 vi [文件名] 或者 vim [文件名] 如果当前目录下没有此文件就会自动创建一个,当我们打开文件后想要从命令模式改为插入模式 可以按 I 进入插入 A 追加 O打开,编辑完成后按ESC回到命令模式。其中大小写的区别如下O是上一行插入,o是下一行插入,i是当前位置插入,I当前行头插入,a当前位置插入,A行末尾插入。 保存按下:进入尾行模式 输入 wq 回车保存并退出 !是强制的意思 cgi-bin_mmwebwx-bin_webwxgetmsgimg_&MsgID=9190613594693983330&skey=@crypt_4382b39a_b5924f41c6f332a274ccb3a7fa6e1b20&mmweb_appid=wx_webfilehelper.webp image.webp 浏览 在使用vim的时候,我们可以使用HJKL 或者箭头来实现光标的左下上右。按下^就会到行首,$就会到行尾。使用Ctrl+f或者Ctrl+b可以快速的向前或者向后翻页。Ctrl+u Ctrl+d 可以快速的向上或者向下翻半页。 image.webp

快捷复制 在命令模式连续按下两次y就可以复制内容,p粘贴光标的下一行,dd删除内容 分别代表复制,粘贴,剪切。按下一个G就可以快速跳转最后,gg来跳转文件的第一行。100G就是跳转到第100行,或者 :100 也可以跳转到100行 查找 在尾行模式输入 :set nu 侧面会显示行号 不想显示 :set nonu。在命令模式下,输入 /[查找内容] 就会触发查找,这个是往当前光标下面开始查找,?[查找内容] 从上查找,(区分大小写 \可以不区分大小写 例如 /hello\c )n定位下一个,N定位上一个 替换 [start,over]s/Hello/World/g [start,over]范围,不写选中当前行 s替换Hello为World g代表其中的所有匹配项 。如果替换范围是整个文件 范围 [1,$] 撤销 点击u

针对文件操作 命令

显示文件信息

ll 或 ls 显示文件信息 cat 文件名 显示文件的全部内容 less 文件名 分页展示文件内容 head [-n 数字] 文件名 显示文件前n行 [-n 数字] 属性可选,默认5 tail [-n 数字] 文件名 显示文件后n行,默认5 tail -f 实时展示文件内容更新

文件操作

复制文件: cp 目标文件 复制后文件名 (-r 递归复制文件夹下的所有文件) 移动文件:mv 目标文件 移动后的文件名 (mv 是移动文件的做法,如果操作位置一致文件名不一致就是重命名) 删除文件:rm 文件名 删除文件 rm -rf 文件目录 递归删除文件夹目录下的所有文件 创建目录:mkdir 文件名 创建文件夹 (-p 遍历创建目录层级) 文件位置:cd [ ] .. 表示上一级 ../.. 上一级的上一级目录 / 根目录 查看位置:du -h列出当前目录下的所有文件和文件大小
使用树方式查看当前目录的文件位置:[要提前安装 yum install tree -y] tree 删除目录:rmdir 目标文件 删除目标空文件夹,里面不可以有东西 【更推荐 rm -r 目录名称】 创建文件:touch 文件名 在当前目录下创建一个新文件 echo " " > 文件名 创建文件写入信息 Linux目录结构: 在Linux中 目录是按照目录树的方式排布的所有的文件都是从根目录开始的 '/' 标识根目录 ,在系统中有两个路径类型,相对文件类型和绝对文件类型 相对会从当前位置开始找没有用'/'开头,绝对从/开始一层一层的指引到文件位置。 '~' 当前用户的home 目录。 '-' 上一次所在的目录。

文件下载,压缩解压

tar -czvf 压缩包名.tar.gz 目录或文件名:压缩文件或目录。
tar -xzvf 压缩包名.tar.gz:解压缩文件。
wget 文件网址:从指定网址下载文件。 curl -O 文件网址:从指定网址下载文件。 v 展示过程 c 创建压缩 z 使用gzip算法 f 指定压缩文件名 -C 指定解压位置 zip -r 压缩包名.zip 文件名1 文件名2 文件名3 unzip 压缩包名.zip -d 目标目录

Linux之间的文件传输

scp 源数据地址 目标数据地址 (scp是默认覆盖模式,适合大文件) scp -C[允许在传输的时候压缩,可以提高效率] [-r 递归整个目录] [-l 限制传输带宽KB/s] 参考使用: scp -Crp -l 100 test/ root@IP:目标IP位置 rsync 需要提前安装 rsync会先对文件比较,不一样了才会传输,时间比较慢比较吃资源 -a 归档递归,-z 允许压缩处理,--progress 显示传输进度,-bwlimit 限制传输带宽kb/s,--partial 恢复上次进度,断点重传 --exclude 'X' 传输排除x文件 --exclude-from 'X' 排除指定X格式的文件

列表操作和文件权限

ls 列出目录下的所有文件 (-l 更详细的文件信息 -a 显示所有隐藏文件 -h 格式化显示文件大小 -t按照时间排序 -r 逆序显示 -i 显示i节点信息) ll 列出目录下的所有文件的详细信息 等同于 ls -l image.webp 使用软链接相当于快捷方式,当这个文件被调用的时候就相当于重定向到另一个文件中,硬链接复制了这个文件的i节点共享一样的文件内容,创建方式分为软链接和硬链接
ln -s 目标文件 链接文件名 (-s 创建软链接) tree 可以展示文件目录树,需要提前安装。

文件权限说明

例如:rw- rw- r-- 这是一个文件的对应操作权限展示 r标识可读,w可写,x可运行 -无此权限 3个一组,三组一个标识 创建者权限 同组用户权限 其他用户权限 chmod +x 文件名 (添加执行权限给这个文件,+rw 添加读,写权限) chomd o-x 文件名 (删除其他用户的可执行权限,u 所属用户 g 同组用户 o 其他用户) chomd ug+xr 文件名 (为ug者两种用户添加可执行可写权限) 还可以使用数字来说明权限:r = 4,w = 2,x = 1,rwx = 7 , rw = 6,rx = 5 chomd 711 文件名(拥有者有rwx权限,其他用户都有可执行权限) chomd 761 文件名(拥有者有rwx权限,同组用户有读和运行权限,其他用户都有可执行权限)

进程|时间同步|防火墙|系统管理等杂项.

网络和防火墙

ifconfig 展示网络信息 ip addr 展示网络接口等信息 ping 域名或IP 测试网络连接
netstat -tuln 显示当前监听的网络端口 traceroute 域名或IP 显示到目标主机的路径 systemctl stop firewalld 关闭防火墙 (stop enable start 启动,禁用,启动) vi /etc/sysconfig/network-scripts/ifcfg-ens33 编辑网络配置

BOOTPROTO=static
UUID 整行删除
NOBOOT=yes
IPADDR= IP
NETMASK=255.255.255.0
GATEWAY= 网关
DNS1、DNS2、DNS3=114.114.114.114

--> systemctl restart network
--> 图形化网络配置:nmtui

查看进程

ps aux 展示所有进程 top 动态显示进程信息 htop 优化版动态显示进程信息 需要安装 kill PID [9] [-15] 强制删除进程 软关闭进程 ps -ef | group [进程关键字] 根据关键字查询进程

磁盘使用情况

df -h 显示文件系统的磁盘使用情况

查看系统信息

uname -a 显示系统详细信息。 uname -r 显示内核版本 hostname [主机名] 显示或设置主机名

关闭Linux:

halt 断电关闭 poweroff 直接关机不管里面进程 shutdown -h [now]时间 延迟一段时间关机计算机但是会给其他用户发通知 reboot 重启

时间同步:

yum install ntp 安装时间同步的软件 ntpdate -su 210.72.145.44 【中国国家授时中心】 ntpdate -su api.bz 【NTP上海服务器】 不允许联网的情况下可以在内网中自己搭建NTP服务器来让内网中的其他机器访问实现时间同步。

用户管理和多进程

useradd 用户名 [-g 组名 -G 附属组] 添加新用户 passwd 用户名 为用户设置密码 usermod -L 用户名 锁定用户 usermod -U 用户名 解锁用户 userdel -r 用户名 删除用户 groupadd 组名 新建新用户组 groupmode -n 新名 旧名 修改组名 usermod 用户名 -g 主组 -G 附属组名 将用户添加到组 groupdel 组名 删除组名 如果下面有主用户删除不了需要提前转移

多窗口 screen 需要安装 screen -S 窗口名 创建一个新的窗口并进入 [在窗口中] Ctrl + A + D 挂载当前状态回退到主机 screen -ls 展示当前所有在后台的窗口 screen -r 窗口id 进入指定窗口id

su 权限赋予

编辑 chmod u+w /etc/sudoers 先给只读文件添加可写权限,vi /etc/sudoers 在大概100行的时候添加 wangwu(用户) ALL=(root) /sbin/useradd 给用户王五添加可以sudo 用户添加的能力,执行效果等同于root用户操作

包管理命令

rpm -lvh xxx.rpm 安装指定的rpm软件 软件安装到 /usr 如果安装的需要有环境配置会软连接到 /usr/bin 会被自动加载, rpm -qs | grep 匹配名称 根据关键字查找这个rpm包信息 rpm -Uvh xxx.rpm 升级指定的rpm软件 rpm -evh xxx.rpm 删除rpm包

yum底层是rpm 更好用 yum 适用于RedHat,apt适用于Debian yum update | apt update 更新包索引,新系统必做 apt upgrade 升级所有已经安装的包 apt remove 包名 | yum remove 包名 删除指定包 apt autoremove | yum clean all 自动清理缓存和无用包

关于国内无法使用apt,yum的换源说明: 运行脚本:bash <(curl -sSL https://linuxmirrors.cn/main.sh) 参考操作:1 y y y y

管道和重定向

cat 文件监听 grep '文本' 文本匹配

在Linux中管道和重定向作为高级用法的一部分,具有极高的灵活性和使用价值,分别用符号 '>',‘>>’'<' 和 ' | ' 等 重定向用于将命令的输入或输出重定向到文件或另一个命令。常见的重定向符号包括 >、>>、<、2> 等。

输出重定向

'>' 将命令的输出重定向到一个文件(单此操作覆盖原文件内容),不建议第一次创建文件使用 '>>' 将命令的输出追加到一个文件(不覆盖原文件内容)
例如:ls > file1 echo "这是我查找的文件" >> file1

输入重定向

'<' 将文件的内容作为命令的一部分传入,常用用法:cat > [目标文件] << EOF 将cat监听到的数据写入到目标文件中,输入EOF结束

错误重定向

在运行代码的时候后面添加 '2>>' 或者 '2>' 可以把标准的错误日志追加到一个文件中 例如: ls 错误文件名 2>> error.log 代码会把错误信息追加到error.log文件中 &> &>> 可以同时做错误重定向的同时还会做输出重定向 2&>1

管道: 管道用于将一个命令的输出作为另一个命令的输入,使用符号 |。
ls -l | grep "正则" 常用,查看匹配正则的当前目录下的所有文件信息 cat 文件名 | grep "关键词" > output.txt 上述命令会将 cat 命令的输出传递给 grep 进行过滤,并将过滤后的结果写入到 output.txt 文件中。
ll或者ls | grep '关键字' 根据关键字列出匹配的文件信息 ping -c 1 baidu.com | grep from | cut -d ' ' -f 4 ping百度,匹配带有from的哪一行给cut按照空格分割取第四段

创建一个shell脚本

shell是作为系统内核的api服务层的一个壳子,他接受外部的请求并协调系统内核将处理的数据返回,我们可以创建一些脚本来做到复杂的命令执行,定时的任务等等不需要有人值守,他的原理就是根据算法一层一层的往内核提供命令 在编辑器中使用 vim hello.sh 可以创建一个shell文件,后缀可不写,需要注意的是,如果在脚本中定义函数,这个函数的作用域会一直持续到脚本结束,如果需要创建一个局部变量要加一个 local修饰 运行脚本的方式:bash 脚本名.sh source 脚本名.sh . 脚本名.sh ./脚本名.sh

#!/bin/bash   # 设置默认脚本解释器为bash

username=$(whoami)  #创建变量username 存储 whoami 的输出数据
local datatime=$(date)   #创建临时变量datatime 存储 date 的储输出数据
echo "你好${suername},现在是${datatime}"  #调用变量展示数据
#!/bin/bash

# 设置默认脚本解释器为bash

# 定义函数来打印99乘法表
print_multiplication_table() {
    # 外层循环,从1到9
    for i in {1..9}; do
        # 内层循环,从1到i
        for j in $(seq 1 $i); do
            # 计算并打印乘法结果,格式化输出
            result=$((i * j))
            printf "%d x %d = %d\t" $j $i $result
        done
        # 每一行结束后换行
        echo ""
    done
}

# 定义函数来计算阶乘
calculate_factorial() {
    local num=$1
    local factorial=1
    # 使用for循环计算阶乘
    for ((i = 1; i <= num; i++)); do
        factorial=$((factorial * i))
    done
    echo "阶乘 $num! = $factorial"
}

# 调用函数打印99乘法表
echo "99乘法表:"
print_multiplication_table

# 计算并打印1到5的阶乘
echo ""
for n in {1..5}; do
    calculate_factorial $n
done

It :小于 | le :小于等于 | gt :大于 | ge :大于等于 | eq :等于 | ne :不等于 给编写的脚本添加可执行权限 chmod +x file1.sh
$0 标识当前脚本名 $1 标识第一个参数 $2 标识传入的第二个参数 通过参数给文件提供信息的案例:

#!/bin/bash

filename = $0
name = $1
channel = $2
echo "你好$name,欢迎你来到$filename中"
echo "你传入的值是 $channel"

image.webp 配置环境变量:在用户home目录下 .profile,每次加载终端会刷新一次,.bashrc只有加载用户的时候才会被刷新,/etc/profile 是对所有用户都有效的系统环境变量 修改环境变量要使用 source /etc/profile

#!/bin/bash

# 获取当前用户名
username=$(whoami)

# 欢迎用户
echo "$username 你好,欢迎来玩猜数字游戏"
echo "正在重新生成一个数字..."

# 生成一个随机数字
randomnum=$(echo $RANDOM)
echo "随机数已生成(为了测试,实际数字是:$randomnum)"

# 无限循环,直到用户猜对数字或选择退出
while true; do
  # 提示用户输入数字
  echo "请输入一个数字:"
  read usernum
  
  # 判断用户输入的数字和随机数字的关系
  if [[ $usernum -ne $randomnum ]]; then
    if [[ $usernum -lt $randomnum ]]; then
      echo "数字小了"
    else
      echo "数字大了"
    fi
  else
    # 用户猜对了数字
    echo "猜对了,太厉害了!再来一把?(y/n)"
    read restart
    if [[ $restart == "y" ]] || [[ $restart == "Y" ]]; then
      # 重新生成一个随机数字
      randomnum=$(echo $RANDOM)
      echo "新的随机数已生成(为了测试,实际数字是:$randomnum)"
    else
      # 用户选择不再玩,退出循环
      break
    fi
  fi
done

echo "游戏结束,谢谢你的参与!"

Shell脚本入门和语法

脚本的启动有多种方式 bash 或 sh 执行脚本时会新开一个 bash,不同 bash 中的变量无法共享。而 source 或 . 是在同一个 bash 里面执行的,所以变量可以共享。 带路径运行或者使用bash添加路径都要有可执行的权限 image.webp

变量和基本语法

# 这是一个单行注释

<< EOF
我是一个多行注释
EOF

# 定义变量
# 当希望变量存储更复杂的值时,就需要使用引号。引号用于处理带有空格字符的文本和文件名。
name = $(shell语句)
take = 'Hello how a u'
echo $name
echo ${take}
[双引号 " " 包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中
的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解
析后再输出的变量定义。 ' '适用纯文本]

# 位置参数
# 在调用的时候传入的值,在内部使用 $1,$2或者${1},${2}……接收
echo "name: $1"
echo "age: $2"
# 脚本调用 bash test.sh zhangsan 18
返回》》》》》》》
name: zhangsan
age: 18

# 其他位置变量
$$ 获取当前进程ID  $0 表示文件名  $n 传递给脚本的参数,n数字  $@ $* 传递给脚本
或函数的所有参数  $# 传递给脚本或函数的参数个数。  $?获取上一个命令的退出状态,
或者上一个函数的返回值
function add() {
return $(expr $1 + $2)
}
# 调用函数
add 20 30
echo $? 
返回》》》》》  50

字符串有关操作 ``shell

字符串

单引号'' 和 双引号"" 都可以标识一个字符串,在shell中基本数据类型除了字符串和 数字类型就没有了 ' ' :会原样输出,不吃变量,不可以内部出现单引号也不允许转义单引号 " " :引用输出,包含变量可得到该变量的值不是原样输出,可以输出单引号只要有转义

获取长度

name=mrhelloworld echo ${#name} # 在变量前加一个#可以获得长度

拼接字符串

str1=$name$age # 中间不能有空格 str2="$name $age" # 如果被双引号包围,那么中间可以有空格 str3=$name": "$age # 中间可以出现别的字符串 str4="$name: $age" # 这样写也可以 str5="${name}同学: ${age}岁" # 这个时候需要给变量名加上大括号

截取字符串

str name1 = zhangsan echo ${name:5} # 输出name从0开始第六位开始输出,结果为 san echo ${name:3:2} # 输出name的第四位开始后的两位 结果 ng echo ${name:0-10:5} # 0-表示从右边开始数 结果 hangsan

匹配字符串

#xx 返回字符串右边 %xx 返回字符串的左边 url=https://www.baidu.com echo ${url#//} #返回//右边的东西 www.baidu.com echo ${url%//} #返回//左边的东西 https

### 数组
```shell
# 数组(Array)是若干数据的集合,其中的每一份数据都称为元素,数组长度不固定
arr=(20 56 "mrhelloworld")
# 获取索引
echo arr[0]  # 根据所引进获得值 20
# 指定索引添加值
arr[3] = 3

# 获取长度
echo ${#arr[*]}  # arr中所有元素的长度 4

# 拼接字符串
array_new = (${array1[*]} ${array2[*]})

# 删除数字或者指定值
unset arr[3]  # 删除数组指定索引的数据
unset arr      # 删除这个数组

运算符

# Shell 不能直接进行算数运算,必须使用数学计算命令,expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

》》》测试脚本1》》EOF
#!/bin/bash
a=10
b=20
val=$(expr $a + $b)
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
  echo "a 等于 b"
fi

if [ $a != $b ]
then
  echo "a 不等于 b"
fi
EOF《《《测试脚本1结束《《《


》》》测试脚本2》》EOF
#!/bin/bash
a=10
b=20

if [ $a -eq $b ]
then
  echo "$a -eq $b : a 等于 b"
else
  echo "$a -eq $b: a 不等于 b"
fi

if [ $a -ne $b ]
then
  echo "$a -ne $b: a 不等于 b"
else
  echo "$a -ne $b : a 等于 b"
fi

if [ $a -gt $b ]
then
  echo "$a -gt $b: a 大于 b"
else
  echo "$a -gt $b: a 不大于 b"
fi

if [ $a -lt $b ]
then
  echo "$a -lt $b: a 小于 b"
else
  echo "$a -lt $b: a 不小于 b"
fi

if [ $a -ge $b ]
then
  echo "$a -ge $b: a 大于或等于 b"
else
  echo "$a -ge $b: a 小于 b"
fi

if [ $a -le $b ]
then
  echo "$a -le $b: a 小于或等于 b"
else
  echo "$a -le $b: a 大于 b"
fi
EOF《《《 测试脚本2结束《《《

》》》测试脚本3》》》EOF
#!/bin/bash
a=10
b=20
if [ $a != $b ]
then
  echo "$a != $b : a 不等于 b"
else
  echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
  echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
  echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
  echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
  echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
  echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi 
if [[ $a -lt 100 && $b -gt 100 ]]
then
  echo "返回 true"
else
  echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
  echo "返回 true"
else
  echo "返回 false"
fi
EOF《《《测试脚本3结束《《《

image.webp image.webp image.webp image.webp image.webp

文件计算

》》》脚本1开始》》》EOF
#!/bin/bash
file="/root/test.sh"
if [ -r $file ]
then
  echo "文件可读"
else
  echo "文件不可读"
fi

if [ -w $file ]
then
  echo "文件可写"
else
  echo "文件不可写"
fi

if [ -x $file ]
then
  echo "文件可执行"
else
  echo "文件不可执行"
fi

if [ -f $file ]
then
  echo "文件为普通文件"
else
  echo "文件为特殊文件"
fi

if [ -d $file ]
then
  echo "文件是个目录"
else
  echo "文件不是个目录"
fi

if [ -s $file ]
then
  echo "文件不为空"
else
EOF《《《脚本结束《《《

image.webp

流程控制

# if语法
if [ 条件 ]
then
  成立怎么完成
fi   # 代表结束

# if else
if [ 条件1 ]
then
  条件1成立
elif [ 条件2 ]
then
  条件1不成立但条件2成立
else
  都不成立的情况下
fi

# 匹配语句 case shell不存在流程语句穿透
》》》脚本开始》》》EOF
#!/bin/bash
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read num
case $num in
  1)
    echo '你选择了 1'
    ;;
  2)
    echo '你选择了 2'
    ;;
  3)
    echo '你选择了 3'
    ;;
  4)
    echo '你选择了 4'
    ;;
  *)
    echo '你没有输入 1 到 4 之间的数字'
    ;;
esac
EOF《《《脚本结束《《《

循环语句

# for 循环
for var in item1 item2 ... itemN
do   # 开始循环
  循环体
done  # 循环结束

# while 循环
while 条件  # true为死循环,需要break
do
  循环体
done

》》》脚本开始》》》EOF
for loop in 1 2 3 4 5
do
  echo "The value is: $loop"
done

for i in node01 node02 node03
do
  echo $i
done

my_array=("apple" "banana" "cherry" "date" "elderberry")
# 使用 for 循环遍历数组
for element in "${my_array[@]}"; do
  echo "Current element: $element"
done

i=1
while(( $i<=5 ))
do
  echo $i
  let "i++"   # 只有在双引号中才能计算
done
EOF《《《脚本结束《《《

# break 命令允许跳出所有循环(终止执行后面的所有循环)
# continue 命令不会跳出所有循环,仅仅跳出当前循环。

shell函数

# 创建一个函数
demoFun(){
  echo "这是我的第一个 shell 函数!"
}

echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

# 返回参数传递的函数
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !" # 错误写法,如果参数个数太多,达到或者超过了 10 个,那么就得用 ${n} 的形式来接收了
echo "第十个参数为 ${10} !" # 正确写法
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam a b c d e f g h i j

启用开启启动项文件,chmod +x /etc/rc.d/rc.local 以确保他可以被启动的时候自动执行,我们只需要在里面配置脚本就可以实现开机自启动 确保下面脚本正确然后将文件的内容添加到rc.local中 echo '/usr/local/scripts/auto_ntpdate.sh' >> /etc/rc.d/rc.local

#!/bin/bash

yum info ntp && yum -y install ntp && ntpdate cn.ntp.org.cn

定时任务

查看当前用户定时任务: crontab -l 查看指定用户的定时任务:crontab -lu 用户名 给自己创建定时任务:crontab -e 给别人创建定时任务:crontab -eu 用户名 删除定时任务 crontab -r 删除定时任务 给别人删除定时任务 crontab -re

编辑的定时任务的格式为: *(分钟) *(小时) *(天) *(月) *(星期) command 需要执行的命令

常见的时间案例:

# 每分钟执行
* * * * * command
# 每小时的第3和第15分钟执行
3,15 * * * * command
# 在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * command
# 每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command
# 每个星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command
# 每晚的21:30重启xxxxx
30 21 * * * /etc/init.d/xxxxx restart
# 每月1、10、22日的3:30重启
30 3 1,10,22 * * /etc/init.d/xxxxx restart
# 每周六、周日的1:10重启xxxxx
10 1 * * 6,0 /etc/init.d/xxxxx restart
# 每天18:00至23:00之间每隔30分钟重启
0,30 18-23 * * * /etc/init.d/xxxxx restart
# 每星期六的晚上23:00重启xxxxx
0 23 * * 6 /etc/init.d/xxxxx restart
# 每一小时重启xxxxx
0 */1 * * * /etc/init.d/xxxxx restart
# 凌晨1点到6点之间,每隔一小时重启xxxxx
0 1-6/1 * * * /etc/init.d/xxxxx restart
# 每月的6号与每周一到周三的11点重启xxxxx
0 11 6 * mon-wed /etc/init.d/xxxxx restart
# 一月一号的6点重启xxxxx
0 6 1 jan * /etc/init.d/xxxxx restart
# 每小时执行/etc/cron.hourly目录内的脚本
0 */1 * * * root run-parts /etc/cron.hourly
说明:如果去掉 run-parts 参数的话,后面就写要运行的某个脚本名,而不是目录名

在线编写 Crontab:https://crontab.guru/examples.html
举报

相关推荐

0 条评论