Java基础-初级

前言

日期:2020-04-21

  1. 初始内容:大多内容摘自GitHub上开源项目《JavaGuide》,原文链接:https://github.com/Snailclimb/JavaGuide 。图片来源博客等,如侵删。

日期:2020-05-17

  • 补充及完善部分内容

Java网络

1. 协议

五层网络体系结构

1.1 应用层

  • 任务:应用进程间的通信和交互的规则。

  • 报文:应用层交互的数据单元

  • 协议

    • 域名系统DNS:域名与IP地址映射
    • HTTP协议:支持万维网应用
    • SMTP协议:支持邮件

1.2 运输层

  • 任务:向两台主机进程间的通盈提供通用的数据传输服务。应用进程利用该服务传送应用层报文
  • 协议
    • 传输控制协议TCP:提供面向连接的,可靠的数据传输服务【打电话】
    • 用户数据协议UDP:提供无连接的,尽力但不保证可靠性的数据传输服务【寄信】

1.3 网络层

  • 任务:选择合适的网间路由和交换节点,确保数据及时传送
  • 协议
    • IP协议

1.4 数据链路层

  • 任务:在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据组装成帧,在两个相邻节点间的链路上传送帧。

1.5 物理层

  • 任务:实现相邻计算机节点之间比特流的透明传送,传送的数据单位是比特。

2. 三次握手和四次挥手

2.1 三次握手

  • 目的:建立连接,确认客户端和服务端正常收发数据
  • 过程
    1. 客户端:喂喂喂?听得到我的声音吗?
    2. 服务端:在在在,听得到你的声音。你听得到我的声音吗?
    3. 客户端:听得到,听得到。

2.2 四次挥手

  • 目的:断开两个方向的连接。
  • 过程
    1. 客户端:诶,我宣布要与你绝交!我已经不想跟你说话了,你还有什么话说吗?
    2. 服务端:好啊,我同意了,你和我绝交了!不过我还有几句话要说,你稍等。
    3. 服务端:(好气啊),那谁,我要说的是,我也要与你绝交了!我的话说完了。
    4. 客户端:哼,我也同意了,我们绝交了!再见!

3. TCP、UDP协议的区别

  • 连接方式
    • UDP 无连接
    • TCP是面向连接
  • 应用
    • UDP:QQ语音、QQ视频(大量数据)
    • TCP:文件传输、远程登录(少量数据)

4. TCP协议如何保证可靠传输

  • 应用数据分割
  • 发送包编号
  • 接收端丢弃重复数据
  • 流量控制
  • 拥塞控制
  • ARQ协议
  • 超时重传

5. Cookie和Session

  • 相同:跟踪浏览器用户身份的会话方式
  • 差异
    • Cookie一般用来保存用户信息:用户信息;Session服务端记录用户的状态:购物车
    • Cookis保存在客户端(浏览器);Session保存在服务端

6. SSL和TLS

6.1 概念

  • SSL:Secure Socket Layer 安全套接层
  • TLS:Transport Layer Security 传输层安全协议,位于HTTP和HTTPS之间的协议。SSL升级
  • HTTP:Hyper Text Transport Protocol 超文本传输协议
  • HTTPS: xx Secure 超文本安全传输协议。利用HTTP通信,用TLS保证安全。 = HTTP + TLS

更多可参考:点击传送


Java并发

  • 含义:同一时间段,多个任务都在进行
  • 状态:指定时刻只可能处于其中一个状态
    • NEW
      • RUNNABLE
      • BLOCKED
      • WAITING
      • TIME_WAITING
      • TERMINATED
  1. 进程:系统运行程序的基本单位,系统进行资源分配和调度的一个独立单位。
  2. 线程:进程的一个实体,比进程更小的执行单位,CPU调度和分派的基本单位。
  • 关系

    • 一个线程可以创建和撤销另一个线程
    • 同一个进程中的多个线程之间可以并发执行
    • 同一进程中的多个线程可以共享数据,但拥有自己的栈空间,拥有独立的执行序列
  • 区别

    • 进程有独立的地址空间,线程之间没有单独的地址空间
  • 优缺点

    • 线程执行开销小,但不利于资源的管理和保护;而进程正相反
    • 线程适合于在 SMP(Symmetrical Multi-Processing)机器上运行,而进程则可以跨机器迁移。
  1. 同步

    • 两个同步任务相互依赖,并且一个任务必须以依赖于另一任务的某种方式执行
    • 多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 。(车票 的购买)
  2. 异步

    • 两个异步的任务完全独立的,一方的执行不需要等待另外一方的执行
    • 访问资源时在空闲等待时同时访问其他资源,实现多线程机制。(多个文件的下载)

线程

  • 线程安全:点击传送

    • 原因:在多个线程并发环境下,多个线程共同访问同一共享内存资源时,其中一个线程对资源进行写操作的中途(写⼊入已经开始,但还没结束),其他线程对这个写了一半的资源进⾏了读操作,或者对这个写了一半的资源进⾏了写操作,导致此资源出现数据错误
    • 方法
      • 保证共享资源在同一时间只能由一个线程进行操作(原子性,有序性
      • 将线程操作的结果及时刷新,保证其他线程可以立即获取到修改后的最新数据(可见性)
  • 线程死锁:多个线程同时被阻塞

    • 具备条件:互斥、请求与保持条件、不剥夺条件、循环等待条件

      互斥:一个资源每次只能被一个进程使用
      请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放
      不剥夺:进程已获得的资源,在末使用完之前,不能强行剥夺
      循环等待:若干进程之间形成一种头尾相接的循环等待资源关系

    • 例子

      两个人A、B各持有一个密码箱a、b,箱子里保存了对方的身份证,现在A、B两个人要拿回自己的身份证,A向B请求拿钥匙开b;B向A请求拿钥匙开a,但双方都怕对方先拿钥匙后反悔,不给自己钥匙,于是便僵持着。

  • 解决线程安全

    • synchronized:被修饰的方法或代码块,在任意时刻只能有一个线程执行(原子性、可见性、有序性)
    • volatile:到主内存中读取变量值(保证变量可见性)、防止指令重排序(可见性、有序性)可见性
    • final:常量,不可变,因而是可见的(可见性)
    • 更多内容可参考该博客:点击传送
    • 读写锁思想:读读共享、写写互斥、读写互斥、写读互斥

    • 进一步优化:CopyOnWriteArrayList

    • Runnable 接口:不会返回结果或抛出异常

    • Callable接口:无法计算结果时,抛出异常

线程池:线程集合的集中管理容器。池化技术的运用

  • 目的:减少资源消耗,提高资源利用率

  • 使用:推荐使用ThreadPoolExecutor方式

  • 调用流程:流程走向

  • Executor框架:包括了线程池的管理、线程工厂、队列、拒绝策略

    • 使用: 流程

乐观锁和悲观锁

  • 概念:线程同步机制
  • 作用:保证线程安全,解决并发操作产生的数据问题

乐观锁与悲观锁并不是特指某个锁,而是在并发情况下保证数据完整性的不同策略。悲观锁指的就是我们平常使用的加锁机制,它假设我们总是处于最坏的情况下,如果不加锁数据完整性就会被破坏。而乐观锁指是一种基于冲突检测的方法,检测到冲突时操作就会失败。

  1. 悲观锁:总是假设最坏的情况,拿数据都上锁。synchronized

    • 实现:行、表、读、写锁(传统数据库)
    • 场景:多写
  2. 乐观锁:最好的情况,只在更新的时候判断。

    • 场景:多读

    • 实现方式:

      • 版本号机制:数据库version标识,提交版本必须大于记录版本
      • CAS算法:无锁,非阻塞
    • 缺点:

      • ABA问题
      • 循环时间长、开销大
      • 只能保证一个共享变量的原子操作

AQS(AbstractQueuedSynchronizer):抽象队列同步器

  • 作用:构建锁和同步器
  • 原理:被请求的共享资源空闲,则将当前请求资源的线程设为有效的工作线程,并且将共享资源设置为锁定状态;共享资源被占用,则将线程加入队列,阻塞等待被唤醒。
  • 资源的共享资源方式
    1. Exclusive(独占)
      • 公平锁
      • 非公平锁:两次CAS抢锁
    2. Share(共享)
    3. Semaphore(信号量):允许多个线程同时访问
      • 公平模式
      • 非公平模式:抢占式
    4. CountDownLatch(倒计时器)
    5. CycliBarrier(循环栅栏)
    6. ReentrantLock

JVM

  1. 基础

    • 运行时内存数据区域:
      运行时数据区域

    • 线程私有的:

      • 程序计数器
      • 虚拟机栈
      • 本地方法栈
    • 线程共享的:

      • 直接内存
        • 元空间
      • 方法区
        • 运行时常量池
      1
      2
      String str = "abc";  // 常量池
      String str = new String("abc"); // 堆中新建对象
      • 尽量避免多个字符串拼接,否则使用StringBuilder
  • 八种基本类型的包装类和常量池
    • 常量池:Byte,Short,Integer,Long,Character,Boolean
    • 非..:Float、Double
  1. 垃圾回收

    待补充

I/O(数据通信的输入输出)

  1. 基础
  • 同步:发起一个调用后,被调用者未处理完前,调用不返回

  • 异步:发起请求后,立刻得到被调用者的回应,但被调者并没有返回结果,此时我们可以处理其他的请求。被调用者通常通过事件、回调等机制通知调用者其返回结果。

  • 阻塞:发起一个请求,调用者一直等待请求结果返回。当前线程被挂起。

  • 非阻塞:发起请求,不用等待结果返回。可以先做其他操作。

    同步/异步是从行为角度描述事物的,而阻塞和非阻塞描述的当前事物的状态(等待调用结果时的状态)。

​ > 例子:一条水流,在某个地方被一块挡板拦截起来。此时如果是同步,则水流卡住,无法前进;若是异步,则水流一部分卡住,一部分继续绕过挡板前进;若是阻塞,则表示当前水流一直卡着;若是非阻塞,则表示水流继续前进

  1. BIO(Blocking):同步阻塞
  1. NIO(New):同步非阻塞
  • SocketChannel、ServerSocketChannel 套接字通道,支持阻塞、非阻塞

  • 低负载、低并发:使用同步阻塞

  • 高负载、高并发:使用同步非阻塞

  • 核心组件

    • Channel(通道)

    • Buffer(缓冲区)

    • Selector(选择器)

  1. AIO(Asynchronous I/O):异步非阻塞
  1. I/O

    1. i/o流分类:

      • 按流向:输入流、输出流

      • 按操作单元:字节流、字符流

    2. 按流的角色:节点流、处理流

      • 4个抽象类

        • InputStream:字节输入流—输入流的基类
        • Reader:字符输入流—输入流的基类

        • OutputStream:字节输出流—输出流的基类

        • Writer:字符输出流—输出流的基类

Java8

1. 特性

  • 接口默认方法(虚拟扩展方法):可以使用default关键字添加非抽象方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface Formula{
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
// TODO 通过匿名内部类方式访问接口
Formula formula = new Formula() {
@Override
public double calculate(int a) {
return sqrt(a * 100);
}
};

System.out.println(formula.calculate(100)); // 100.0
System.out.println(formula.sqrt(16)); // 4.0

1.1 Lambda表达式

  • 作用:避免使用庞大的匿名类实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// java7匿名内部类写法
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});

// java8 lambda表达式
Collections.sort(names,(String a, String b)->{
return b.compareTo(a);
});

// 更简洁方式
Collections.sort(names,(a, b)->b.compareTo(a));
  • FunctionalInterface(函数式接口)
    • 含义:仅仅只包含一个抽象方法,但可以有多个非抽象方法的接口。加注解编译器会自动识别
      • Method and Constructor References(方法和构造函数引用)
      • 关键字::
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Person 
class Person {
String firstName;
String lastName;

Person() {}

Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}

// factory
interface PersonFactory<P extends Person> {
P create(String firstName, String lastName);
}

// use :: to construct
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
  • Lambda Scopes(表达式作用域)
    • 访问局部变量:只读
    • 访问字段(类属性)和静态变量:读写
    • 访问默认接口方法:不可
  • Built-in Function Interface(内置函数式接口)

  • Predicates

    • Functions
  • Suppliers

    • Consumers
    • Comparators
  • Date API(日期相关)

2. forEach

1
2
3
4
5
6
7
8
9
10
11
// forEach
names.forEach(name->{
sout(name);
});

// Lambda表达式
names.forEach(name->System.out.println(name));
// ::关键字 遍历List
names.forEach(System.out::println);
// 遍历Map
names.forEach((key,value) -> System.out.println(key + ' '+ value));

数据结构

一、布隆过滤器

1.基础信息

  • 概念:二进制向量(位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。

  • 原理:

二、Queue队列

1.基础信息

  • 概念:FIFO
  • 种类:单队列、循环队列
  • 集合:集合中的Queue继承自Collection接口

三、Set

1. 基础信息

  • 概念:不允许出现重复元素,并且无序的集合

  • 集合

    • HashSet:哈希表
    • TreeSet:红黑树

四、List

1. 基础信息

  • 集合
    • ArrayList:数组
    • LinkedList:双向链表
    • Vector:矢量队列
    • Stack:栈

五、Map

待补充

六、Tree

待补充

七、图

待补充


算法


Spring

一、常见问题

1. 基础信息

  • 描述:轻量级开发框架,旨在提高开发效率及系统的可维护性。

  • 模块:核心容器、数据访问/集成、Web、AOP、工具、消息、测试模块

  • 特征

    • 核心技术:DI、AOP、events、资源…
    • 数据访问

2. RestController vs Controller

  • 返回

    • Controller 返回一个页面(不加@ResponseBody)

    • RestController 返回对象:JSON或XML数据,对象数据直接写入HTTP响应,属于RESTful Web服务(前后端分离)

3. Spring IoC & AOP

  • IoC:Inverse of Control ,控制反转。依赖倒置原则

    • 一种设计思想,将原本在程序中手动创建对象的控制权交由Spring框架来管理。IoC容器是Spring用来实现IOC的载体,Map结构。
    • 类似工厂,当需要创建一个对象时,只需配置好配置文件/注解即可
    • 实现方式:依赖注入
  • AOP:Aspect Oriented Programming,面向切面编程。

    • 将与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低耦合度,提高可拓展性和可维护性。
    • 基于动态代理
  • DI:Dependency Injection,依赖注入

    • 依赖注入就是将实例变量传入到一个对象中去
  • JNDI:Java Naming and Directory Interface,Java命名和目录接口)

    • SUN公司提供的一种标准的Java命名系统接口
    • JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。

4. Spring事务管理

5. Spring单例与线程安全

  • @Component和@Bean
    • @Component 作用于类,@Bean作用于方法
  • 将一个类声明为Spring的bean的注解
    • @Component:通用
    • @Repository:持久层,DAO
    • @Service:服务层
    • @Controller:Spring MVC控制层

6. Spring MVC

  1. Model1时代:JSP为主体
  2. Model2时代:Java Bean(Model)+JSP(View)+Servlet(Controller)–JavaWeb MVC
  3. Spring MVC:对客户端的请求通过后端分层调用方式,将视图数据返回客户端
    1. 浏览器发送请求到后端DispatcherServlet,由Servlet找到对应的Handler类(控制层)
    2. Handler类调用处理器处理相应逻辑,返回ModelAndView(模型视图对象)
    3. ViewResolver(视图解析器)找到View,DisapterServlet将Model传给View,并返回给浏览器进行渲染

MySQL

一、基础

1. 存储引擎

  • 常用命令

    1
    2
    3
    4
    5
    6
    7
    8
    -- 显示所有存储引擎
    mysql> show engines;

    -- 查看默认的存储引擎
    mysql> show variables like '%stroage_engine%';

    -- 查看表的存储引擎
    mysql> show table status like 'table_name';
  • MyISAM

    • 说明:5.5版本前默认引擎
    • 利弊:性能好、提供大量特性(全文索引….);不支持事务和行级锁、崩溃后无法恢复
  • InnoDB

    • 说明:.5后默认引擎

    • 利弊:支持行级锁(默认)和表级锁、支持事务和崩溃后的安全恢复、支持外键和MVVC

2. 字符集和校对规则

3. 索引

4. 事务

  • 含义:逻辑上的一组操作
  • 特性
    • 原子性
      • 含义:最小的执行单位,不允许分割
      • 作用:确保动作要么都完成,要么都失败
    • 一致性
      • 含义:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的
    • 隔离性
    • 持久性

Linux&Shell

一、Linux

1. 操作系统

  • 概念:管理计算机硬件与软件资源的程序,是计算机系统的内核与基石
  • 分类
    • Window
    • Unix
    • Linux:类Unix,有许多版本

2. Linux文件系统

  • 简介:所有被操作系统管理的资源,都是文件。如:网路接口卡、磁盘驱动器、打印机、目录。
  • 文件类型与目录结构
    • 文件类型
    • 常用目录
      • /bin
      • /home
      • /opt
2.1 基本命令
  • mkdir 目录名称:创建目录

  • find 目录 参数:寻找目录

    • find . :列出当前目录及子目录下所有文件及文件夹
  • mv 目录名称 新目录名称:重命名

  • rm [-rf] 目录:删除目录

  • touch 文件名称:文件的创建

  • cat/more/less/tail 文件名称:文件的查看

    • cat :查看显示文件的内容
    • more :可以显示百分比
    • tail -10:查看文件的后10行
      • tail –f filename:命令从指定点开始将文件写到标准输出
  • vim 文件:修改文件的内容

    • :w :保存
    • :wq :保存并退出
    • :q :在文件未作任何修改的情况下退出
    • :q! : 强制退出,不保存
  • tar/gz :打包和压缩

    • tar -zcvf 打包压缩后的文件名 要打包压缩的文件 :例如test目录下有三个文件 a.txt、b.txt、c.txt ,要打包test目录并指定压缩后的压缩包名称为test.tar.gz ,可以使用命令 tar -zcvf test.tar.gz a.txt b.txt c.txt

    • tar -xvf 压缩文件:解压缩

  • sudo 其他命令:以系统管理者的身份执行命令

  • grep 要搜索的字符串 要搜索的文件 –color:搜索命令,–color高亮

  • ps -ef / ps -aux :查看系统正在运行的进程

    • ps aux|grep redis:查看包括redis字符串的进程
    • pgrep redis -a : 同上
  • ifconfig :查看当前系统的网卡信息

  • netstat -an :查看当前系统的端口使用

  • shutdown :关闭

    • shutdown -h now:关机
  • reboot:重开机

2.2 常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 拷贝目录下的文件,不拷贝文件夹
cp -r 源目录/* 指定目录

# 通过ssh从远程服务器拷贝文件到本地(得在本地环境) 源文件 目标文件夹
scp dataexa@192.168.1.137:/home/dataexa/insight-microservice/common-eureka/dataexa-common-eureka-5.0.0-SNAPSHOT.jar /home/dataexa/

# 授予权限
chmod 777 ./xxx
# 设置可执行权限
chmod +x yy.sh

# 查看当前文件加的文件个数,不包括子文件夹
ls -l |grep "^-"|wc -l

# 查看进程
ps aux|grep xxx

# 执行远程服务器的地址,配置免密后
# ssh serverName/serverIp /xxx/xx.sh parameters
ssh dataexa@192.168.4.41 /home/dataexa/test.sh "$host"

# 查找目录 -maxdepth表示搜索深度。-type表示搜索类型
find / -maxdepth 1 -type d -name 'test_dictionary'
find /(查找范围) -name '查找关键字' -type d
# 查找文件
find /(查找范围) -name 查找关键字 -print

# 列出当前系统打开文件的工具
# 列出所有的网络连接
lsof -i
# 列出谁在使用某个端口
lsof -i :3306

# 后台启动Jar包,并且输出日志到指定文件
nohup java -jar $common_eureka >/code/log.txt 2>&1 &

# $2:表示第二个字段
# print $2 : 打印第二个字段
awk '{print $2}' $fileName # 一行一行的读取指定的文件, 以空格作为分隔符,打印第二个字段

# -n Number 从 Number 行位置读取指定文件
tail -n 1 # 倒叙读,仅读一行
tail -n +2 # 正序读,从第2行开始读全部

二、Shell

1. 基础

  • 概念:命令解释器,解释和执行用户输入的命令和程序。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # Hello World

    # 1.新建文件

    touch test.sh

    # 2.赋予执行权限

    chmod +x test.sh

    # 3.修改文件

    vim test.sh

    #!/bin/bash --执行shell类型
    #第一个shell小程序,echo是输出
    echo "hello world!"

    # 4.运行脚本
    ./test.sh

2. 变量

  • 自定义变量(局部):$variable_name

  • 环境变量:PATH、

  • Shell变量

2.1使用自定义变量

#!/bin/bash
hello = “hello world”
echo $hello
echo “hello world”

2.2使用字符串 ,单引号、双引号皆可

name = ‘Mango’
hello = ‘Hello,I am ‘$name’’
echo $hello

1字符串拼接:并排即可连接
#!/bin/bash  shell脚本标记
   name="Shell"
    url="http://c.biancheng.net/shell/"

    str1=$name$url  #中间不能有空格
    str2="$name $url"  #如果被双引号包围,那么中间可以有空格
    str3=$name": "$url  #中间可以出现别的字符串
    str4="$name: $url"  #这样写也可以
    str5="${name}Script: ${url}index.html"  #这个时候需要给变量名加上大括号

    echo $str1
    echo $str2
    echo $str3
    echo $str4
    echo $str5
2获取字符串长度:length/#
name = 'Snall'
echo ${#name}
expr length '$name';
2.3使用数组
#!/bin/bash
array=(1 2 3 4 5);
# 获取数组长度
length=${#array[@]}
# 或者
length2=${#array[*]}
#输出数组长度
echo $length #输出:5
echo $length2 #输出:5
# 输出数组第三个元素
echo ${array[2]} #输出:3
unset array[1]# 删除下标为1的元素也就是删除第二个元素
for i in ${array[@]};do echo $i ;done # 遍历数组,输出: 1 3 4 5 
unset arr_number; # 删除数组中的所有元素
for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没有任何输出内容
  • 基本运算符
  1. 算数运算符

    1
    2
    3
    4
    5
    6
    # 1.加法
    #!/bin/bash
    a=3;b=3;
    val=`expr $a + $b`
    #输出:Total value : 6
    echo "Total value : $val"
  2. 关系运算符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    score=90;
    maxscore=100;
    if [ $score -eq $maxscore ]
    then
    echo "A"
    else
    echo "B"
    fi
  3. 布尔运算符

    1
    2
    3
    4
    #!/bin/bash
    a=$(( 1 && 0))
    # 输出:0;逻辑与运算只有相与的两边都是1,与的结果才是1;否则与的结果是0
    echo $a;
  4. 字符串运算符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    a="abc";
    b="efg";
    if [ $a = $b ]
    then
    echo "a 等于 b"
    else
    echo "a 不等于 b"
    fi
  5. 文件测试运算符

    定义好了一个文件路径file=”/usr/learnshell/test.sh” 如果我们想判断这个文件是否可读,可以这样if [ -r $file ] 如果想判断这个文件是否可写,可以这样-w $file

3.流程控制

  1. if条件语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    if [ 表达式 ]; then
    指令
    else
    指令二

    fi


    #####示例#####

    #!/bin/bash
    a=3;
    b=9;
    if [ $a -eq $b ]
    then
    echo "a 等于 b"
    elif [ $a -gt $b ]
    then
    echo "a 大于 b"
    else
    echo "a 小于 b"
    fi
  1. for循环

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 输出列表数据
    for loop in 1 2 3 4 5
    do
    echo "The value is: $loop"
    done

    # 产生10个随机数
    for i in {0..9};
    do
    echo $RANDOM;
    done

    # 输出1-5
    for((i=1;i<=5;i++));do
    echo $i;
    done;
  1. while

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    int=1
    while(( $int<=5 ))
    do
    echo $int
    let "int++"
    done

4.函数

  1. 无参、无返回值

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    hello(){
    echo "这是我的第一个 shell 函数!"
    }
    echo "-----函数开始执行-----"
    hello
    echo "-----函数执行完毕-----"
  1. 有返回值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
    funWithReturn(){
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
    }
    funWithReturn
    echo "输入的两个数字之和为 $?"
  1. 有参

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
    funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
    }
    funWithParam 1 2 3 4 5 6 7 8 9 34 73

5.ssh

  • 概念:加密的网络传输协议。一般用来连接远程服务器。
  • 命令:(如果操作到是文件夹 则需要 加上 -r 参数, 使用递归上传或者下载。)
    • 本地文件上传至服务器
      • scp path/filename userName@sseverName:path
    • 服务器下载
      • scp userName@sseverName:path path/filename
------ 本文结束感谢您的阅读 ------

本文标题:Java基础-初级

文章作者:MangoCheng

发布时间:2020年04月21日 - 09:23:12

最后更新:2020年10月17日 - 21:20:06

原始链接:http://mangocheng.com/posts/1bef9400.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。