VMware安装CentOS 7及Linux Shell脚本

  • Post author:
  • Post category:linux




1.安装VMware及CentOS 7

  • 这里用的是CentOS 7,CentOS 7与Linux系统的关系是:

    • centos是基于linux建立的操作系统。
    • linux属于内核系统,只有终端命令界面,无图形界面。
    • centos同时拥有终端命令界面和图形界面。
    • linux和centos都是属于开源系统。



1.1 VMware安装

  1. 去官网下载安装包:[

    Windows 虚拟机 | Workstation Pro | VMware | CN

    ](https://www.vmware.com/cn/products/workstation-pro.html)

    • 下载试用版可试用30天,若想永久使用,可以购买
    • 选择

      Workstation 16 Pro for Windows
  2. 双击执行文件开始安装

  3. 选择

    安装路径

    • 安装路径根据自己爱好划分.
    • 增强型键盘驱动程序可选可不选,如果选上会增强虚拟机对键盘的兼容性
  4. 用户体验设置建议,两个建议

    都不勾选

  5. 快捷方式各取所需即可

  6. 点击安装并等待安装完成

  7. 输入许可证,激活 VMware。

    • 注:如果点击的是完成也没关系,后面还是输入许可证的。
  8. 至此,VMware安装完成



1.2 CentOS安装



1.2.1 配置电脑

  1. 启动VMware,点击新建虚拟机
    在这里插入图片描述

  2. 自定义新的虚拟机
    在这里插入图片描述

  3. 解决虚拟机的兼容性
    在这里插入图片描述

  4. 选择当前虚拟机的操作系统
    在这里插入图片描述

  5. 选择虚拟机将来需要安装的系统
    在这里插入图片描述

  6. 配置电脑

    在这里插入图片描述

  7. 选择CPU的个数

    • 查看物理机 CPU 个数(windows11 为例)
      在这里插入图片描述
    • 设置虚拟机处理器的数量
      在这里插入图片描述
  8. 设置虚拟机的内存

    • 内存大小有一定要求,建议 4g,不能给太多,后期会有多台虚拟机同时启动
      在这里插入图片描述
  9. 选择虚拟机上网方式

    • 选择 NAT 的方式
      在这里插入图片描述

    • 没有 VMware 之前物理机的网络适配器信息(每个人不同)
      在这里插入图片描述

    • 安装 VMware 之后物理机的网络适配器信息(会多两个 vmnet1 和 vmnet8,其中vmnet8 是虚拟机使用 NAT 模式上网的网卡)

      在这里插入图片描述

  10. 选择对应的文件系统的IO方式,按推荐的

    LSI Logic(L)

    即可
    在这里插入图片描述

  11. 磁盘类型按推荐的

    SCSI(S)

    即可
    在这里插入图片描述

  12. 选择创建新虚拟磁盘
    在这里插入图片描述

  13. 选择虚拟机的磁盘大小
    在这里插入图片描述

  14. 虚拟机文件的存放位置
    在这里插入图片描述

  15. 电脑配置完成
    在这里插入图片描述



1.2.2安装系统(CentOS 7)

  1. 先检查bios的虚拟化设置是否打开(Win11)
    在这里插入图片描述

  2. 选择 cd/dvd 的方式安装

    在这里插入图片描述

    • 安装完成后点击开启此虚拟机
      在这里插入图片描述
  3. 系统安装引导界面

    在这里插入图片描述

    • 耐心等待它的安装

      在这里插入图片描述
    • 会自动跳转下面的界面。

      在这里插入图片描述
  4. 需要DIY(定制化)的内容

    • 调整时间差(对应的应该是东八区时间)
      在这里插入图片描述

    • 安装 GHOME(图形化界面的方式)注意图上标注的点击顺序
      在这里插入图片描述

    • 配置磁盘分区
      在这里插入图片描述

      • 手动添加分区
        在这里插入图片描述

      • 添加 boot 区 给上 1G 容量后点击添加挂载点
        在这里插入图片描述
        在这里插入图片描述

      • 添加 swap 交换分区
        在这里插入图片描述

        在这里插入图片描述

      • 配置根目录
        在这里插入图片描述

        在这里插入图片描述

      • 点击完成,点击接收更改
        在这里插入图片描述

    • 关闭 kdump 本身虚拟机内存就不够,他会吃掉一部分内存,我们尽量省一点
      在这里插入图片描述

    • 修改主机名
      在这里插入图片描述

    • 是否打开安全协议(开启与否都可以)
      在这里插入图片描述

    • 开始安装,安装时间比较长,此时设置root用户密码,一定要设置
      在这里插入图片描述


  5. 重新启动

    CentOS 7至此,Linux系统安装完成



2. 配置静态ip

  1. 修改网络 IP 地址为静态 IP 地址,避免 IP 地址经常变化,从而方便节点服务器间

    的互相通信,打开终端,输入:
[root@JiuYou001 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
  1. 查看

    Win11 VMnet8

    的ip4地址(控制面板–>查看网络连接)

    在这里插入图片描述

  2. 点击虚拟机的查看虚拟网络编辑器

    在这里插入图片描述

  3. 以下加

    *

    的项必须修改,有值的按照下面的值修改,没有该项的则需要增加。

TYPE="Ethernet"									 #网络类型(通常是 Ethemet)
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"								 #  * IP 的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配 IP|BOOTP 协议|DHCP 协议)  
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="e83804c1-3257-4584-81bb-660665ac22f6"      #随机 id
		DEVICE="ens33"							 #接口名(设备,网卡)
ONBOOT="yes"									 #系统启动的时候网络接口是否有效(yes/no)
# *  IP 地址 后两位根据本地ip地址修改,查看虚拟网络编辑器
IPADDR=192.168.10.100
# *  网关 后两位根据本地ip地址修改
GATEWAY=192.168.10.2
# *  域名解析器 与网关相同即可
DNS1=192.168.10.2
  1. 修改 IP 地址后的结果如图所示,执行

    :wq

    命令,保存退出

  2. 执行

    systemctl restart network

    命令,重启网络服务。如果报错,则执行

    reboot

    命令,重启虚拟机。

[root@JiuYou001 ~]# systemctl restart network
  1. 使用

    ifconfig

    命令查看当前 IP
[root@JiuYou001 ~]# ifconfig

在这里插入图片描述


  1. 保证 Linux 系统 ifcfg-ens33 文件中 IP 地址、虚拟网络编辑器地址和 Windows 系统 VM8 网络 IP 地址相同
  2. 修改主机名称(别名)
[root@JiuYou001 ~]# vim /etc/hostname
JiuYou001
  1. 配置 Linux 克隆机主机名称映射 hosts 文件,打开

    /etc/hosts
[root@JiuYou001 ~]# vim /etc/hosts
  • 添加如下内容
192.168.10.100 JiuYou001
  • 重启 JiuYou001
[root@JiuYou001 ~]# reboot
  1. 修改 windows 的主机映射文件(hosts 文件)

    ①进入

    C:\Windows\System32\drivers\etc

    路径

    ②打开 hosts 文件并添加如下内容,然后保存
192.168.10.100 JiuYou001
  1. 通常在工作过程中,公司中使用的真实服务器或者是云服务器,都不允许除运维人员之外的员工直接接触,因此就需要通过远程登录的方式来操作。所以,远程登录工具就是必不可缺的,目前,比较主流的有 Xshell,SSH Secure Shell,SecureCRT,FinalShell 等,大家可以自行安装,也可以参考

    教程



3.Linux简介及命令



3.1 Linux简介

  • Linux内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。
  • Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
  • 目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debain、Fedora、 SuSE、OpenSUSE。
  • Linux与Windows的区别
    在这里插入图片描述
  • Linux目录结构
    在这里插入图片描述


    • /bin

      是Binary的缩写,这个目录存放着最经常使用的命令/sbin

    • sbin

      就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

    • /home

      存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。

    • /root

      该目录为系统管理员,也称作超级权限者的用户主目录。

    • /lib

      系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

    • /lost+found

      这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

    • /etc

      所有的系统管理所需要的配置文件和子目录。

    • /usr

      这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。

    • /boot

      这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件,自己的安装别放这里。

    • /proc

      这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。

    • /srv

      service缩写,该目录存放一些服务启动之后需要提取的数据。

    • /sys

      这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统sysfs。

    • /tmp

      这个目录是用来存放一些临时文件的。

    • /dev

      类似于windows的设备管理器,把所有的硬件用文件的形式存储。

    • /media(CentOS6)

      linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。CentOS7迁移到/run/media

    • mnt

      系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里的内容了。

    • /opt

      这是给主机额外安装软件所摆放的目录。比如你安装一个mysql数据库则就可以放到这个目录下。默认是空的。

    • /var

      这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。



3.2 常用命令



3.2.0 常用快捷键


常用快捷键 功能
CTRL+C 停止进程
CTRL+L 清屏,等同于 clear;彻底清屏是:reset
善于用tab键 提示(更重要的是可以防止敲错)
上下键 提示(更重要的是可以防止敲错



3.2.1

vi/vim

命令 – 文本编辑器



3.2.2

service

命令 – 控制系统服务



3.2.3

chkconfig

命令 – 检查与设置系统的各种服务



3.2.3

systemctl

命令 – 管理系统服务



3.2.4

firewall-cmd

命令 – 防火墙策略管理工具



3.2.5 关机重启命令

在这里插入图片描述



3.2.6

man

命令 – 查看帮助信息



3.2.7

help

命令 – 显示帮助信息



3.2.8

pwd

命令 – 显示当前工作目录的路径



3.2.9

ls

命令 – 显示指定工作目录下的文件及属性信息



3.2.10

cd

命令 – 切换目录



3.2.11

mkdir

命令 – 创建目录文件



3.2.12

rmdir

命令 – 删除空目录文件



3.2.13

touch

命令 – 创建空文件与修改时间戳



3.2.14

cp

命令 – 复制文件或目录



3.2.15

rm

命令 – 删除文件或目录



3.2.16

mv

命令 – 移动或改名文件



3.2.17

cat

命令 – 在终端设备上显示文件内容



3.2.18

more

命令 – 分页显示文本文件内容



3.2.20

less

命令 – 分页显示文件内容



3.2.21

echo

命令 – 输出字符串或提取后的变量值



3.2.22

head

命令 – 显示文件开头的内容



3.2.23

tail

命令 – 查看文件尾部内容



3.2.24

>

输出重定向和

>>

追加



3.2.25

ln

命令 – 为文件创建快捷方式



3.2.26

history

命令 – 显示与管理历史命令记录



3.2.27

date

命令 – 显示或设置系统日期与时间



3.2.28

cal

命令 – 显示日历



3.2.29

useradd

命令 – 创建并设置用户信息



3.2.30

passwd

命令 – 修改用户的密码值



3.2.31

id

命令 – 显示用户与用户组信息



3.2.32

cat /etc/passwd

查看创建了哪些用户



3.2.33

su

命令 – 切换用户身份



3.2.34

userdel

命令 – 删除用户账户



3.2.35

who

命令 – 查看当前登录用户信息



3.2.36

sudo

命令 – 授权普通用户执行管理员命令



3.2.37

usermod

命令 – 修改用户账号信息



3.2.38

groupadd

命令 – 创建新的用户组



3.2.39

groupdel

命令 – 删除用户组



3.2.40

groupmod

命令 – 更改群组识别码或名称



3.2.41

cat /etc/group

查看创建了哪些组



3.2.42

chmod

命令 – 改变文件或目录权限

  • 权限:rwx

    • 作用到文件


      • [ r ]

        代表可读(read): 可以读取,查看

      • [ w ]

        代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前

        提条件是对该文件所在的目录有写权限,才能删除该文件.

      • [ x ]

        代表可执行(execute):可以被系统执行
    • 作用到目录


      • [ x ]

        代表可执行(execute):可以被系统执行

      • [ w ]

        代表可写(write): 可以修改,目录内创建+删除+重命名目录

      • [ x ]

        代表可执行(execute):可以进入该目录
  • 属性


    • -

      代表文件

    • d

      代表目录

    • l

      链接文档(link file

      在这里插入图片描述



3.2.43

chown

命令 – 改变文件或目录的用户和用户组



3.2.44

chgrp

命令 – 更改文件用户组



3.2.45

find

命令 – 根据路径和条件搜索指定文件



3.2.46

locate

命令 – 快速查找文件或目录



3.2.47

grep

命令 – 强大的文本搜索工具



3.2.48

gzip

命令 – 压缩和解压文件



3.2.49

gunzip

命令 – 解压提取文件内容



3.2.50

zip

命令 – 压缩文件



3.2.51

unzip

命令 – 解压缩zip格式文件



3.2.52

tar

命令 – 压缩和解压缩文件



3.2.53

du

命令 – 查看文件或目录的大小



3.2.54

df

命令 – 显示磁盘空间使用情况



3.2.55

lsblk

命令 – 查看系统的磁盘使用情况



3.2.56

mount

命令 – 把文件系统挂载到目录



3.2.57

fdisk

命令 – 管理磁盘分区



3.2.58

ps

命令 – 显示进程状态



3.2.59

kill

命令 – 杀死进程



3.2.60

pstree

命令 – 以树状图显示进程



3.2.61

top

命令 – 实时显示系统运行状态



3.2.62

netstat

命令 – 显示网络状态



3.2.63

crontab

命令 – 管理定时计划任务



3.2.64

rpm

命令 – RPM软件包管理器



3.2.65

yum

命令 – 基于RPM的软件包管理器



4. Linux中的Shell脚本



4.1 Shell概述

在这里插入图片描述



4.2 Shell脚本入门案例

  1. 脚本格式,一下书命令开头
#!/bin/bash  
  1. 第一个shell脚本:helloworld.sh
$ touch helloworld.sh
$ vim helloworld.sh

在 helloworld.sh 中输入如下内容
#!/bin/bash
echo "helloworld"
  1. 脚本的常用执行方式

第一种:采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)

#sh+脚本的相对路径
$ sh ./helloworld.sh
#sh+脚本的绝对路径
$ sh /home/atguigu/shells/helloworld.sh
#bash+脚本的相对路径
$ bash ./helloworld.sh
#bash+脚本的绝对路径
$ bash /home/atguigu/shells/helloworld.sh

第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)

#首先要赋予 helloworld.sh 脚本的+x 权限
$ chmod +x helloworld.sh
#执行脚本
#相对路径
$ ./helloworld.sh
Helloworld
#绝对路径
$ /home/atguigu/shells/helloworld.sh
Helloworld
#注意:第一种执行方法,本质是 bash 解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

第三种:在脚本的路径前加上“.”或者 source

#脚本内容
#!/bin/bash
A=5
echo $A

#分别使用 sh,bash,./ 和 . 的方式来执行,结果如下:
$ bash test.sh
$ echo $A

$ sh test.sh
$ echo $A

$ ./test.sh
$ echo $A

$ . test.sh
$ echo $A

5


#原因:
#前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容,当脚本内容结束,则子 shell 关闭,回到父 shell 中。
#第三种,也就是使用在脚本路径前加“.”或者 source 的方式,可以使脚本内容在当前shell 里执行,而无需打开子 shell!这也是为什么我们每次要修改完/etc/profile 文件以后,需要 source 一下的原因。
#开子 shell 与不开子 shell 的区别就在于,环境变量的继承关系,如在子 shell 中设置的当前变量,父 shell 是不可见的



4.3 变量



4.3.1 常用系统变量

$HOME
$PWD
$SHELL
$USER
  • 显示当前Shell中的所有变量:set



4.3.2 自定义变量

  1. 基本语法

    • 定义变量:变量名=变量值,注意,=号前后不能有空格
    • 撤销变量:unset 变量名
    • 声明静态变量:readonly 变量,注意:不能 unset
  2. 变量定义规则

    • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
    • 等号两侧不能有空格
    • 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
    • 变量的值如果有空格,需要使用双引号或单引号括起来。
#(1)定义变量 A
$ A=5
$ echo $A
5
#(2)给变量 A 重新赋值
$ A=8
$ echo $A
8
#(3)撤销变量 A
$ unset A
$ echo $A
#(4)声明静态的变量 B=2,不能 unset
$ readonly B=2
$ echo $B
2
$ B=9
-bash: B: readonly variable 
#(5)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
$ C=1+2
$ echo $C
1+2
#(6)变量的值如果有空格,需要使用双引号或单引号括起来
$ D=I love banzhang
-bash: world: command not found
$ D="I love banzhang"
$ echo $D
I love banzhang
#(7)可把变量提升为全局环境变量,可供其他 Shell 程序使用
export 变量名
$ vim helloworld.sh
在 helloworld.sh 文件中增加 echo $B
#!/bin/bash
echo "helloworld"
echo $B
$ ./helloworld.sh
Helloworld
#发现并没有打印输出变量 B 的值。
$ export B
$ ./helloworld.sh
helloworld
2



4.3.3 特殊变量

# 1.$n
#1)基本语法
#  $n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
#2)案例实操
[atguigu@hadoop101 shells]$ touch parameter.sh
[atguigu@hadoop101 shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
[atguigu@hadoop101 shells]$ chmod 777 parameter.sh
[atguigu@hadoop101 shells]$ ./parameter.sh cls xz
==========$n==========
./parameter.sh
cls
xz


# 2.$#
#1)基本语法
#  $# (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)。
#2)案例实操
[atguigu@hadoop101 shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
echo '==========$#=========='
echo $#
[atguigu@hadoop101 shells]$ chmod 777 parameter.sh
[atguigu@hadoop101 shells]$ ./parameter.sh cls xz
==========$n==========
./parameter.sh
cls
xz
==========$#==========
2



# 3.$*、$@
#1)基本语法
#  $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
#  $@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
# 2)案例实操
[atguigu@hadoop101 shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
echo '==========$#=========='
echo $#
echo '==========$*=========='
echo $*
echo '==========$@=========='
echo $@
[atguigu@hadoop101 shells]$ ./parameter.sh a b c d e f g
==========$n==========
./parameter.sh
a
b
==========$#==========
7
==========$*==========
a b c d e f g
==========$@==========
a b c d e f g




# 4. $?
# 1)基本语法
# $? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
# 2)案例实操
# 判断 helloworld.sh 脚本是否正确执行
[atguigu@hadoop101 shells]$ ./helloworld.sh
hello world
[atguigu@hadoop101 shells]$ echo $?
0



4.4 运算符

  1. 基本语法:

    “$((运算式))” 或 “$[运算式]”
  2. 案例:计算(2+3)*4的值
[atguigu@hadoop101 shells]# S=$[(2+3)*4]
[atguigu@hadoop101 shells]# echo $



4.5 条件判断

  1. 基本语法

    • test condition
    • [ condition ](注意 condition 前后要有空格)注意:条件非空即为 true,[ atguigu ]返回 true,[ ] 返回 false。
  2. 常用判断条件

    • 两个整数之间比较

      • -eq 等于(equal) -ne 不等于(not equal)
      • -lt 小于(less than) -le 小于等于(less equal)
      • -gt 大于(greater than) -ge 大于等于(greater equal)
      • 注:如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。
    • 按照文件权限进行判断

      • -r 有读的权限(read)
      • -w 有写的权限(write)
      • -x 有执行的权限(execute)
    • 按照文件类型进行判断

      • -e 文件存在(existence)
      • -f 文件存在并且是一个常规的文件(file)
      • -d 文件存在并且是一个目录(directory)
  3. 案例实操
 #(1) 23 是否大于等于 22
[atguigu@hadoop101 shells]$ [ 23 -ge 22 ]
[atguigu@hadoop101 shells]$ echo $?
0
#(2)helloworld.sh 是否具有写权限
[atguigu@hadoop101 shells]$ [ -w helloworld.sh ]
[atguigu@hadoop101 shells]$ echo $?
0
#(3)/home/atguigu/cls.txt 目录中的文件是否存在
[atguigu@hadoop101 shells]$ [ -e /home/atguigu/cls.txt ]
[atguigu@hadoop101 shells]$ echo $?
1
#(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
[atguigu@hadoop101 ~]$ [ atguigu ] && echo OK || echo notOK
OK
[atguigu@hadoop101 shells]$ [ ] && echo OK || echo notOK
notOK



4.6 流程控制

  1. if判断
#1)基本语法
#(1)单分支
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
#(2)多分支
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
#注意事项:
#①[ 条件判断式 ],中括号和条件判断式之间必须有空格
#②if 后要有空格
#2)案例实操
#输入一个数字,如果是 1,则输出 banzhang zhen shuai,如果是 2,则输出 cls zhen mei,如果是其它,什么也不输出。
[atguigu@hadoop101 shells]$ touch if.sh
[atguigu@hadoop101 shells]$ vim if.sh


#!/bin/bash
if [ $1 -eq 1 ]
then
echo "banzhang zhen shuai"
elif [ $1 -eq 2 ]
then
echo "cls zhen mei"
fi
[atguigu@hadoop101 shells]$ chmod 777 if.sh
[atguigu@hadoop101 shells]$ ./if.sh 1
banzhang zhen shuai
  1. case语句
#1)基本语法
case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
#注意事项:
#(1)case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
#(2)双分号“;;”表示命令序列结束,相当于 java 中的 break。
#(3)最后的“*)”表示默认模式,相当于 java 中的 default。
#2)案例实操
#输入一个数字,如果是 1,则输出 banzhang,如果是 2,则输出 cls,如果是其它,输出renyao。
[atguigu@hadoop101 shells]$ touch case.sh
[atguigu@hadoop101 shells]$ vim case.sh


!/bin/bash
case $1 in
"1")
echo "banzhang"
;;
"2")
echo "cls"
;;
*)
echo "renyao"
;;
esac
[atguigu@hadoop101 shells]$ chmod 777 case.sh
[atguigu@hadoop101 shells]$ ./case.sh 1
1
  1. for循环
#1)基本语法 1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
#2)案例实操1 加到 100
[atguigu@hadoop101 shells]$ touch for1.sh
[atguigu@hadoop101 shells]$ vim for1.sh
#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum
[atguigu@hadoop101 shells]$ chmod 777 for1.sh
[atguigu@hadoop101 shells]$ ./for1.sh
5050
# 3)基本语法 2
for 变量 in123do
程序
done
# 4)案例实操
(1)打印所有输入参数
[atguigu@hadoop101 shells]$ touch for2.sh
[atguigu@hadoop101 shells]$ vim for2.sh
#!/bin/bash
#打印数字
for i in cls mly wls
do
echo "ban zhang love $i"
done
[atguigu@hadoop101 shells]$ chmod 777 for2.sh
[atguigu@hadoop101 shells]$ ./for2.sh
ban zhang love cls
ban zhang love mly
ban zhang love wsl




#(2)比较$*和$@区别
#$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。
[atguigu@hadoop101 shells]$ touch for3.sh
[atguigu@hadoop101 shells]$ vim for3.sh
#!/bin/bash
echo '=============$*============='
for i in $*
do
echo "ban zhang love $i"
done
echo '=============$@============='
for j in $@
do
echo "ban zhang love $j"
done
[atguigu@hadoop101 shells]$ chmod 777 for3.sh
[atguigu@hadoop101 shells]$ ./for3.sh cls mly wls
=============$*=============
banzhang love cls
banzhang love mly
banzhang love wls
=============$@=============
banzhang love cls
banzhang love mly
banzhang love wls 

#当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;$@会将各个参数分开,以“$1” “$2”…“$n”的形式输出所有参数。
[atguigu@hadoop101 shells]$ vim for4.sh
#!/bin/bash
echo '=============$*============='
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个 for 循环只会循环一次
do
echo "ban zhang love $i"
done
echo '=============$@============='
for j in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "ban zhang love $j"
done
[atguigu@hadoop101 shells]$ chmod 777 for4.sh
[atguigu@hadoop101 shells]$ ./for4.sh cls mly wls
=============$*=============
banzhang love cls mly wls
=============$@=============
banzhang love cls
banzhang love ml
banzhang love wls
  1. while 循环
#1)基本语法
while [ 条件判断式 ]
do
程序
done
#2)案例实操
#从 1 加到 100
[atguigu@hadoop101 shells]$ touch while.sh
[atguigu@hadoop101 shells]$ vim while.sh
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum
[atguigu@hadoop101 shells]$ chmod 777 while.sh
[atguigu@hadoop101 shells]$ ./while.sh
5050



4.7 read读取控制台输入

#1)基本语法
read (选项) (参数)
#①选项:
#-p:指定读取值时的提示符;
#-t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待
#②参数
#变量:指定读取值的变量名
#2)案例实操
#提示 7 秒内,读取控制台输入的名称
[atguigu@hadoop101 shells]$ touch read.sh
[atguigu@hadoop101 shells]$ vim read.sh
#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds :" NN
echo $N
[atguigu@hadoop101 shells]$ ./read.sh
Enter your name in 7 seconds : atguigu
atguigu



4.8 函数



4.8.1系统函数

  1. basename

    • 基本语法

      • basename [string / pathname] [suffix] (功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
      • basename 可以理解为取路径里的文件名称
      • 选项:
      • suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
    • 案例实操
#截取该/home/atguigu/banzhang.txt 路径的文件名称。
[atguigu@hadoop101 shells]$ basename /home/atguigu/banzhang.txt
banzhang.txt
[atguigu@hadoop101 shells]$ basename /home/atguigu/banzhang.txt .txt
banzhang
  1. dirname

    • 基本语法

      • dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
      • dirname 可以理解为取文件路径的绝对路径名称
    • 案例实操
#获取 banzhang.txt 文件的路径。
[atguigu@hadoop101 ~]$ dirname /home/atguigu/banzhang.txt
/home/atguigu



4.8.2 系统函数

  1. 基本语法
[ function ] funname[()]
{
Action;
[return int;]
}
  1. 经验技巧

    • 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一

      样先编译。
    • 函数返回值,只能通过$ ?系统变量获得,可以显示加:return 返回,如果不加,将

      以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
  2. 案例实操
#计算两个输入参数的和。
[atguigu@hadoop101 shells]$ touch fun.sh
[atguigu@hadoop101 shells]$ vim fun.sh
#!/bin/bash
function sum()
{
s=0
s=$[$1+$2]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
[atguigu@hadoop101 shells]$ chmod 777 fun.sh
[atguigu@hadoop101 shells]$ ./fun.sh
Please input the number1: 2
Please input the number2: 5
7



4.9 正则表达式

  1. 特殊字符:

    ^



    ^

    匹配一行的开头,例如:
[atguigu@hadoop101 shells]$ cat /etc/passwd | grep ^a

会匹配出所有以 a 开头的行

  1. 特殊字符:

    $



    $

    匹配一行的结束,例如
[atguigu@hadoop101 shells]$ cat /etc/passwd | grep t$

会匹配出所有以 t 结尾的行

  1. 特殊字符:

    .



    .

    匹配一个任意的字符,例如
[atguigu@hadoop101 shells]$ cat /etc/passwd | grep r..t

会匹配包含 rabt,rbbt,rxdt,root 等的所有行

  1. 特殊字符:

    *



    *

    不单独使用,他和上一个字符连用,表示匹配上一个字符 0 次或多次,例如
[atguigu@hadoop101 shells]$ cat /etc/passwd | grep ro*t

会匹配 rt, rot, root, rooot, roooot 等所有行

  1. 字符区间(中括号):

    [ ]



    [ ]

    表示匹配某个范围内的一个字符,例如
[6,8]------匹配 6 或者 8
[0-9]------匹配一个 0-9 的数字
[0-9]*------匹配任意长度的数字字符串
[a-z]------匹配一个 a-z 之间的字符
[a-z]* ------匹配任意长度的字母字符串
[a-c, e-f]-匹配 a-c 或者 e-f 之间的任意字符
[atguigu@hadoop101 shells]$ cat /etc/passwd | grep r[a,b,c]*t

会匹配 rt,rat, rbt, rabt, rbact,rabccbaaacbt 等等所有行

  1. 特殊字符:

    \



    \

    表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配

    某一特殊字符本身时(例如,我想找出所有包含 ‘$’ 的行),就会碰到困难。此时我们就要

    将转义字符和特殊字符连用,来表示特殊字符本身,例如
[atguigu@hadoop101 shells]$ cat /etc/passwd | grep ‘a\$b

就会匹配所有包含 a$b 的行。注意需要使用单引号将表达式引起来.


该博客基于b站尚硅谷课程完成,若有侵权,请联系作者删除



版权声明:本文为qq_62656514原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。