目录

一. 免密登录认证

1.1 准备工作

1.1.1 现在机器A上生成秘钥

1.1.2 将机器A的公钥信息,拷贝到机器B的相关用户的家里的隐藏目录.ssh下的authoried_keys里

1.2 免密登录认证的原理流程

1.3 准备工作的简化

二.定时器crontab

2.1 crontab的简介

2.2 cron服务

2.3 cron的配置文件位置

2.4 crontab命令格式

2.5 定时器的格式

2.6 常用案例演示

三.时间同步服务器的搭建

3.1 时间同步

3.2 如何同步时间

3.3 搭建局域网时间服务器

四.YUM源的更换

4.1 网络yum源的更换

4.2 本地yum源的搭建

4.3 局域网yum源的搭建

五.LINUX的Shell脚本编程

5.1 shell的简介

5.2 shell脚本的编程规范

5.3 shell脚本的变量

5.3.1 变量的应用规范

5.3.2 变量的分类

5.4 三个常用的指令

5.4.1 read

5.4.2 expr指令

5.4.3 test指令

5.5 shell的字符串类型

5.5.1 字符串的基本用法

5.5.2 字符串的长度

5.5.3 子字符串的截取

5.6 shell的数组类型

5.6.1 Array的使用规则

5.6.2 Array的定义

5.6.3 读取数组


一. 免密登录认证

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/issue45 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.sh45 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.sh0,30 18-23 * * * /apps/bin/dbcheck.sh
9.每星期六的 11:00 pm运行/apps/bin目录下的qtrend.sh0 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/cdrom2.创建挂载目录/mnt/dvd
[root@scott ~]# mkdir /mnt/dvd3.将映像文件挂载到/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 all7.查询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/bashNAME=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/bashecho $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/bashecho '$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 "第一个位置参数是"$1echo "第一个位置参数是$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: 坏的数组下标

(>_< 周末啦~~~~,小白今天又学了满满一箩筐的东西,不是很好消化,等着周末好好整理下,顺带一提的小白今天中午园了个自个小时候的梦,过几天东西就到了,到时候有机会的话可以给大家展示一下,好了今儿个就这样!祝大家明天过后有个愉快的周末~~~)

2021-12-02 迈向程序猿的第四十一步相关推荐

  1. 2021-12-18 迈向程序猿的第四十七步

    目录 一.Mapreduce基础 1.1 为什么要学习MapReduce 1.2 MapReduce简介 1.3 MapReduce优缺点 1.3.1 优点 1.3.2 缺点 1.4 MapReduc ...

  2. 2021-12-06 迈向程序猿的第四十三步

    目录 一.伪分布式的搭建 1.1 伪分布式模式介绍 1.2 平台软件说明 1.3 伪分布式环境搭建需求 1.3.1 环境需求 1.3.2 防火墙关闭确认 1.3.3 配置映射 1.3.4 确保ssh对 ...

  3. 2021-12-29 迈向程序猿的第五十七步

    目录 一.Nginx的简介以及应用场景 1.1 简介 1.2 应用场景的应用 二.Nginx的安装和常用命令介绍 2.1 Nginx的安装 2.2 常用命令的介绍 2.3 配置文件的介绍 三.Ngin ...

  4. Java学习日报—注解、Hash、Lombok—2021/12/02

    目录 1 相关注解 1.1 @Controller 和 @RestController 1.2 @ApiIgnore 1.3 @PostMapping 2 Java知识点 2.1 instanceof ...

  5. 2021-10-13 迈向程序猿的第五步

    目录 一.循环 1.1 while循环 1.2 dowhile循环 1.3 for循环 二.while , dowhile , for 的区别 三.死循环 3.1 死循环 3.2 循环控制 四.循环嵌 ...

  6. 2021 12 23 的程序

    #include<stdio.h> int main() {     int arr[] = {1,2,3,4,5,6,7,8,9,10};     int k = 7;     int ...

  7. 嫁人就嫁程序猿——钱多话少死的早!很励志。。。

    01 程序猿问科比:"你为什么这么成功? " 科比:"你知道洛杉矶凌晨四点是什么样子吗? " 程序猿:"知道,一般那个时候我还在写代码,怎么了?&qu ...

  8. 程序猿|上班累了么?点进来,开心一夏!

    1.十行代码九个警告八个错误竟然敢说七日精通六天学会五湖四海也不见如此三心二意之项目经理简直一等下流. 2.世界上最遥远的距离不是生与死,而是你亲手制造的BUG就在你眼前,你却怎么都找不到她. 3.& ...

  9. 内涵!!!程序猿才懂的动图...

    bug多了,总有一个把你坑了 产品经理跟程序员提需求时 线上运行时出现bug 自动化一切,避免手动出错 只要功夫深,EJB也可以写Hello World 咱们做项目,没有高质量的IDE工具可不行 线上 ...

最新文章

  1. Java 8 一行代码解决了空指针问题,太厉害了...
  2. zatree插件优化:优化左侧边栏
  3. 缓冲区溢出以及缓冲区溢出攻击
  4. JavaScript在发送ajax请求时,URL域名地址是使用绝对地址还是相对地址?什么是浏览器跨域访问操作,js如何实现?
  5. python判断语句_python条件判断语句if elif else使用
  6. jQuery解决高度统一问题
  7. 执行力:Just Do It
  8. 日常问题——flume连接hive时报错Caused by: java.lang.NoSuchMethodError
  9. 微软开源可解释机器学习框架InterpretML
  10. git 2015-5-26
  11. 实例化新的Android片段的最佳做法
  12. 留言板分页php,php留言板代码[经典的分页代码](1/4)
  13. “撤县设市”の利与弊
  14. LeetCode-717. 1比特与2比特字符
  15. 发那科sub_FANUC PMC功能指令之计数器 CTR SUB5-共享屋共享屋
  16. linux vi文件提示swp,如何解决非正常关闭vi编辑器时生成.swp文件问题
  17. iOS 打开AppStore指定app下载页
  18. CSMA/CA基本原理
  19. VS2017系统找不到指定的文件
  20. verify_area

热门文章

  1. CoffeeScript里的or
  2. 第一次接触智能家居,该从哪里入手?智汀告诉你
  3. 【学习日记】手写数字识别及神经网络基本模型
  4. 010 Rust死灵书之Drop检查
  5. 2023年全国最新会计专业技术资格精选真题及答案52
  6. Flickr公布2016最受欢迎照片
  7. ​Wolfram Alpha Notebook Edition无需编程,立即上手做复杂计算!
  8. HANA 与 Oracle 12c哪一个更快
  9. 《勇士传说》横版卷轴动作类游戏笔记-3.场景绘制和叠层设置
  10. PAT题解——Basic Level——1015 德才论