1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。
网桥: 连接不同子网,使其透明通信,它们工作在链路层。它们处理的是链路层数据,一般来说就是以太 网帧格式的 数据,缺点是无法避免“广播风暴”,交换机就是网桥的集合。 集线器: 集线器的基本功能是信息分发,它把一个端口接收的所有信号向所有端口分发出去。一些集线器 在分发之前将弱信号重新生成,一些集线器整理信号的时序以提供所有端口间的同步数据通信, 工作在物理层,集线器只是把各个终端互相连接起来而已,处理的是信号。 二层交换机: 传统交换机从网桥发展而来,属于OSI第二层即数据链路层设备。它根据MAC地址寻址,通 过站表选择路由,站表的建立和维护由交换机自动进行。 三层交换机: 三层交换机就是具有部分路由器功能的交换机,三层交换机的最重要目的是加快大型局域网内部 的数据交换,所具有的路由功能也是为这目的服务的,能够做到一次路由,多次转发。对于数据 包转发等规律性的过程由硬件高速实现,而像路由信息更新、路由表维护、路由计算、路由确定 等功能,由软件实现。三层交换技术就是二层交换技术+三层转发技术,三层交换技术是在网络 模型中的第三层实现了数据包的高速转发,既可实现网络路由功能,又可根据不同网络状况做到 最优网络性能。 路由器: 路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生, 处理网络层数据,也就是ip报文格式的数据,目前来看网络层的报文格式是ip一家独大,当然路 由器也可以处理tcp、udp等四层数据,以及ppp等三层数据。但它的主要作用在于ip转发,所以 我们一般认为它是网络层设备
2、IP地址的分类有哪些?子网掩码的表示形式及其作用
IP地址就是给每一个连接在Internet上的主机分配一个唯一的32bit 地址(标识符),IP地址的结构 使我们可以Internet上很方便地进行寻址,IP地址有两部分组成,一部分为网络地址,另一部分为主机 地址.IP地址分为A,B,C,D,E5类.常用的是B和C两类. A类: 0 000 0000- 0 111 111:1-127 网络数:127-1=126 每个网络中的主机数:2^24-2 默认子网掩码:255.0.0.0 私有地址 10.0.0.0/8 B类 10 00 0000-10 11 1111: 128-191 网络数:2^14 网络主机数:2^16-2 默认子网掩码:255.255.0.0 私网地址:172.16.0.0/16 - 172.31.0.0/16 C类 110 0 0000- 110 1 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:244-239 E类:240-255
3、计算机网络的分成模型有哪些(OSI模型和TCP/IP模型),每一层的功能及涉及到的物理设备有哪些。
OSI模型: (1)物理层 物理层所处理的数据单位是比特(bit),物理层向上为数据链路层提供物理链路,实现透明的比 特流(bit stream)传输服务,物理层向下与物理媒体相连,要确定连接物理媒体的网络接口的 机械、电气、功能和过程方面的特性。 物理设备:网卡、网线;老式集线器; (2)数据链路层 数据链路层负责在单个链路上的结点间传送以帧(frame)为PDU的数据,在不太可靠的物理链路上 实现可靠的数据传输。数据链路层的主要功能包括:建立、维持和释放数据链路的连接,链路的 访问控制,流量控制和差错控制。 物理设备:MAC地址,二层交换机;PPP协议; (3)网络层 网络层传送的PDU称为分组或包(packet),在物理网络间传送分组,负责将源端主机的报文通过 中间转发结点传送到目的端。网络层是通信子网的最高层,为主机提供虚电路和数据报两种方 式的服务。网络层主要负责分组转发和路由选择,根据路由表把分组逐跳地由源站传送到目的 站,并能适应网络的负载及拓扑结构的变化,动态地更新路由表。 物理设备:IP地址,网关,网关代理;三层交换机;路由设备; (4)传输层 传输层传输的PDU称为报文(message),传输层为源结点和目的结点的用户进程之间提供端到端的 可靠的传输服务。端到端的传输指的是源结点和目的结点的两个传输层实体之间,不涉及路由器 等中间结点。为了保证可靠的传输服务,传输层具备以下一些功能:面向连接、流量控制与拥塞 控制、差错控制相网络服务质量的选择等。 协议:TCP,UDP协议,IP代理; (5)会话层 会话层在传输层服务的基础上增加控制会话的机制,建立、组织和协调应用进程之间的交互过 程。会话层提供的会话服务种类包括双工、半双工和单工方式。会话管理的一种方式是令牌管理 ,只有令牌持有者才能执行某种操作。会话层提供会话的同步控制,当出现故障时,会话活动在 故障点之前的同步点进行重复,而不必从头开始。 协议: HTTP协议,web,mail
(6)表示层 表示层定义用户或应用程序之间交换数据的格式,提供数据表示之间的转换服务,保证传输的信 息到达目的端后意义不变。 (7)应用层 应用层直接面向用户应用,为用户提供对各种网络资源的方便的访问服务。 TCP/IP模型: TCP/IP是一组用于实现网络互连的通信协议。Internet网络体系结构以TCP/IP为核心。基于TCP/IP的 参考模型将协议分成四个层次,它们分别是:网络访问层、网际互联层、传输层(主机到主机)、和 应用层。 1、主机到网络层 实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层-网络互连层一 个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网 络类型的不同而不同。 物理设备:网卡、网线、中继器;老式集线器; 2、网络互连层 网络互连层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽 快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序 可能不同,这就需要上层必须对分组进行排序。 网络互连层定义了分组格式和协议,即IP协议(Internet Protocol)。 网络互连层除了需要完成路由的功能外,也可以完成将不同类型的网络(异构网)互连的任务。 除此之外,网络互连层还需要完成拥塞控制的功能。 物理设备:二层交换机,网桥 3、传输层 在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话。在传输 层定义了两种服务质量不同的协议。即:传输控制协议TCP(transmission control protocol) 和用户数据报协议UDP(user datagram protocol)。 TCP协议是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP协议还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据,UDP协议是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。物理设备:三层交换机,路由器; 4、应用层 TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。 应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协 议(File Transfer Protocol,FTP)、虚拟终端协议(TELNET)、超文本链接协议(Hyper Text Transfer Protocol,HTTP),也有基于UDP协议的。 物理设备:高层交换机等
4、如何将Linux主机接入到TCP/IP网络,请描述详细的步骤。(手动指定的方式)
1、vim /etc/sysconfig/network-scripts/ifcfg-eth0 (修改配置文件,永久有效) 2、编辑eth0文件,完成后保存退出 ONBOOT=no改为ONBOOT=yes BOOTPROTO=dhcp改为BOOTPROTO=static或none IPADDR=IP地址 NETMASK=mas地址 GATEWAY=网关地址 DNS1=dns服务器地址(dns可省略) 3重启网络服务 service network restart或/etc/init.d/network restart 即时生效:(重启后失效) ifconfig eth0 192.168.0.1/24 ifconfig eth0 192.168.0.1 netmask 255.255.255.0
5、为Linux主机配置网络信息的方式有哪些,请描述各个过程。
Ifconfig命令: 第一种使用ifconfig命令配置网卡的ip地址。此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效。具体用法如下。Ipconfig ethx ipadd netmask x.x.x.x。 其中ethx中的x代表第几快以太网卡,默认第一块为0.ipadd代表ip地址。x.x.x..x为子网掩码。 例如给网卡eth0配置的ip地址为192.168.1.1 子网掩码为 255.255.255.0 setup命令: 输入setup将会出现图形化界面,选择Network configuration 之后再选择Device configuration选择要设置的网卡,设置IP地址,mac地址,网关,dns等 之后保存退出重启网络服务。 图形界面: 1、系统-首选项-网络连接 2、编辑 3、方法-选“手动”,地址下面有IP、子网掩码、网关、DNS。填好,点击“应用”即可。 当前立即生效,但不是永久生效: ifconfig eth0 192.168.0.1/24 或 ifconfig eth0 192.168.0.1 netmask 255.255.255.0 ip addr replace 192.168.1.8/24 dev eth0 centos7 nmcli c modify eth0 +ipv4.addresses 18.168.1.13/24 nmcli con down eth0;nmcli c up eth0
6、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态;
在线的主机使用绿色显示;
不在线的主使用红色显示;
(测试用192.168.2.1-192.168.2.254测试) [[email protected] tmp]# vim ip.sh #!/bin/bash declare -i i=1 declare -i uphosts=0 declare -i downhosts=0 net=‘192.168.2.‘ while [ $i -le 254 ]; do if ping -c 1 -w 1 $net$i &> /dev/null; then echo -e "\033[32m $net$i is up!" let uphosts++ else echo -e "\033[31m $net$i is down!" let downhosts++ fi let i++ done echo "Up hosts:$uphosts" echo "Down hosts:$downhosts [[email protected] tmp]# bash -n ip.sh [[email protected] tmp]# bash ip.sh 192.168.2.1 is up! 192.168.2.2 is down! 192.168.2.3 is down! 192.168.2.4 is down! 192.168.2.5 is down! 192.168.2.6 is down! 192.168.2.7 is down! 192.168.2.8 is down!
................... 192.168.2.99 is down! 192.168.2.100 is up! 192.168.2.101 is down! 192.168.2.102 is down! 192.168.2.103 is down! 192.168.2.104 is down! 192.168.2.105 is down! 192.168.2.106 is up! 192.168.2.107 is down! 192.168.2.108 is down! 192.168.2.109 is up! 192.168.2.110 is up! ....................... 192.168.2.252 is down! 192.168.2.253 is down! 192.168.2.254 is down! Up hosts:5 Down hosts:249
7、详细描述每个网络接口的配置文件中各个参数的含义和其所对应的值;
DEVICE:此配置文件的设备 HWADDR:此设备的MAC地址 BOOTPROTO:激活此设备使用的地址配置协议,常用的:dhcp,static,none,bootp NM_CONTROLLED:NM是networkManager的简写(/etc/rc.d/init.d/):此网卡是否接受nm的控制, centos6建议为no ONBOOT:在系统引导是时是否激活此设备 TYPE:接口类型: 常见的有Ethernet,Bridge UUID:设备唯一标识 IPADDR:指明ip地址 NETMASK:子网掩码 GATEWAY:默认网关 DNS1:DNS服务器指向 DNS2:DNS2服务器指向 USERCTL:普通用户是否可控制此设备 PEERDNS:如果bootproto的值为dhcp,是否允许dhcp server 分配的dns服务器指向信息直接覆盖 至/etc/resolv.conf文件中
8、如何给网络接口配置多个地址,有哪些方式?
1、永久有效 仿照/etc/sysconfig/network-scripts/ifcfg-eth0增加一文件根据网络虚拟接口的名字进行命名, 例如ifcfg-eth0:0或者ifcfg-eth0:1等等 下边看下ifcfg-eth0:0文件里面的配置信息 DEVICE=eth0:0 #网络虚拟接口eth0:0 ONBOOT=yes #启动的时候激活 BOOTPROTO=static #使用静态ip地址 IPADDR=192.168.0.1 #分配ip地址 NETMASK=255.255.255.0 #子网掩码 2、立即生效 ifconfig eth0:0 192.168.0.1 netmask 255.255.255.0 up ip addr add 192.168.1.8/24 dev eth0label ‘eth0:0‘ nmcli c modify eth0 +ipv4.addresses 18.168.1.13/24(增加ip,要禁用启用网卡生效)
9、常用的网络管理类工具有哪些,并用示例形式描述他们的使用方法。
ifconfig命令: ifconfig [interface] -a:所有接口信息 ifconfig INTRENAME:显示指定的接口信息 ifconfig interface [aftype] options | address ... #ifconfig intername IP/MAS ifconfig eth0 192.168.0.1/24 ifconfig eth0 192.168.0.1 netmask 255.255.255.0 当前立即生效,但不是永久生效 启用混杂模式 -promisc:不启用 promisc:启用 route命令:路由管理命令 查看:route -n 添加 route add ip route add 192.168.1.0/24 via 172.16.1.1 dev eth0 添加去往192.168.1.0/24的路由, 下一跳是172.16.1.1;ip route add default 172.16.1.1 添加默认路由 删除: route del 主机: route del -host 192.168.1.3 网络:route del -net 182.168.0.0 netmask 255.255.255.0 默认: route del default ip命令: ip [ OPTIONS ] OBJECT { COMMAND | help } OBJECT := { link | addr | addrlabel | route | rule | neigh | tunnel | maddr | mroute | monitor } OPTIONS := { -V[ersion] | -s[tatistics] | -r[esolve] | -f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] }
link:管理网络设备 set: ip link set dev etho down (up and down 激活或禁用指定接口) show: ip link show dev name:显示指定接口 up:仅显示处于up状态的接口 addr: ip addr show 查看 ip addr { add | del } IFADDR dev STRING ip addr add 192.168.1.8/24 dev eth0 ip addr replace 192.168.1.8/24 dev eth0 ip addr add 192.168.1.8/24 dev eth0label ‘eth0:0‘(同一个网卡不同别名上面的操作只是新增了ip地址,并不是替换原有的ip) ip del 192.168.1.8/24 dev eth0 删除 ip addr dev 192.168.1.8/24 dev eth0label ‘eth0:0‘ ip addr [scope {global|link|host}] [broadcast ADDRESS] scope:指明作用域,globa:全局可用,link:仅接口可用,host:仅本机可用 broadcast:指明广播地址 ip addr show [dev Device] [label LABEL] [primary主地址 and secondary辅地址] ip addr flush 默认清除所有同show,指定相关条件的地址 清除
route: ip route add TARGET via GW dev IFACE src SOURCE_IP源ip ip route add 192.168.1.3 via 172.16.0.1 dev eth0 ip route add 192.168.0.0/24 via 172.16.0.1 dev eth0 ip route add default via 172.16.0.1 dev eth0 默认路由 TARGET: 主机路由:只写ip 网络路由:ip/mask ip route delete ip route del TARGET ip route show ip route flush
10、Linux系统软件包管理方法(安装、升级、卸载等操作)有哪些,以及如何管理的。
rpm -i 安装指定rpm程序包 rpm -e 卸载指定程序 rpm –test 测试安装 rpm –nodeps 忽略依赖关系 rpm –replacepkgs 重新安装 rpm –nosignature:不检查来源的合法性 rpm –upgrage 安装有旧程序包,则升级,如果不存在旧版程序包,则安装 rpm –freshen:安装有旧程序包时,则升级,如果不存,则不执行升级操作 rpm -q{l | c } 显示指定程序是否安装\安装生成的文件\配置文件 yum install 安装指定程序 yum remove 卸载指定程序 yum update 升级指定程序 yum groupinstall 安装组程序包
yum groupupdate 升级组程序 yum groupremove 卸载组程序 yum info 查看指定程序的信息
11、如何使用发行版光盘作为yum repository,请描述该过程。
首先挂载到某一个目录,如mount /dev/cdrom /mnt 编辑或创建/etc/yum.repos.d/ 目录下以repo结尾的文件。 vim /etc/yum.repos.d/localadd.repos [localbase] name=local centos name 名称 baseurl=file:///mnt/ 路径 cost=1 开销 gpgcheck=0 不检查 enabled=1 开启
12、写一个脚本,完成以下功能
(1) 假设某目录(/etc/rc.d/rc3.d/)下分别有K开头的文件和S开头的文件若干;
(2) 显示所有以K开头的文件的文件名,并且给其附加一个stop字符串;
(3) 显示所有以S开头的文件的文件名,并且给其附加一个start字符串;
(4) 分别统计S开头和K开头的文件各有多少;
[[email protected] ~]# vim rc.sh #!/bin/bash declare -i k=0 declare -i s=0 for i in $(ls /etc/rc.d/rc3.d/K* | grep -o "[^/]*$"); do echo "$i stop" let k=$k+1 done for i in $(ls /etc/rc.d/rc3.d/S* | grep -o "[^/]*$"); do echo "$i start" let s=$s+1 done echo "K files:$k" echo "S files:$s" [[email protected] ~]# bash -n rc.sh [[email protected] ~]# bash rc.sh K10saslauthd stop K61nfs-rdma stop K87restorecond stop K89netconsole stop K89rdisc stop K95rdma stop S02lvm2-monitor start S08ip6tables start S08iptables start S10network start S11auditd start S12rsyslog start
S15mdmonitor start S25blk-availability start S25netfs start S26udev-post start S50kdump start S55sshd start S80postfix start S90crond start S99local start K files:6 S files:15
13、写一个脚本,完成以下功能
(1) 脚本能接受用户名作为参数;
(2) 计算此些用户的ID之和;
[[email protected] ~]# vim user.sh #!/bin/bash declare -i sum=0 if [ $# -lt 2 ]; then echo "Please enter two user name" exit 1 fi if [ $# -ge 2 ]; then for i in [email protected]; do if id $i &> /dev/null; then userid=`id -u $i` let sum=$sum+$userid else echo "Sorry user $i not found" fi done fi echo "user id sum:$sum" [[email protected] ~]# bash -n user.sh [[email protected] ~]# bash user.sh Please enter two user name [[email protected] ~]# bash user.sh toot Please enter two user name [[email protected] ~]# bash user.sh toot root Sorry user toot not found user id sum:0 [[email protected] ~]# bash user.sh root mageedu user id sum:500
[[email protected] ~]# bash user.sh tom mageedu ftp mail user id sum:1023
14、写一个脚本
(1) 传递一些目录给此脚本;
(2) 逐个显示每个目录的所有一级文件或子目录的内容类型;
(3) 统计一共有多少个目录;且一共显示了多少个文件的内容类型;
[[email protected] tmp]# vim dir.sh #!/bin/bash declare -i fsum=0;bsum=0;csum=0;dsum=0;lsum=0;psum=0;ssum=0 if [ $# -lt 1 ]; then echo "please enter one dir" exit 1 fi if [ $# -ge 1 ]; then for i in [email protected]; do if [ ! -d $i ]; then echo "sorry $i is not dir" else tree $i for j in $(ls $i); do if [ -L "$i/$j" ];then let lsum++ elif [ -b "$i/$j" ];then let bsum++ elif [ -c "$i/$j" ];then let csum++ elif [ -d "$i/$j" ];then let dsum++ elif [ -f "$i/$j" ];then let fsum++ elif [ -p "$i/$j" ];then let psum++ elif [ -S "$i/$j" ];then let ssum++ fi done fi done fi echo "dir is:$dsum" echo "file is:$fsum"
echo "b file is:$bsum" echo "c file is:$csum" echo "l file is:$lsum" echo "p file is:$psum" echo "s file is:$ssum" [[email protected] tmp]# vim dir.sh [[email protected] tmp]# bash -n dir.sh [[email protected] tmp]# bash dir.sh /etc/passwd sorry /etc/passwd is not dir dir is:0 file is:0 b file is:0 c file is:0 l file is:0 p file is:0 s file is:0 [[email protected] tmp]# bash dir.sh /dev/ /dev/ ├── agpgart ├── block │ ├── 1:0 -> ../ram0 │ ├── 1:1 -> ../ram1 │ ├── 1:10 -> ../ram10 │ ├── 11:0 -> ../sr0
│ ├── 1:11 -> ../ram11 │ ├── 1:12 -> ../ram12 │ ├── 1:13 -> ../ram13 │ ├── 1:14 -> ../ram14 │ ├── 1:15 -> ../ram15 │ ├── 1:2 -> ../ram2 ....................... ├── VolGroup │ ├── lv_home -> ../dm-2 │ ├── lv_root -> ../dm-0 │ └── lv_swap -> ../dm-1 └── zero 29 directories, 410 files dir is:16 file is:0 b file is:31 c file is:122 l file is:15 p file is:0 s file is:1
15、写一个脚本
通过命令行传递一个参数给脚本,参数为用户名
如果用户的id号大于等于500,则显示此用户为普通用户;
[[email protected] tmp]# vim us.sh #!/bin/bash if [ $# -lt 1 ]; then echo "please enter a user naem" exit 1 fi if [ $# -ge 1 ]; then for i in [email protected]; do if id $i &> /dev/null; then userid=`id -u $i` if [ $userid -ge 500 ]; then echo " $i is a regular user" else echo " $i is a system user" fi else echo " sorry $i user is not found" fi done fi [[email protected] tmp]# bash -n us.sh [[email protected] tmp]# bash us.sh please enter a user naem [[email protected] tmp]# bash us.sh yy sorry yy user is not found [[email protected] tmp]# bash us.sh root root is a system user [[email protected] tmp]# bash us.sh root yy root is a system user sorry yy user is not found [[email protected] tmp]# bash us.sh root mageedu
root is a system user mageedu is a regular user [[email protected] tmp]# bash us.sh tom mageedu tom is a regular user mageedu is a regular user
16、写一个脚本
(1) 添加10用户user1-user10;密码同用户名;
(2) 用户不存在时才添加;存在时则跳过;
(3) 最后显示本次共添加了多少用户;
[[email protected] tmp]# vim adduser.sh #!/bin/bash declare -i i=0 declare -i users=0 if [ ! $UID -eq 0 ]; then echo "welcome root create user" exit 1 fi while [ $i -le 10 ]; do let i++ if id user$i &> /dev/null; then echo "user exists" continue else useradd user$i if [ $? -eq 0 ]; then echo "user$i" | passwd --stdin user$i &> /dev/null echo " New user:user$i add sucess" let users=$users+1 fi fi done echo "addusers:$users" [[email protected] tmp]# bash -n adduser.sh [[email protected] tmp]# bash adduser.sh
user exists user exists user exists user exists user exists user exists New user:user7 add sucess New user:user8 add sucess New user:user9 add sucess New user:user10 add sucess addusers:4 [[email protected] tmp]# bash adduser.sh user exists user exists user exists user exists user exists user exists user exists user exists user exists user exists user exists addusers:0
17、写一脚本,用ping命令测试172.16.250.20-172.16.250.100以内有哪些主机在线,将在线的显示出来;
[[email protected] tmp]# vim ip2.sh #!/bin/bash declare -i i=1 declare -i uphosts=0 declare -i downhosts=0 net=‘192.168.2‘ for i in {1..254}; do ping -c 1 -w 1 ${net}.${i} &> /dev/null if [ $? -eq 0 ]; then echo "${net}.${i} is up !" let uphosts++ else echo "${net}.${i} is down!!" let downhosts++ fi done echo "Up hosts is:$uphosts" echo "Down hosts is:$downhosts" [[email protected] tmp]# bash -n ip2.sh [[email protected] tmp]# bash ip2.sh 192.168.2.1 is up ! 192.168.2.2 is down!! 192.168.2.3 is down!! 192.168.2.4 is down!! .....................
192.168.2.249 is down!! 192.168.2.250 is down!! 192.168.2.251 is down!! 192.168.2.252 is down!! 192.168.2.253 is down!! 192.168.2.254 is down!! Up hosts is:7 Down hosts is:247
18、打印九九乘法表;
for: [[email protected] tmp]# vim nine.sh #!/bin/bash declare -i i=1 declare -i j=1 for i in {1..9}; do for j in $(seq 1 $i); do echo -e -n "${j}X${i}=$[$j*$i]\t" done echo done [[email protected] tmp]# bash -n nine.sh [[email protected] tmp]# bash nine.sh 1X1=1 1X2=22X2=4 1X3=32X3=63X3=9 1X4=42X4=83X4=124X4=16 1X5=52X5=103X5=154X5=205X5=25 1X6=62X6=123X6=184X6=245X6=306X6=36 1X7=72X7=143X7=214X7=285X7=356X7=427X7=49 1X8=82X8=163X8=244X8=325X8=406X8=487X8=568X8=64 1X9=92X9=183X9=274X9=365X9=456X9=547X9=638X9=729X9=81
while [[email protected] tmp]# vim nine2.sh #!/bin/bash declare -i i=1 declare -i j=1 while [ $i -le 9 ]; do while [ $j -le $i ]; do echo -e -n "${j}X${i}=$[$j*$i]\t" let j++ done let j=1 let i++ echo done [[email protected] tmp]# bash -n nine2.sh [[email protected] tmp]# bash nine2.sh 1X1=1 1X2=22X2=4 1X3=32X3=63X3=9 1X4=42X4=83X4=124X4=16 1X5=52X5=103X5=154X5=205X5=25 1X6=62X6=123X6=184X6=245X6=306X6=36 1X7=72X7=143X7=214X7=285X7=356X7=427X7=49 1X8=82X8=163X8=244X8=325X8=406X8=487X8=568X8=64 1X9=92X9=183X9=274X9=365X9=456X9=547X9=638X9=729X9=81
until [[email protected] tmp]# vim nine3.sh #!/bin/bash declare -i j=1 declare -i i=1 until [ $j -gt 9 ]; do until [ $i -gt $j ]; do echo -n -e "${i}X${j}=$[$i*$j]\t" let i++ done echo let i=1 let j++ done [[email protected] tmp]# bash -n nine3.sh [[email protected] tmp]# bash nine3.sh 1X1=1 1X2=22X2=4 1X3=32X3=63X3=9 1X4=42X4=83X4=124X4=16 1X5=52X5=103X5=154X5=205X5=25 1X6=62X6=123X6=184X6=245X6=306X6=36 1X7=72X7=143X7=214X7=285X7=356X7=427X7=49 1X8=82X8=163X8=244X8=325X8=406X8=487X8=568X8=64 1X9=92X9=183X9=274X9=365X9=456X9=547X9=638X9=729X9=81