目录
一. 免密登录认证
1.1 准备工作
假如机器A想要免密登录机器B,那么需要提前在机器A上生成一对秘钥文件:公钥和私钥文件。而且机器A的公钥文件里的公钥信息还需要拷贝到机器B的连接用户的主目录下的隐藏目录.ssh/下的authoried_keys里
1.1.1 现在机器A上生成秘钥
[root@xxx01 ~]# ssh-keygen -t rsa 一路回车下去
说明:最后会在当前用户的家里的.ssh隐藏目录下产生两个文件
id_rsa: 私钥文件
id_rsa.pub : 公钥文件
1.1.2 将机器A的公钥信息,拷贝到机器B的相关用户的家里的隐藏目录.ssh下的authoried_keys里
注意:先确认机器B里是否有.ssh目录,如果没有需要提前创建
在机器B上,执行 ssh localhost, 就会产生.ssh目录
[root@xxx01 .ssh]# scp id_rsa.pub xxx02:~/.ssh/authoried_keys
1.2 免密登录认证的原理流程
1.3 准备工作的简化
1. 生成秘钥
[root@xxx01 ~]# ssh-keygen -t rsa 一路回车下去
2. 将公钥拷贝到远程机器上
[root@xxx01 ~]# ssh-copy-id -i xxx02
ssh-copy-id的作用:将公钥文件拷贝到远程机器的.ssh隐藏目录下,并更名成authorized_keys文件
问题:集群可能有多台机器,都要进行免密登录认证,如果每个机器都有自己的一套秘钥,拷贝赋值非常麻烦,所以这些机器可以用同一套秘钥。
1. 生成秘钥
[root@xxx01 ~]# ssh-keygen -t rsa 一路回车下去
2. 对自己进行免密登录认证
[root@xxx01 ~]# ssh-copy-id -i xxx01
3. 其他机器如果想要这一套钥匙,则需要拷贝id_rsa,id_rsa.pub,authorized_keys到相应的目录下
[root@xxx01 ~]# scp ~/.ssh/{id*,authorized_keys} xxx02:~/.ssh/
二.定时器crontab
2.1 crontab的简介
- 在Linux中,周期性的执行任务一般由cron这个守护进程来处理,它是一个linux下 的定时任务执行工具,可以在无需人工干预的情况下运行作业。
[ps -ef|grep cron]
- cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。
- cron的配置文件称为“crontab”,是“cron table”的简写。
2.2 cron服务
systemctl start crond //临时启动服务
systemctl stop crond //临时关闭服务
systemctl restart crond //重启服务
systemctl disable crond //禁用启动项
systemctl enable crond //启动开启启动项
systemctl stutas crond //查看服务状态
2.3 cron的配置文件位置
1. /var/spool/cron/
2. 说明这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。一般一个用户最多只有一个crontab文件。
2.4 crontab命令格式
作用:用于生成cron进程所需要的crontab文件
格式:crontab [-u username] -e
-u:用于指定其他用户的定时任务设置
2.5 定时器的格式
[root@xxx01 cron]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
即:
格式如下:
* * * * * user-name command to be executed
共有六部分组成,分别表示:
分 时 日 月 星期 要运行的命令
解析:
minute: 一小时中的哪一分钟 [0~59]
hour: 一天中的哪个小时 [0~23]
day: 一月中的哪一天 [1~31]
month: 一年中的哪一月 [1~12]
week: 一周中的哪一天 [0~6] 0表示星期天
commands: 执行的命令
书写注意事项
1.全都不能为空,必须填入,不知道的值使用通配符*表示任何时间
2.每个时间字段都可以指定多个值,不连续的值用,间隔,连续的值用-间隔。
3.命令应该给出绝对路径
4.用户必须具有运行所对应的命令或程序的权限
5. */num 表示频率
2.6 常用案例演示
1. 每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt
//注意 如果不进行追加 ,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
2. 每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
3. 晚上11点到早上8点之间每两个小时和早上八点
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
4. 周一到周五下午,5点半提醒学生15分钟后关机
30 17 * * 1-5 /usr/bin/wall < /etc/issue
45 17 * * 1-5 /sbin/shutdown -h now
5. 学校的计划任务, 12点到14点,每两分钟,检查apache服务是否启动
*/2 12-14 * 3-6,9-12 1-5
6. 每月1、10、22日的4:45运行/apps/bin目录下的backup.sh
45 4 1,10,22 * * /apps/bin/backup.sh
7. 每周六、周日的 1 : 10运行一个find命令
10 1 * * 6,0 /bin/find -name "core" -exec rm {} \;
8. 在每天 18:00至23 :00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh
0,30 18-23 * * * /apps/bin/dbcheck.sh
9.每星期六的 11:00 pm运行/apps/bin目录下的qtrend.sh
0 23 * * 6 /apps/bin/qtrend.sh
三.时间同步服务器的搭建
3.1 时间同步
在生产环境中的集群里,每台机器都有自己的时间,有的时候机器可能宕机,恢复后,时间不准确,也就是和其他机器时间不一致(不同步)。有些在集群上运行的作业对整个集群上所有机器的时间是有要求的,比如hbase集群要求所有机器的时间差不能超出30s。因此需要同步时间
3.2 如何同步时间
使用ntpdate指令进行同步时间,前提是只能同步时间服务器的时间。
用法: ntpdate -u timeserver
网络上的常用时间服务器:
阿里云时间服务器:ntp1.aliyun.com
微软时间服务器:time.windows.com
如果ntpdate命令不存在,需要安装ntpdate.x86_64
[root@xxx01 ~]# yum -y install ntpdate.x86_64
3.3 搭建局域网时间服务器
1. 选择集群中的某一台机器xxx01作为时间服务器
2. 保证这台服务器安装了ntp.x86_64。
[root@xxx01 ~]# yum list installed | grep ntp 查询
[root@xxx01 ~]# yum -y install ntp.x86_64
3. 保证ntpd 服务运行......(开机自启动)
[root@xxx01 ~]# systemctl start ntpd
[root@xxx01 ~]# systemctl enable ntpd
[root@xxx01 ~]# systemctl status ntpd
4. 配置相应文件:vi /etc/ntp.conf
......省略....
restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap 添加集群中的网络段位
server 127.127.1.0 -xxx01作为服务器
注意:
-- 需要重启机器,或者重启服务
-- 服务器的防火墙要关闭
5. 其他机器要保证安装ntpdate.x86_64
6. 在其他机器上进行测试,是否可以同步
ntpdate -u xxx01
7. 其他机器要使用root定义定时器
*/1 * * * * /usr/sbin/ntpdate -u xxx01
四.YUM源的更换
本地的yum信息在/etc/yum.repo.d/下。
[root@xxx01 ~]# cd /etc/yum.repos.d/
[root@xxx01 yum.repos.d]# ll
总用量 32
-rw-r--r--. 1 root root 1664 9月 5 2019 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 9月 5 2019 CentOS-CR.repo
-rw-r--r--. 1 root root 649 9月 5 2019 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 314 9月 5 2019 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 630 9月 5 2019 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 9月 5 2019 CentOS-Sources.repo
-rw-r--r--. 1 root root 6639 9月 5 2019 CentOS-Vault.repo
4.1 网络yum源的更换
由于CentOS系统默认的网络YUM源的地址是国外的,网速相对较慢,因此可以更换成国内的YUM源,比如阿里云、网易的等
这里选择更换成阿里云的yum源
步骤1)确保wget指令或者使curl指令存在
```
如果不在,就安装以下
yum -y install wget* curl*
```
步骤2)备份原有的yum源
```
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
```
步骤3)下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
```
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
或者是:
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
```
步骤4)清理原有的缓存
```
yum clean all
```
步骤5)重新构建缓存
```
yum makecache
```
4.2 本地yum源的搭建
1.确保虚拟机连接了DVD.iso影像文件,开机后,此文件位于/dev/cdrom
2.创建挂载目录/mnt/dvd
[root@scott ~]# mkdir /mnt/dvd
3.将映像文件挂载到/mnt/dvd下, 软件都在Packages目录下
[root@scott ~]# cd /mnt/dvd
[root@scott dvd]# mount -t iso9660 /dev/cdrom -o loop /mnt/dvd
[root@scott dvd]# ll
-t:用来指定文件类型, 光盘的类型是:iso9660
-o: 用来指定挂载方式, loop 用来把一个文件当成硬盘分区挂接上系统
4.将原有的yum源设置为失效状态(修改后缀即可)
[root@scott Packages]# cd /etc/yum.repos.d/
[root@scott yum.repos.d]# rename .repo .repo.bak ./*.repo
解析:rename [要修改的扩展名] [修改后的扩展名] [源文件]
5.创建local.repo文件,配置本地yum源信息
[root@scott yum.repos.d]# vi local.repo
[local] <--- 资源库的唯一标识
name=local <--- 资源库的名字
baseurl=file:///mnt/dvd <-----------指向本地路径
gpgcheck=0 <-----------0表示禁止校验,1表示开启校验
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 <--- CentOS yum源的秘钥文件
enabled=1 <-----------0表示禁用本资源库,1表示开启本资源库
6.清空yum源缓存
[root@scott yum.repos.d]# yum clean all
7.查询yum源软件列表
[root@scott yum.repos.d]# yum list all
注意:重启机器后,需要重写挂载,也就是重新执行mount指令。
4.3 局域网yum源的搭建
步骤1)选择局域网内的一台机器作为YUM源服务器,安装HTTP服务进程
```shell
[root@xxx01 ~]# systemctl status httpd
[root@scott yum.repos.d]# yum -y install httpd.x86_64
```
步骤2)启动httpd服务项
```shell
[root@xxx01 ~]# systemctl start httpd
[root@xxx01 ~]# systemctl enable httpd
[root@xxx01 ~]# systemctl status httpd
```
步骤3)配置HTTP服务管理YUM源目录
```
# HTTP服务进程管理的目录是/var/www/html
#在管理目录下,创建软连接,指向YUM源目录
]# ln -s /mnt/dvd /var/www/html/repo <===都是用绝对路径,保没错
```
步骤4)其他机器只需要把自己本地YUM源的路径指向局域网YUM源地址即可
```shell
[root@xxx02 yum.repos.d]# rename .repo .repo.bak ./*.repo
[root@xxx02 yum.repos.d]# vi local.repo #编辑文件,后缀必须是.repo
[local] <===YUM源仓库名
name=localrepo <===昵称
baseurl=http://局域网IP/repo <===局域网YUM仓库位置
enabled=1 <===1 表示启用,0表示禁用
gpgcheck=1 <===1 表示 校验
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 <===校验钥匙
```
五.LINUX的Shell脚本编程
5.1 shell的简介
shell其实指的是shell环境,是软件和OS之间的通信接口(软件的执行操作可以被shell翻译成OS识别的指令,从而进行调度硬件进行工作)。shell相对于os是独立的接口,linux上有多种shell接口,比如/bin/sh,/bin/bash,/usr/bin/sh,/usr/bin/bash,用户可以选择任意一个作为环境接口与OS进行通信调度。
查看系统中有哪些shell可以使用
```shell
[root@xxx01 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
```
查看当前Linux正在使用的shell环境
```shell
[root@xxx01 ~]# echo $SHELL
/bin/bash
```
shell环境(shell命令解释器)有很多功能:比如
```
1、命令记忆功能
2、命令和文件名补全功能
3、命令别名设置功能
4、作业控制、前台、后台切换功能
5、通配符功能
6、编程语言功能
```
在公司或者生产环境中所说shell脚本指的就是shell的其中一个强大功能而已。即它支持多种编程语言里常见的特征,比如分支和循环结构,函数,变量和数组等这些编程语法。并且一旦掌握后它将成为你的得力工具。只要能在提示符界面上输入的命令都能放到一个可执行的shell程序里,这意味着用shell语言能简单地重复执行某一任务。
5.2 shell脚本的编程规范
1)shell脚本文件编写的规范
```
1. 文件名的扩展名是*.sh
2. 文件里的第一行是用来指定使用哪一种shell环境来解析本文件
eg:
#!/bin/bash <---必须#!开头 shell环境写绝对路径
3. 空行会被忽略
4. #用来注释, 必须在行首
5. 命令 选项 参数之间如果有多个空格,会被解析成一个空格
6. tab键形成的空白,也被解析成一个空格。
```
2)如何运行脚本文件
```shell
方式1: 使用bash或sh指令 调度脚本文件
[root@xxx01 ~]# bash test1.sh
[root@xxx01 ~]# sh test1.sh
方式2:直接写脚本文件的绝对路径或者是相对路径,相对路径时必须添加./ 该文件必须有rx权限
[root@xxx01 ~]# /root/test1.sh
[root@xxx01 ~]# ./test1.sh
方式3:当脚本用于rw权限后,可以借助PATH环境变量里的一个路径来使用
[root@xxx01 ~]# mkdir ~/bin
[root@xxx01 ~]# mv ./test1.sh ~/bin
[root@xxx01 ~]# test1.sh <------会被当成命令直接使用
因为Linux会为每一个登录用户在PATH环境变量中维护一个~/bin目录,实际上该目录不存在,属于提前维护的。
```
5.3 shell脚本的变量
5.3.1 变量的应用规范
1)命名规范
```
- 由字母,数字,_组成,但是数字不能作为开头字符
- 字母习惯使用大写。
- 中间不能有空格。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)
```
2)使用规范
```
- 直接定义变量名称,没有类型需要强调(类似于数学中:x=1,y=2,z=x+y)
- 赋值时,"="前后不能有空格
- 命令的执行结果赋值给变量时,使用反单引号 如:TIME=`date`
- 调用变量时,必须使用$ 格式: $变量名 或 ${变量名}
小贴士: 反单引号也可以使用$() 比如 `date` 也可以写成 $(date)
```
5.3.2 变量的分类
shell脚本中的变量可以分局部变量、环境变量、位置变量、特殊意义的变量。
1)局部变量
定义的变量只能在当前程序中使用,不能在其他程序中使用,如子程序
[root@xxx01 ~]# NAME=GAOYUANYUAN # 在当前shell程序中定义一个NAME变量
[root@xxx01 ~]# echo $NAME
GAOYUANYUAN
[root@xxx01 ~]# bash # 进入子程序(也就是另起一个shell程序)
[root@xxx01 ~]# echo $NAME # 子程序中NAME是没有值的,也就是未定义
[root@xxx01 ~]# exit # 退出子程序
exit
[root@xxx01 ~]# echo $NAME
GAOYUANYUAN
[root@xxx01 ~]# vim ./bin/test1.sh
#!/bin/bash
NAME=zhangjingchu
city=shenzhen
echo $NAME $city #打印变量的值
NAME=CANGLAOSHI #变量重新赋值
CITY=GUANGZHOU #新变量CITY,
echo $NAME $city $CITY # 证明变量名是区分大小写的
只读变量和删除变量
[root@xxx01 ~]# NAME='zhaoyouting'
[root@xxx01 ~]# echo $NAME
zhaoyouting
[root@xxx01 ~]# readonly NAME #设置成只读变量
[root@xxx01 ~]# echo $NAME
zhaoyouting
[root@xxx01 ~]# NAME='JIAJINGWEN' #只读变量不能被再次赋值
bash: NAME: 只读变量
[root@xxx01 ~]# address='changchun'
[root@xxx01 ~]# echo $address
changchun
[root@xxx01 ~]# unset address #删除变量
[root@xxx01 ~]# echo $address
[root@xxx01 ~]# unset NAME #只读变量不能被删除
bash: unset: NAME: 无法反设定: 只读 variable
2)环境变量
当前程序中定义的变量,其他程序中也可以使用,我们就称之为环境变量
[root@xxx01 ~]# export name='canglaoshi' # 定义局部变量,并导出成环境变量
[root@xxx01 ~]# bash #进入子程序
[root@xxx01 ~]# echo $name # 打印变量,发现有值。
canglaoshi
[root@xxx01 ~]# address='beijing' #定义局部变量
[root@xxx01 ~]# export address #将局部变量导出成环境变量
[root@xxx01 ~]# bash #进入子程序
[root@xxx01 ~]# echo $address # 打印变量,发现有值。
beijing
如何检查系统的环境变量
[root@xxx01 ~]# export
或
[root@xxx01 ~]# env
3)位置变量
linux系统为命令行提供了特殊的位置变量$num ,num是从0开始的连续自然数。
[root@xxx01 ~]# vim bin/test2.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $4
[root@xxx01 ~]# chmod 700 bin/test2.sh
测试脚本
[root@xxx01 ~]# test2.sh gaoyuanyuan 贾静雯 苏有朋 李小冉
/root/bin/test2.sh
gaoyuanyuan
贾静雯
李小冉
注意: $0 指的是命令,$1开始的值称之为位置参数
$10会被解析成$1和0的无缝拼接,因此想要表达10位置的参数,需要将数字使用大括号括起来${10}
.........$11-->${11}
4)特殊意义的变量
$* : 将命令行上的所有位置参数当成一个字符串整体看待,即以"$1 $2 … $n"的形式输出所有参数
$@ : 将命令行上的所有位置参数区分看待,即每一个参数都是一个字符串
$# : 位置参数的个数
$? : 上一个命令执行的结果。0表示成功,其他值表示失败,值的范围为0~255
$$ : 当前进程的PID值
$! : 后台进程的最后一个进程的PID
[root@xxx01 ~]# vim bin/test3.sh
#!/bin/bash
echo '$0的值:'$0
echo "第一个位置参数:"$1
echo '$*的值:'$*
echo '$@的值:'$@
echo '$#的值(参数个数):'$#
echo '$?的值:'$?
echo '$$的值(当前进程PID):'$$
echo '$!的值(后台进程最后一个进程的PID):'$!
[root@xxx01 ~]# chmod 700 bin/test3.sh
[root@xxx01 ~]# test3.sh 1 2 3 4 5 6 7 8 9
$0的值:/root/bin/test3.sh
第一个位置参数:1
$*的值:1 2 3 4 5 6 7 8 9
$@的值:1 2 3 4 5 6 7 8 9
$#的值(参数个数):9
$?的值:0
$$的值(当前进程PID):3306
$!的值(后台进程最后一个进程的PID):
5.4 三个常用的指令
5.4.1 read
在这之前,变量的值都是直接被指定的。而read命令,可以让变量接收键盘录入的数据。这就好比Java语言的Scanner类型,可以开启键盘录入功能。read功能常用与shell script中。
格式: read [选项] variable
选项解析:
-p:用于指定提示信息
-n:规定录入字符串长度,达到此长度,自动结束
-t :对录入进行时间限制,单位是秒
-s:隐藏输入的数据
[root@xxx01 ~]# read -p "请输入用户名:" user
请输入用户名:gaoyuanyuan
[root@xxx01 ~]# echo $user
gaoyuanyuan
[root@xxx01 ~]# read -p "请输入用户名:" -n 8 user #达到8个长度,自动结束
请输入用户名:gaoyuany
[root@xxx01 ~]# echo $user
gaoyuany
[root@xxx01 ~]# read -p "请输入用户名:" -n 8 -t 5 user #超过5秒自动结束,但是变量没有值
请输入用户名:aaa
[root@xxx01 ~]# echo $user
[root@xxx01 ~]# read -p "请输入密码:" -n 8 -s password
请输入密码: <---- 不显示输入的内容
[root@xxx01 ~]# echo $password
123123
5.4.2 expr指令
这个命令可以对整数表达式进行运算。注意,运算符前后必须要有空格符
[root@xxx01 ~]# expr 1 + 2
3
[root@xxx01 ~]# result=`expr 1 + 2`
[root@xxx01 ~]# echo $result
3
[root@xxx01 ~]# result=$(expr 1 + 2)
[root@xxx01 ~]# echo $result
3
[root@xxx01 ~]# expr 1 + `expr 2 + 3` # 嵌套一层expr
6
[root@xxx01 ~]# expr 2 \* 3 # 乘法运算,*需要转义字符
6
[root@xxx01 ~]# n=3
[root@xxx01 ~]# m=2
[root@xxx01 ~]# result=`expr 1 + \`expr $n + $m\`` #反单引号里的反单引号需要转义
[root@xxx01 ~]# echo $result
6
5.4.3 test指令
- 通常test命令不单独使用,而是与if语句连用,或者是放在循环结构中。
- 判断符号[]
除了好用的test外,我们还可以使用中括号来进行检测条件是否成立。
5.5 shell的字符串类型
5.5.1 字符串的基本用法
- 字符串不能单独,必须要配合变量。
- 字符串可以使用单引号,也可以使用双引号,也可以不用引号
- 单引号内的任何字符没有任何意义,都会原样输出, echo 'hello $name world'
- 单引号内使用变量是无效的,单引号内不能出现单引号
- 双引号内可以使用变量 echo "hello $name world"
- 双引号内可以使用转义字符 echo -e "hello\\nworld"
- 在字符串拼接操作时,我们可以进行无缝拼接,或者是在双引号里使用变量
echo "第一个位置参数是"$1
echo "第一个位置参数是$1"
5.5.2 字符串的长度
可以使用
${#variable}
或者
expr length "${variable}"。
如果给其他变量赋值,注意expr 应该使用反单引号或者$()
直接看案例:
[root@xxx01 ~]# name=gaoyuanyuan
[root@xxx01 ~]# echo ${#name}
11
[root@xxx01 ~]# expr length ${name}
11
[root@xxx01 ~]# expr length "${name}"
11
[root@xxx01 ~]# len=`expr length ${name}`
[root@xxx01 ~]# echo $len
11
5.5.3 子字符串的截取
${variable:startIndex} : 从startIndex下标开始,截取到最后
${variable:startIndex:length} : 从startIndex下标开始,截取length个长度
${variable:0-num} : 倒数第num个开始,截取到最后
${variable:0-num:length} : 倒数第num个开始,截取length个长度
5.6 shell的数组类型
5.6.1 Array的使用规则
- 在/bin/bash这个shell中,只有一维数组的概念,并且不限定数组的长度。
- 数组的元素下标是从0开始的,
- 获取数组的元素要使用下标
- 下标使用不当,会报错
5.6.2 Array的定义
定义格式: variable=(值1 值2 … 值n)
注意:元素之间除了使用空格作为分隔符,还可以使用换行符。
name[0]=值1
name[1]=值2
…
name[n]=值n
5.6.3 读取数组
${variable[index]}: 读取index索引上的元素
${variable[*]}或者${variable[@]}:读取所有元素
${#variable[*]}或者${#variable[@]} : 读取数组的长度
[michael@master ~]$ vim bin/test5.sh
#!/bin/bash
name=(gaoyuanyuan liuyifei zhangjunning)
address=(changchun #分隔符为换行
beijing
shanghai
shenzhen)
hobby[0]='eat'
hobby[1]='sleep'
hobby[3]='play'
echo ${name[0]}
echo ${address[*]}
echo ${address[@]}
echo ${#address[*]}
echo ${#hobby[@]}
[michael@master ~]$ bash bin/test5.sh
gaoyuanyuan
changchun beijing shanghai shenzhen
changchun beijing shanghai shenzhen
4
3
下标的应用
[root@xxx01 ~]# names=(1 2 3) #定义三个长度的数组
[root@xxx01 ~]# echo ${names[0]}
1
[root@xxx01 ~]# echo ${names[1]}
2
[root@xxx01 ~]# echo ${names[2]}
3
[root@xxx01 ~]# echo ${names[3]} #打印第四个元素,数组中没有第四个,不会报错
[root@xxx01 ~]# echo ${names[-1]} #打印数组中的倒数第一个元素
3
[root@xxx01 ~]# echo ${names[-2]}
2
[root@xxx01 ~]# echo ${names[-3]}
1
[root@xxx01 ~]# echo ${names[-4]} # 打印数组中的倒数第四个元素,不存在,则报错
bash: names: 坏的数组下标
(>_< 周末啦~~~~,小白今天又学了满满一箩筐的东西,不是很好消化,等着周末好好整理下,顺带一提的小白今天中午园了个自个小时候的梦,过几天东西就到了,到时候有机会的话可以给大家展示一下,好了今儿个就这样!祝大家明天过后有个愉快的周末~~~)