本周作业内容:
1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。
# (以下部分内容摘自百度百科)
集线器:
集线器(Hub)是指将多条以太网双绞线或光纤集合连接在同一段物理介质下的设备,主要功能是对接收到的信号进行放大,以扩大网络的传输距离,工作于OSI(开放系统互联参考模型)参考模型第一层,即“物理层”。
集线器是一个多端口的中继器,只负责节点间数据的传递和信号的放大处理,检测冲突但不负责解决阻塞问题,所有端口处于同一个冲突域下。与二层设备如二层交换机区别在于不像交换机一样每个端口分隔冲突域,不具备二层交换机的端口学习能力。使用场景多用于比较简单的局域网内,用于交换机下局域网扩展。
网桥:
网桥(Bridge)是早期的两端口二层网络设备,用来连接不同网段。网桥的两个端口分别有一条独立的交换信道,不是共享一条背板总线,可隔离冲突域。网桥比集线器(Hub)性能更好,集线器上各端口都是共享同一条背板总线的。后来,网桥被具有更多端口、同时也可隔离冲突域的交换机(Switch)所取代。
网桥工作在OSI模型第二层数据链路层,端口分隔冲突域,用于比较小型的局域网扩展。
二层交换机
二层交换机工作于OSI模型第二层数据链路层,故而称为二层交换机。二层交换技术的发展已经比较成熟,二层交换机属数据链路层设备,可以识别数据包中的MAC地址信息,根据MAC地址进行转发,并将这些MAC地址与对应的端口记录在自己内部的一个地址表中。和网桥的区别在于支持更多端口,转发效率要比网桥快很多;和三层交换机的区别在于三层交换机具有路由的功能,工作在三层网络层。
三层交换机
三层交换机就是具有部分路由器功能的交换机,三层交换机的最重要目的是加快大型局域网内部的数据交换,所具有的路由功能也是为这目的服务的,能够做到一次路由,多次转发。对于数据包转发等规律性的过程由硬件高速实现,而像路由信息更新、路由表维护、路由计算、路由确定等功能,由软件实现。三层交换技术就是二层交换技术+三层转发技术。
三层交换机工作在OSI模型第三层网络层,处于同一个局域网中的各个子网的互联以及局域网中VLAN间的路由,用三层交换机来代替路由器,而只有局域网与公网互联之间要实现跨地域的网络访问时,才通过专业路由器。三层交换机端口多于路由器。但是三层交换机只有快速以太口和吉比特以太口,不如路由器接口种类丰富。
路由器
路由器(Router),是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。
路由工作在OSI第三层即网络层。这一区别决定了路由和交换机在移动信息的过程中需使用不同的控制信息,所以说两者实现各自功能的方式是不同的。路由器每个接口ip都处于不同网段,端口不单分隔冲突域,也分隔广播域
2、IP地址的分类有哪些?子网掩码的表示形式及其作用
A类
0000 0000 - 0111 1111:1-127
网络数126,127保留回环地址
每个网络中的主机数:2^24-2
默认子网掩码:255.0.0.0
私网地址:10.0.0.0/8
B类
1000 0000 - 1011 1111:128-191
网络数:2^14
每个网络中的主机数:2^16-2
默认子网掩码:255.255.0.0
私网地址:172.16.0.0/16-172.31.0.0/16
C类
1100 0000 - 1101 1111 :192-223
网络数:2^21
每个网络中的主机数:2^8-2
默认子网掩码:255.255.255.0
私网地址:192.168.0.0/24-192.168.255.0/24
D类:组播
1110 0000 - 1110 1111:224-239
E类
240-255
子网掩码:IP地址和网络地址进行与运算得出
用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
子网掩码的长度是32位,也可以使用十进制的形式。例如,为二进制形式的子网掩码:1111 1111.1111 1111.1111 1111.0000 0000,采用十进制的形式为:255.255.255.0
3、计算机网络的分成模型有哪些(OSI模型和TCP/IP模型),每一层的功能及涉及到的物理设备有哪些。
# (以下部分内容摘自百度百科)
OSI模型:
1)应用层
OSI参考模型的最高层。其功能是实现应用进程(如用户程序、终端操作员等)之间的信息交换。同时,还具有一系列业务处理所需要的服务功能。
2)表示层
数据表示形式的控制层,其主要功能是把应用层提供的信息变换为能够共同理解的形式,提供字符代码、数据格式、控制信息格式、加密等的统一表示。表示层的作用之一是为异种机通信提供一种公共语言,以便能进行互操作。
3)会话层
会话单位的控制层,其主要功能是按照在应用进程之间约定的原则,按照正确的顺序收、发数据,进行各种形态的对话。会话层规定了会话服务用户间会话连接的建立和拆除规程以及数据传送规程。
4)传输层
端开放系统之间的数据传送控制层。主要功能是端开放系统之间数据的收妥确认。同时,还用于弥补各种通信网路的质量差异,对经过下三层之后仍然存在的传输差错进行恢复,进一步提高可靠性。另外,还通过复用、分段和组合、连接和分离、分流和合流等技术措施,提高吞吐量和服务质量。
5)网络层
网络层为建立网络连接和为上层提供服务,应具备以下主要功能:
a.路由选择和中继;
b.激活,终止网络连接;
c.在一条数据链路上复用多条网络连接,多采取分时复用技术;
d.检测与恢复;
e.排序,流量控制;
f.服务选择;
g.网络管理。
路由器、三层交换机工作在网络层
6)数据链路层
链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现。链路层应具备如下功能:
a.链路连接的建立、拆除和分离;
b.帧定界和帧同步。链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界;
c.顺序控制,指对帧的收发顺序的控制;
d.差错检测和恢复。还有链路标识,流量控制等等。差错检测多用方阵码校验和循环码校验来检测信道上数据的误码,而帧丢失等用序号检测。各种错误的恢复则常靠反馈重发技术来完成。
二层交换机、网桥工作在数据链路层
7)物理层
物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。
各种插头、插座。LAN中的各种粗、细同轴电缆、T型接头、插头、接收器、发送器、中继器等都属物理层的媒体和连接器,集线器也工作在物理层。
TCP/IP模型
在TCP/IP参考模型中,去掉了OSI参考模型中的会话层和表示层(这两层的功能被合并到应用层实现)。同时将OSI参考模型中的数据链路层和物理层合并为主机到网络层。
1)应用层
应用层对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP等。
2)传输层
传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP)。
3)网络层
网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。
4)主机到网络层
网络接入层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。
4、如何将Linux主机接入到TCP/IP网络,请描述详细的步骤。(手动指定的方式)
1) 将网线接入网卡接口,使用ifconfig命令查看网卡设备名称
2) 事先获取网络规划信息如IP、MASK、GATEWAY、DNS
3) 配置网络信息,这里使用配置文件方式配置,其它配置方式第5题说明
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.100.101
PREFIX=24
GATEWAY=192.168.100.2
DNS1=192.168.100.2
EOF
4) 重启网络服务
service network restart
5、为Linux主机配置网络信息的方式有哪些,请描述各个过程。
配置ip地址:
1)ifconfig命令
ifconfig eth0 192.168.100.101 netmask 255.255.255.0
2)ip 命令
ip addr add 192.168.100.101/24 dev eth0
3)配置文件
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.100.101
PREFIX=24
GATEWAY=192.168.100.2
DNS1=192.168.100.2
EOF
4)nmcli 命令
nmcli connection modify eth0 ipv4.addresses "192.168.100.101/24"
配置路由:
1)route命令
route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.38.1
2)ip 命令
ip route add 192.168.1.1 via 192.168.100.2 dev eth0
3)配置文件
cat > /etc/sysconfig/network-scripts/route-eht0 < 0.0.0.0/24 via 192.168.100.2 EOF
配置dns 1)配置文件 cat >> /etc/resolv.conf << EOF nameserver 192.168.100.2 EOF 2)nmcli命令 nmcli connection modify eth0 ipv4.dns "192.168.100.2"
配置主机名 1)配置文件 cat > /etc/sysconfig/network << EOF HOSTNAME=www.host.com EOF 2)hostnamectl命令 hostnamectl set-hostname www.host.com 6、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态; 在线的主机使用绿色显示; 不在线的主使用红色显示; 7、详细描述每个网络接口的配置文件中各个参数的含义和其所对应的值; IP,MASK,GW,DNS相关配置文件:/etc/sysconfig/network-scripts/ifcfg-* 路由相关配置文件:/etc/sysconfig/network-scripts/route-*
/etc/sysconfig/network-scripts/ifcfg-* DEVICE= 此配置文件应用到的设备 HWADDR= 对应设备的MAC地址 BOOTPROTO=激活此设备时使用的地址配置协议,常用的dhcp,static,none,bootp NM_CONTROLLED=NM是networkmanager的简写,此网卡是否接受NM控制,centos6上建议为no ONBOOT= 在系统引导时是否激活此设备 TYPE接口类型,常见的有Ethernet,Bridge UUID设备的唯一标识 IPADDR指明IP地址 NETMASK子网掩码 GATEWAY默认网关 DNS1第一个DNS服务器指向 DNS2第二个DNS服务器指向
USERCTL普通用户是否可控制此设备 PEERDNS如果BOOTPROTO的值为dhcp,是否允许dhcp分配的dns服务器指向信息直接覆盖/etc/resolv.conf
/etc/sysconfig/network-scripts/route-* 两种风格: 1、TARGET via GW 192.168.0.0/24 via 172.16.0.1 2、每三行定义一条路由 ADDRRESS#=TARGET NETMASK#=mask GATEWAY#=GW 8、如何给网络接口配置多个地址,有哪些方式? 1)ifconfig命令 ifconfig IFACE_ALISE IP 示例:ifconfig eth0:0 192.168.100.110 2)ip addr命令 ip addr add IP dev IFACE 示例:ip addr add 192.168.100.110 dev eth0 3)配置文件 ifcfg-IFACE_ALISE DEVICE=IFACE_ALISE 示例: cat >> /etc/sysconfig/network-scripts/ifcfg-eth0:0 << EOF TYPE=Ethernet BOOTPROTO=none NAME=eth0:0 DEVICE=eth0:0 ONBOOT=yes IPADDR=192.168.100.110 PREFIX=24 GATEWAY=192.168.100.2 DNS1=192.168.100.2 EOF 4)nmcli命令 示例:nmcli connection modify eth0 +ipv4.addresses "192.168.100.110/24" 9、常用的网络管理类工具有哪些,并用示例形式描述他们的使用方法。 1)ping ping命令用来测试主机之间网络的连通性 常用选项: -c :设置完成要求回应的次数 -w :waitsecs 在 waitsecs 秒后停止 ping 程序的执行。当试图检测不可达主机时此选项很有用。 -q :静态输出。在程序启动和结束时只显示摘要行。 -s :packetsize 指定要发送数据的字节量 示例: ping 192.168.100.1 ping -w 1 -c 1 192.168.100.1
2)tracepath,traceroute tracepath命令用来追踪连接到目标地址的所经过的路由 traceroute命令用于追踪数据包在网络上的传输时的全部路径 常用选项: -p<通信端口> 设置UDP传输协议的通信端口 -w<超时秒数> 设置等待远端主机回报的时间 -q 示例: traceroute -w 3 baidu.com tracepath www.baidu.com
3)netstat,ss netstat命令用来查看网络状态 ss命令也是用来查看网络转态,在连接数比较多的时候比netstat命令性能好,参数用法和netstat基本一致 显示网络连接 netstat [--tcp|-t] [--udp|-u] [-n] [-a] -t tcp协议 -u udp协议 -w raw socket相关 -l 处于监听状态 -a 所有状态 -n 以数字显示ip和端口 -e 扩展格式 -p 显示相关进程的pid 显示路由表 netstat [-r] [-n] -r 显示内核路由表 -n 数字格式 显示接口统计数据 netstat [-i|-I] [iface] [-a] netstat -i netstat -I iface 示例: netstat -ant netstat -antlp
4)route route命令是用来管理路由 查看:route -n 添加:route add route add [-net|-host] target [gw] [dev] 示例: route add -host 192.168.100.110 gw 192.168.38.1 dev eth0 route add -net 192.168.100.0/24 gw 192.168.38.1 dev eth0 默认路由: route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.38.1 route add default gw 192.168.38.1 删除:route del route del [-net|-host] target [gw] [dev] 示例: route del -host 192.168.100.110 route del -net 192.168.100.0 netmask 255.255.255.0
5)host host命令用来做DNS查询。如果命令参数是域名,命令会输出关联的IP;如果命令参数是IP,命令则输出关联的域名 常用选项: -i 反向查找 -a 等同于“-v -t”,显示所有类型,详细信息 -v 运行时显示详细的处理信息 -t<类型> 指定类型,包括a、all、mx、ns -4 用于IPv4的查询 -6 用于IPv6的查询 示例: host www.baidu.com host -t ns www.baidu.com
6)ifconfig ifconfig 是一个用来查看、配置、启用或禁用网络接口的工具 ifconfig [interface] 示例: ifconfig #查看所有已激活网卡的信息 ifconfig eth0 #查看eth0网卡信息 ifconfig eth0 192.168.100.100 #配置eth0接口ip地址
7)ip ip是iproute2软件包里面的一个强大的网络配置工具 ip link set { dev DEVICE | group DEVGROUP } [ { up | down } ] 示例: ip link show #查看所有接口链接信息 ip link show eth0 #查看eth0接口链接信息 ip link set dev eth0 up #up/down 起动/关闭设备
ip addr {add|del|change|replace} IFADDR dev STRING 示例: ip addr show #查看所有接口ip信息 ip addr show eth0 #查看eth0接口ip信息 ip addr add 192.168.100.110 dev eth0 #指定eth0添加一个ip地址 ip addr del 192.168.100.110 dev eth0 #指定eth0删除ip地址
10、Linux系统软件包管理方法(安装、升级、卸载等操作)有哪些,以及如何管理的。 Linux系统软件包管理方法有: 1)源码包 2)二进制应用程序包 3)程序包管理器 rpm 4)程序包前端工具 yum/dnf 注意:程序包这里以redhat系发行版为例 1)源码包 *.tar.gz、*.bz2形式的源代码 安装: 源码包编译安装主要是三个步骤 a、./configure [cmake] 通过选项传递参数,指定启用特性,安装路径等,执行时会参考用户的指定以及Makefile.in文件生成makefile 检查依赖到的外部环境 b、make 根据makefile文件,构建应用程序 c、make install 进行安装 升级: 只能重新编译 卸载: make uninstall或者把编译指定的安装路径目录删除
*.src.rpm形式的源代码 安装: 安装后,先制作成二进制格式的rpm包,而后再安装 rpm -rebuild *.src.rpm rpm -ivh *.rpm 升级: 下载新的源码包,重新安装成二进制rpm包 卸载: rpm -e packgename
2)二进制应用程序包 二进制应用程序包是已经编译安装好的压缩包,直接解压后就能正常使用,卸载时删除解压缩的目录
3)程序包管理器 rpm 安装:rpm -ivh -i 安装 -v 显示详细信息 -h 显示安装进度 升级:rpm -Uvh | rpm -Fvh upgrage:安装有旧版程序包,则升级,如果不存在旧版,则安装 freeshen:安装有旧版程序包,则升级,如果不存在旧版,则不会安装 卸载:rpm -e --nodeps 忽略依赖关系 查询: rpm -q -qa 查询所有已安装的程序包 -qf 查询指定的文件由哪个程序生成 --whatprovides 查询命令、文件、功能是由哪个包生成的 --whatrequires 查询指定的文件、命令被哪个包依赖
--changelog 查询rpm包的changlog -qc 查询包的配置文件 --conflicts 查询是否和其他包冲突 -qd 查询程序包的文档 -qi --info 显示包的信息 -ql 查询程序包安装后生成的所有文件 --scripts 查询包的脚本 -R 查询程序包所依赖的CAPABLITY --provides 列出指定程序包所提供的CAPABLITY
-p 使用-p选项查询没有安装的包信息 校验: rpm -V
4)程序包前端工具 yum/dnf dnf是yum的升级工具,使用方法和yum基本一致,这里使用yum说明 yum仓库的定义参考11题,这里只说明yum管理程序包的操作 显示程序包 yum list 显示所有的程序包 yum list installed 显示已安装的程序包 yum list available 显示可安装的程序包 yum grouplist 显示组 安装 yum install 升级 yum update 检查可用升级 yum check-update 卸载 yum remove 查看包信息 yum info 查看特性由哪个程序包提供 yum provides 清理缓存 yum clean all 构建缓存 yum makecache 重装 yum reinstall 降级 yum dowmgrage 查看依赖关系 yum deplist 查看历史 yum history 安装或升级本地程序包 yum localinstall yum localupdate 11、如何使用发行版光盘作为yum repository,请描述该过程。 1)、挂载光盘镜像 mount /dev/cdrom /mnt 或者将光盘iso放到某目录下挂载,这里以CentOS-7为例 mount -t iso9660 CentOS-7-x86_64-Everything-1511.iso /mnt 2)、备份原来的配置文件 cd /etc/yum.repos.d/ mkdir bak mv *.repo bak/ 3)、配置光盘yum配置文件 cat >> /etc/yum.repos.d/centos7.repo << EOF [centos7] name=centos7_dvd baseurl=file:///mnt enabled=1 gpgcheck=0 EOF 4)、重建yum缓存,查看 yum clean all && yum makecache yum repolist
12、写一个脚本,完成以下功能 (1) 假设某目录(/etc/rc.d/rc3.d/)下分别有K开头的文件和S开头的文件若干; (2) 显示所有以K开头的文件的文件名,并且给其附加一个stop字符串; (3) 显示所有以S开头的文件的文件名,并且给其附加一个start字符串; (4) 分别统计S开头和K开头的文件各有多少; 13、写一个脚本,完成以下功能 (1) 脚本能接受用户名作为参数; (2) 计算此些用户的ID之和; 14、写一个脚本 (1) 传递一些目录给此脚本; (2) 逐个显示每个目录的所有一级文件或子目录的内容类型; (3) 统计一共有多少个目录;且一共显示了多少个文件的内容类型; 15、写一个脚本 通过命令行传递一个参数给脚本,参数为用户名 如果用户的id号大于等于500,则显示此用户为普通用户; 16、写一个脚本 (1) 添加10用户user1-user10;密码同用户名; (2) 用户不存在时才添加;存在时则跳过; (3) 最后显示本次共添加了多少用户; 17、写一脚本,用ping命令测试172.16.250.20-172.16.250.100以内有哪些主机在线,将在线的显示出来; 18、打印九九乘法表;
#!/bin/bash
# mageedu_week8_test6
# test ping
#
for i in {1..254};do
ping -c 1 -w 1 172.16.250.$i &> /dev/null
if [ $? -eq 0 ];then
echo -e "172.16.250.$i \t \033[32m [on] \033[0m"
else
echo -e "172.16.250.$i \t \033[31m [off] \033[0m"
fi
done
# ps:测试环境使用了192.168.10.0/24网段,并ping前10个ip
#!/bin/bash
# mageedu_week8_test12
# 统计/etc/rc.d/rc3.d/目录下文件
#
declare -i K_file_num=0
declare -i S_file_num=0
for file in $(ls /etc/rc.d/rc3.d/);do
if [[ $(echo $file | grep -o "^K") =~ 'K' ]];then
echo -e "$file \tstop"
let K_file_num++
elif [[ $(echo $file | grep -o "^S") =~ 'S' ]];then
echo -e "$file \tstart"
let S_file_num++
fi
done
printf "\n================\nK files have : $K_file_num \nS files have : $S_file_num\n"
#!/bin/bash
# mageedu_week8_test13
# 统计输入用户的uid之和
#
if [ $# -eq 0 ];then
echo "No username input "
exit 1
else
declare -i uid_sum=0
declare -a suc_user
for user in $@ ;do
if id $user &> /dev/null;then
uid=$(id -u $user)
let uid_sum+=$uid
suc_user=(${suc_user[*]} $user)
else
echo "$user is not exist"
fi
done
echo "(${suc_user[@]})sum of the uid is:$uid_sum"
fi
#!/bin/bash
# mageedu_week8_test14
# 统计输入的目录信息
#
if [ $# -eq 0 ];then
echo "No directory input "
exit 1
else
declare -i dir_num=0
declare -i files_num=0
for dir in $@;do
if [ -d $dir ];then
for files in $dir/*;do
file $files
let files_num++
done
printf "\n====================================\n"
let dir_num++
else
echo "$dir is not exist or not a directory"
fi
done
fi
printf "\nDirectory number:$dir_num\nSubdirectory and Files number:$files_num\n"
#创建几个测试目录和文件
# mkdir -p /tmp/test{1,2}/{aa,bb,cc}
# touch /tmp/test{1,2}/testfile
# 使用centos 7,id号大于等于1000,显示为普通用户
#!/bin/bash
# mageedu_week8_test15
# 判断输入的用户类型
#
if [ $# -eq 0 ];then
echo "No username input "
exit 1
fi
if id $1 &> /dev/null;then
if [ $(id -u $1) -ge 1000 ];then
echo "$1 is general user"
elif [ $(id -u $1) -eq 0 ];then
echo "$1 is root user"
else
echo "$1 is system user"
fi
else
echo "$1 not exist"
fi
#!/bin/bash
# mageedu_week8_test16
#
#
declare -i i=1
declare -i sum=0
declare -a suc_add_user
if [ $UID -ne 0 ];then
echo "Only root user can create users"
exit 1
fi
while [ $i -le 10 ];do
if id user$i &> /dev/null;then
echo "user$i is exist"
else
useradd user$i && echo "user$i" | passwd --stdin user$i &> /dev/null
suc_add_user=(${suc_add_user[*]} user$i)
let sum++
fi
let i++
done
echo "Total have $sum users to add"
echo "Add users: ${suc_add_user[*]}"
# 和第6题脚本思路一致,上题使用了for循环,这次使用while循环实现
# 也是使用了192.168.10.0/24网段
#!/bin/bash
# mageedu_week8_test6
# test ping 2
#
declare -i i=20
while [ $i -le 100 ];do
if ping -w 1 -c 1 192.168.10.$i &> /dev/null;then
echo -e "192.16.10.$i \t[on]"
fi
let i++
done
#!/bin/bash
# mageedu_week8_test18
# 使用for循环实现九九乘法表
#
for ((i=1;i<=9;i++));do
for ((j=1;j<=i;j++));do
echo -e -n "${i}*${j}=$[$i*$j]\t"
done
echo
done
#!/bin/bash
# mageedu_week8_test18
# 使用while循环实现九九乘法表
#
declare -i i=1
declare -i j=1
while [ $j -le 9 ];do
while [ $i -le $j ];do
echo -e -n "$i*$j=$[$i*$j]\t"
let i++
done
echo
let i=1
let j++
done