Fork me on GitHub
行锋

低头走路,抬头思考


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

  • 搜索

CentOS安装设置

发表于 2018-12-19 | 分类于 环境搭建

设置网络自动启动

  • 安装系统的时候设置网络自动启动(最简单)
  • 打开 vi /etc/sysconfig/network-scripts/ifcfg-eth0(每个机子都可能不一样,但格式会是“ifcfg-eth数字”),把ONBOOT=no,改为ONBOOT=yes,重启网络:service network restart

更新阿里云yum源

  • 启用源下载wget
    cd /etc/yum.repos.d/
    sudo vi CentOS-Base.repo;修改文件内容中enable从0改为1
    yum install wget
  • 下载repo文件
    wget http://mirrors.aliyun.com/repo/Centos-7.repo
  • 备份并替换系统的repo文件
    cp Centos-7.repo /etc/yum.repos.d/
    cd /etc/yum.repos.d/
    mv CentOS-Base.repo CentOS-Base.repo.bak
    mv Centos-7.repo CentOS-Base.repo (区分大小写)
  • 执行yum源更新命令
    yum clean all
    yum makecache
    yum update

安装图形界面

  • sudo yum groupinstall “GNOME Desktop” “Graphical Administration Tools”
  • 更新系统的运行级别,以便下次直接进入图形界面:udo ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target

Ubuntu系统安装后的设置

发表于 2018-12-19 | 分类于 环境搭建

修改默认源为国内源

  1. cd /etc/apt
  2. cp /etc/apt/sources.list /etc/apt/sources.list.bak 备份/etc/apt/sources.list
  3. 在/etc/apt/sources.list文件前面添加源条目,具体源条目可百度,如阿里源:
1
2
3
4
5
6
7
8
9
10
11
#添加阿里源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
  1. 更新源
1
2
sudo apt-get update
sudo apt-get upgrade

系统分辨率设置

安装Ubuntu系统后分辨率为800*600且无法修改,通过以下方式修改:

  1. 首先打开终端Terminal,输入: sudo apt-get install xdiagnose
  2. sudo xdiagnose 启动【X 诊断工具设置】,点击【Apply】
  3. sudo reboot 重启系统
  4. 再次打开设置发现分辨率可以设置了,如设置为:1280*800

chrome浏览器安装

  • wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
  • sudo dpkg -i google-chrome-stable_current_amd64.deb

JetBrains系列软件安装配置

发表于 2018-12-19 | 分类于 环境搭建

软件破解

软件破解请参考: http://idea.lanyus.com/

  1. 使用前请将“0.0.0.0 account.jetbrains.com”添加到hosts文件中屏蔽互联网,hosts文件位于/etc下面
  2. 在网页获取注册码,在注册页面填入注册码即可

Android Studio安装

以下为相关软件下载,2/3中软件为采用第三方模拟器的时候需要下载,利用自带模拟器则可跳过下载

  1. 下载Android Studio安装软件: https://developer.android.google.cn/studio/#downloads
  2. 下载virtualbox: https://www.virtualbox.org/wiki/Linux_Downloads
  3. 下载Genymotion: https://www.genymotion.com/download

安装前请确保网络状态良好,现在安装Android Studio,所需Android SDK、自带模拟器镜像、gradle等都可以在线直接通过开发工具下载安装

mac系统

直接安装dmg安装包即可

Linux系统

  1. 进入安装包所在目录下,如:android-studio-ide-181.5056338-linux.zip
  2. sudo mkdir /usr/JetBrains
  3. sudo cp android-studio-ide-181.5056338-linux.zip /usr/JetBrains
  4. cd /usr/JetBrains
  5. sudo unzip android-studio-ide-181.5056338-linux.zip
  6. cd android-studio/bin
  7. 命令行启动AndroidStuido: ./studio.sh,正常的话应该会出现软件的配置设置
  8. 软件启动,因为没有Android SDK,会弹出提示界面,点击cancle之后会自动下载Android SDK,然后创建测试项目,过程中运行所需资源都会自动下载,耐心等待即可

设置启动图标启动Android Studio

  1. sudo vim /usr/share/applications/android-studio.desktop
  2. 编辑文件内容:
1
2
3
4
5
6
[Desktop Entry]
Type=Application
Name=Android Studio
Comment=Android Studio Integrated Development Environment
Icon=/usr/JetBrains/android-studio/bin/studio.png
Exec=/usr/JetBrains/android-studio/bin/studio.sh
  1. 在启动器别表即可找到Android Studio启动图标,点击启动即可

模拟器

Android程序调试可通过真机、自带模拟器、第三方模拟器调试

第三方模拟器大多使用Genymotion,官网下载:https://www.genymotion.com/download/
android Studio安装Genymotion插件使用

安装过程遇到的问题

  1. linux中启动模拟器出现grant current user access to /dev/kvm错误
    解决方法:打开terminal,输入代码who/whoami查找当前用户名;sudo chown username -R /dev/kvm 注意username是你用的用户名

  2. 无法修改模拟器创建时的选项 emulated performance
    解决方法: Nexus 5X和Nexus 5镜像不支持,换成其他镜像即可

https://blog.csdn.net/wshish920907/article/details/78249528

InteliJ IDEA安装

下载地址:http://www.jetbrains.com/idea/?fromMenu

Linux系统

  1. 进入安装包所在目录下,如:ideaIU-2016.1.2.tar.gz
  2. sudo cp android-studio-ide-181.5056338-linux.zip /usr/JetBrains,如果没有JetBrains则自己创建
  3. cd /usr/JetBrains
  4. sudo tar -zxvf ideaIU-2016.1.2.tar.gz
  5. sudo mv idea-IU-145.971.21 idea
  6. cd idea/bin
  7. 命令行启动Idea: ./idea.sh,正常的话应该会出现软件的配置设置
  8. 软件启动,创建任意Java程序,配置JDK路径,然后创建测试项目,过程中运行所需资源都会自动下载,耐心等待即可

设置启动图标启动Idea

  1. sudo vim /usr/share/applications/idea.desktop,当然软件启动后也会提示是否创建快捷访问链接,可通过IDEA创建启动图标
  2. 编辑文件内容:
1
2
3
4
5
6
[Desktop Entry]
Type=Application
Name=InteliJ IDEA
Comment=InteliJ IDEA Integrated Development Environment
Icon=/usr/JetBrains/idea/bin/idea.png
Exec=/usr/JetBrains/idea/bin/idea.sh
  1. 在启动器别表即可找到InteliJ IDEA启动图标,点击启动即可

WebStorm安装

下载地址:http://www.jetbrains.com/webstorm/download/#section=linux

webstorm安装请参考AndroidStudio和IDEA

设置启动图标启动Idea

  1. sudo vim /usr/share/applications/idea.desktop,当然软件启动后也会提示是否创建快捷访问链接,可通过IDEA创建启动图标
  2. 编辑文件内容:
1
2
3
4
5
6
[Desktop Entry]
Type=Application
Name=WebStorm
Comment=WebStorm Integrated Development Environment
Icon=/usr/JetBrains/WebStorm/bin/webstorm.png
Exec=/usr/JetBrains/WebStorm/bin/webstorm.sh

linux 配置文件启动顺序

发表于 2018-12-19 | 分类于 Linux

https://www.cnblogs.com/GO-NO-1/p/9084713.html

[toc]

启动顺序概述

当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导 Linux,Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc 当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这 样就完成了从开机到登录的整个启动过程。

0.BIOS加电自检

  • 首先被启动执行的就是这个BIOS(BasicInput/Output System)程序。访问硬盘先头512Bit的MBR(Master Boot Record)
  • 经BIOS的控制,将MBR中的Boot Record调入内存中。这里就要说说Linux的Boot程序了,Linux的Boot程序有GRUB和LILO,而CentOS默认的Boot程序是GRUB
  • 通过Boot程序,访问硬盘中的Linux内核程序
  • 将内核程序调入内存中

1.内核的引导(核内引导)

Red Hat可以使用lilo或grub等引导程序开始引导Linux系统,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权, 然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。

内核程序调用完成后,通过内核访问硬盘中将要用到的其他文件。
内核第一个执行的文件是/sbin/init,而这个文件的设置和定义文件是/etc/inittab这个文件,也就是说/sbin/init按照/etc/inittab的定义来执行下一步的启动

2.运行init

  1. init是一个由内核启动的用户级进程。它的进程号是1,从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序
  2. init程序需 要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成
  3. inittab的格式如下。其中以#开始的行是注释行,除了注释行之外,每一行都有以下格式:
1
2
3
4
5
6
7
id:runlevel:action:process
* id:是指入口标识符,它是一个字符串,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。
* runlevel: 是init所处于的运行级别的标识,一般使用0-6以及S或s。
- 0、1、6运行级别被系统保留:其中0作为shutdown动作,1作为重启至单用户模 式,6为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现
- runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行
* action:描述其后的process的运行方式的。action可取的值包括:initdefault、sysinit、boot、bootwait等
* process为具体的执行程序。程序后面可以带参数

加载内核 执行init程序

1
2
3
4
5
* /etc/rc.d/rc.sysinit  #由init执行的第一个脚本
- 主要做在各个运行模式中相同的初始化工作,包括: 调入keymap以及系统字体 启动swapping 设置主机名、设置NIS域名检查(fsck)并mount文件系统打开quota 装载声卡模块设置系统时钟等等
* /etc/rc.d/rc $RUNLEVEL #$RUNLEVEL为缺省的运行模式
* /etc/rc.d/rc.local #相应级别服务启动之后、在执行该文件(其实也可以把需要执行的命令写到该文件中)
* /sbin/mingetty # 等待用户登录

3.系统初始化

在init的配置文件中有这么一行:si::sysinit:/etc/rc.d/rc.sysinit
,它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分 区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

4.启动对应运行级别的守护进程

在rc.sysinit执行后,将返回init继续其它的动作,通常接下来会执行到/etc/rc.d/rc程序。

以运行级别3为例,init将执行配置文件inittab中的以下这行:
==l5:5:wait:/etc/rc.d/rc 5==

1
2
3
4
5
* 这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d /rc5.d/目录下的所有的rc启动脚本
* /etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些链接文件,而不是真正的rc启动脚本, 真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下
* 这些rc启动脚本有着类似的用法,它们一般能接受start、stop、 restart、status等参数
* /etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的链接文件,对于以以S开头的启动脚本,将以start参数来运行;调用的顺序按xx 从小到大来执行
* 如果发现存在相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作 为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行

5.建立终端

  • rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。init接下来会打开6个终端,以便用户登录系统
  • 通过按Alt+Fn(n对应1-6)可以在这6个终端中切换。在inittab中的以下6行就是定义了6个终端:
1
2
3
4
5
6
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

从 上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。同时它会显示 一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用 户的身份。

6.登录系统,启动完成

  • 当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了
  • Linux 的账号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。然后login会对用户名进行分析:如果用户名不是 root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。
  • 在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其它信息
    • 对于bash来说,系统首先寻找/etc/profile脚本文件,并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它

登录时自动运行程序

1
2
3
用户登录时,bash首先自动执行系统管理员建立的全局登录script :/etc/profile。
然后bash在用户起始目录下按顺序查找三个特殊文件中的一个:/.bash_profile、/.bash_login、 /.profile,但只执行最先找到的一个。
因此,只需根据实际需要在上述文件中加入命令就可以实现用户登录时自动运行某些程序(类似于DOS下的Autoexec.bat)

退出登录时自动运行程序

1
2
退出登录时,bash自动执行个人的退出登录脚本/.bash_logout。
例如,在/.bash_logout中加入命令"tar -cvzf c.source.tgz *.c",则在每次退出登录时自动执行 "tar" 命令备份 *.c 文件。

rc.d目录

执行==ls -l /etc/rc.d==命令,会有刚提到的目录,说明如下:

  1. init.d
  • 这个不是文件,是一个目录,这个目录下面存放着各各服务的控制脚本,这下面的文件和你安装了些什么软件包有关系。
  • etc/rc.d/rcX.d下的文件和这个init.d下面的文件是通过软连接相连的
  1. rc
  2. rc.loca

可以将启动命令写到这个文件中,让开机启动服务完毕之后,==最后==启动这个服务

  1. rc.sysini

这个文件是在boot的时候就被执行的脚本,它的任务是初始化系统的网络,设定hostname,欢迎信息表示,时钟设置,挂载文件系统等。

  1. rcX.d

在察看这个文件的时候注意3点:

  • ls -l 察看它们的详细信息,看看他们的link指向
  • ls -l 察看它们的文件名的头字母,形式应该是这样的[S或K <数字> <名称>]的形势。==S代表启动==,==K代表停止==。
    即:开机的时候,以S开头的脚本文件别执行,已被开机运行;以K开头的文件不被执行,这个文件所控制的服务也不被执行,这个文件控制的服务也不被开机运行
  • 打开link指向的文件,文件头有类似“# chkconfig: 2345 10 90”一行,这一行就指定了其启动和的优先级

控制服务的一些工具

chkconfig

setup

是系统综合的配置工具,命令行下也可以用

system-config-services

如果你安装了gnome这样的窗口桌面系统,你也可以使用这个工具来体验下鼠标点击带来的方便。

Linux设置服务自启动的三种方式

ln -s

ln -s 在/etc/rc.d/rc*.d目录中建立/etc/init.d/服务的软链接(*代表0~6七个运行级别之一)

etc/rc[06].d其实是/etc/rc.d/rc[06].d的软连接,主要是为了保持和Unix的兼容性才做此策

例如:etc/rc[06].d其实是/etc/rc.d/rc[06].d的软连接,主要是为了保持和Unix的兼容性才做此策

文件位于/etc/rc.d/init.d下,名为apached,如果要服务自启动,则:

  • #chmod +x /etc/rc.d/init.d/apached //设置文件的属性为可执行
  • #ln -s /etc/rc.d/init.d/apached /etc/rc3.d/S90apache //建立软连接,快捷方式
  • #ln -s /etc/rc.d/init.d/apached /etc/rc0.d/K20apache

chkonfig

命令行运行级别设置

如果需要自启动某些服务,只需使用chkconfig 服务名 on即可,若想关闭,将on改为off
在默认情况下,chkconfig会自启动2345这四个级别,如果想自定义可以加上–level选项

ntsysv

伪图形运行级别设置

启动ntsysv有两种方式,一是直接在命令行中输入ntsysv,二是使用setup命令,然后选择系统服务

常见的守护进程

在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定.

常见的守护进程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
amd:自动安装NFS守护进程
apmd:高级电源管理守护进程
arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库
autofs:自动安装管理进程automount,与NFS相关,依赖于NIS
crond:Linux下的计划任务的守护进程
named:DNS服务器
netfs:安装NFS、Samba和NetWare网络文件系统
network:激活已配置网络接口的脚本程序
nfs:打开NFS服务
portmap:RPC portmap管理器,它管理基于RPC服务的连接
sendmail:邮件服务器sendmail
smb:Samba文件共享/打印服务
syslog:一个让系统引导时起动syslog和klogd系统日志守候进程的脚本
xfs:X Window字型服务器,为本地和远程X服务器提供字型集
Xinetd:支持多种网络服务的核心守护进程,可以管理wuftp、sshd、telnet等服务

easyui学习知识点小记

发表于 2018-12-19 | 分类于 Java
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
第二课
1. 注意js的引入顺序,先Jquery,后EasyUI
2. 引入样式的时候,通过不同主题引入不同的CSS,easyui.css中包括主题包下的所有css样式
3. 通过引入locale下的对应文件则可以实现本地化
4. 通过在js的引入里面指定charset设置引入文件的编码
5. 编码的调试注意这个顺序,当前文档的编码,当前页面内容的编码,引入文件的编码,页面解析文件的编码格式,其他的还可以考虑tomcat、数据库的编码格式
6. 可以通过js往浏览器的控制台打印东西,比alert的方式好,因为这样的话,可以打印出这个东西。如console.info(“你好”);在调试模式之下可以看到此信息。
7. EasyLodaer功能:动态的加载所需要的EasyUI中的js文件和css文件。

第八课
1. Datagrid中有toolbar属性,但是文档中红没有提供,可以自己重写一个toolbar,方法是在页面写一个Div,给出他的id如toolBarId,然后在datagrid的options中设置toolbar:‘#toolBarId’即可。
2. 在数组中可以添加分割符,如[{},’-’,{}],红色部分则可以转变成为分隔符
3. 如果为datatimebox的话,就要加上editable这个属性为false
4. Jquery提供了将form表单序列化为字符串serialize或者数组serializeArray的方法,所以如果要将form表单元素的值序列化为元素的值,则需要自己拓展,如提供公共方法:如
SerializeObjexct =function (from){//注意此处为form对象,并非form的Id
Var o= {};
$.each(form.serializeArray(),function(index){
If(o[this[‘name’]]){
O[this[‘name’]]= O[this[‘name’]]+ “,”+O[this[‘value]];
}else{
O[this[‘name’]]= O[this[‘value]];

}
});
Return o;
}

在调用的地方就可以通过一下方法调用
SerializeObjexct($(“#serchDiv”).form()); //在form外面套用一个serchDiv的div层
这个调用是在datagrid的load方法中使用,load方法的第二个参数实质上就是一个object,也就是上面我们序列化后的对象,而如果要查询所有的的话,就传递一个空的对象。
5. Datagrid的load方法和reload方法区别:load方法会将当前页改回到第一页,而reload方法会记住当前的页码,这样在查询出来的结果可能分布到其他页,而当前页没有东西,需要自己手动打过去,所以不推荐。Reload方法的使用地点是刷新当前页,而load在刷新的时候是类似重新加载。
6. 注意对js添加命名空间的使用
第九课
1. 给Datarid添加数据点方式可以有dialog方式和行编辑方式,行编辑方式的话,需要给列添加编辑器,如在列的field上添加如下:
editor:{
type:’’,
options:{
required:’true’
}
}
2. datagrid的行添加时可以通过appendRow(追加在最后)和insertRow(插入到指定行)方法,指定其index为0即可。在添加行之后,记得通过beginEdit方法开启编辑状态。
3. 通过行编辑状态方式添加记录时候,多次点击添加按钮,会出现多条行编辑状态,这样的话在后台的操作中对于回滚、添加的要求较高;一般可以通过保存当前编辑行,限定只有一个行编辑状态即可。在点击添加的时候记录当前编辑行的索引
4. 添加记录的时候,可以在前台生成UUID后直接将参数传递到后台,这样前台界面上的体验好点。
5. 在editor中只有datebox,没有datatimebox,这样添加时间的时候就不合适,所以需要自己扩展这个editor,具体的代码如下:
![image](/pub-images/datagrid.png)
图中1区就是扩展的editor的名称;通过设置editable=false来限制自由输入。
图中2区是获得editor的值,通过调用特定的被扩展插件的方法设置。图中3区为设置editor的值;
图中4区为设置editor的大小,调用被扩展插件的reseize方法,或者自己计算皆可。
图中5区为回收当前扩展了的editor的资源。因为当前的被扩展插件datatimebox的下拉框是一个panel,需要释放此资源,否则会影响效率。
具体的原型来自API中提供的扩展模版,可以参考。
6. 在取消编辑的时候,调用datagrid的rejectEdit方法,记得同时取消所有选择,及调用datagrid的unSelectAll方法。
7. 双击编辑的时候,如果前面还有没有结束的编辑,需要先取消前面的编辑,然后开启当前编辑。
8. 注意在删除多条datagrid中的数据的时候,通过对js中数组的join(“,”);方法的使用。
9. 动态修改行编辑器:如添加密码的时候需要密码框,但是修改的时候就不需要这个框了,可以动态修改编辑器,具体方法可以通过扩展datagrid的方法。
第十课
1. onAfterEdit中如何知道当前的操作是添加还是修改?可以通过datagrid的getChanges方法的第二个参数,包括inserted,updated等,具体参考文档,getChanges获得的是当前对象的修改过的属性。
2. datagrid的accepteChanges和rejectChanges方法通过一个类似easyui的缓存list保存当前数据,如果我们在修改之后没有尽快和数据库操作的话,没有确认当前的修改状态,则就算界面上的操作看似已经保存,当我们选中的时候,还是可以回滚的,直到我们accepteChanges,这在数据保存成功之后必须做,否则应该回滚。
3. 在删除成功的时候,在界面success中调用load方法,同时记得一定要调用datagrid的unSelectAll方法
4. 清空本地的datagrid,这个使用loadData方法,区别与load方法,loadData方法会读取本地的缓存数据,并且清空旧的数据。
第十一课
1. Datagrid中的columns中的”[[”方式,是为了多级表头的操作
2. 如果在Datagrid中需要forzenColumns的话(其设置和columns是一模一样的),就设置fitColumns为false或者不设置。这样冻结列可以在第一个的设置参照,后面的拖动滚动条只查看感兴趣的列。而fitColumns只在列少的时候设置,这样会比较好看,否则一定要设置为false
3. 可以通过官网的demo和tuturation学习,对于datagrid的创建,亦可以通过table的形式,及html转换成datagrid,只要在平常的datagrid中添加class即可
4. 可以在html中不写js创建datagrid,对于toolbar可以通过在div中设置内容,在table的toolbar属性中通过“#toolbarId”的方式实现toolbar的效果,但是推荐js方式,比较灵活。
5. 用js的方式添加toolbar的话,就只能添加一行,但是可以同过html的形式创建成多行的toolbar,当然也可以通过扩展的形式创建。http://jeasyui.com/是官网地址
6. 可以给datagrid添加右键事件:onRowContextMenu,然后在html中添加一个class为easyui-menu且display为none的div,然后在事件中屏蔽浏览器的事件:通过e.preventDefault();然后显示此菜单即可,显示的时候设置位置为:
Left:e.pageX();
Top:e.pageY();
其他的辅助操作包括,取消全部选择,选择当前点击右键的行。
此处的e.preventDefault()即阻止事件冒泡的使用。
第十二课
1. datagrid的formatter的返回是一个字符串,可以在此整理数据,添加事件处理,如title提示(要确保nowrap为true),格式化时间等(这个是在前台操作的,也可以通过相应的json的jar包转换)。
2. 给行列添加样式使用rowStyler和styler,注意其书写顺序:rowStyler写在datagrid中,styler写在columns中
3. 如果要让datagrid的头居中,则可以添加
$(‘.datagrid-header div’).css(‘textAlign’,’center’);
第十三课
1. Easyui的换肤功能首先要得到皮肤,可以通过官网上获得不同的主题包。通过在引入css的时候先判断一下cookies中的皮肤,如果此处加载用户选择的皮肤,如果更换的时候,需要更改当前link的href(可以给link添加ID的),同时修改cookies的值
2. 更换皮肤的时候,在修改href的地方,如果有iframe中添加样式的话,也记得要修改其href
第十四课
1. 在google浏览器中,不能读取本地的json文件
2. Esayui生成树有三种方式:
a) 本地html加id或者样式的形式
b) Html中给个<ul id=”menu”>,然后在js中url中请求数据(这样就可以构建异步tree了),可以是本地的json文件
c) Js中给出变量data,data数组中的数据为tree需要的数据,这样先初始化tree,然后调用tree的load方法加载此数据;或者直接通过data方法赋给tree
3. 在异步书中不需要自己在expand中在此请求数据,因为easyui已经进行了封装,如果自己再在这添加请求的话,会请求两次
4. 异步tree中可以通过lines属性给tree添加框架线;cascadeCheck可以设置是否级联选中菜单项,当获得当前选择的菜单项的时候,这个没有区别,但是在界面选中的时候会有半选状态的样式。
5. 当要将树全部展开的时候,可以在onLoadSuccess中判断,具体如下:

这个可以再用来控制展开部分
当然如果确定要一次性展开的话,要在后台递归查询数据,然后将所有菜单数据一次性获得
第十五课
1. 当只想叶子节点出现复选框时,需要设置onlyLeafCheck和CheckBox属性为true
2. 可以对tree通过dbClick事件完成在双击菜单项的时候展开或者折叠菜单
3. $.fn.tree.defaults.onLoadError=function(){Alert(“实现了”);}可以通过此方法设置默认的tree的操作信息。其他的组件同理。

Shell编程入门

发表于 2018-12-19 | 分类于 Linux

认识Shell环境

  • Shell是工作在Linux内核与用户之间的==解释程序==,相当于操作系统的“外壳”,是向Linux内核传达用户指令的“翻译官”,通常指BASH(/bin/bash),常见的还有zsh、tcsh,用于和操作系统内核交互,操作系统内核控制底层硬件
  • windows下的Shell为cmd.exe
  • 查看当前的Shell的命令为:echo $SHELL
  • 可以手动选择Shell环境,直接在Shell中输入shell如:tcsh,相当于新建了一个子环境(父–子进程)
  • shell操作有交互式和非交互式两种
交互式 非交互式
人工干预、智能化程度低 需提前设计、智能化难度大
逐条解释执行、效率低 批量执行、效率高
方便在后台静悄悄地运行

shell脚本

  • shell脚本指提前写好的可执行代码,用来完成特定任务的文件,特点为:顺序、批处理,解释型程序
  • shell脚本编写步骤:
1. 理清任务 自然语言:步骤拆分、顺序化整理
2. 编写可执行语句 脚本语言:各步骤如何实现
3. 完善脚本 界面友好/结构规范/代码优化
  • shell脚本一般以.sh结尾,==第一行 #!/bin/bash== 用来申明Shell环境

  • shell脚本的免交互及输出处理

    • 免交互:通过选项 ==–stdin== 可以从标准输入读取字串;也可以从键盘或由另一个命令给出
    1
    2
    3
    // 修改root密码
    passwd --stdin root //从键盘读入
    echo 1234567 | passwd --stdin root //由echo命令给出
    • 输出处理:

      • 忽略无关输出:黑洞设备/dev/null
      1
      2
      相当于只能写入、不能读出的单向文件;存放到其中的数据都会丢失,用法:可执行语句 &> /dev/null,如:
      echo 1234567 | passwd --stdin root &> /dev/null
      • 记录错误输出:根据需要,将出错信息保存到指定文件
      1
      2
      是针对后台脚本的有效排错手段,适用于不便交互但又需要查看报错的情况,用法:可执行语句 2>/路径/文件,如:
      useradd root 2>/tmp/err.log
  • 命令的组合运用

    • 顺序分割–==使用分号==,格式:命令1;命令2;命令3…,依次执行,只有先后,没有逻辑关系
    • 逻辑“与”分割–==使用&&==,格式:命令1 && 命令2 && 命令3…,逻辑关系为“而且”(and),期望所有命令都能执行成功,一旦出现失败,后续命令不再执行
    • 逻辑“或”分割–==使用||==,格式:命令1 || 命令2 || 命令3…,逻辑关系为“或者”(or),任何一条成功都符合期望,只在前面的命令失败时,后续命令才执行
    • 管道–==使用|==,格式:命令1|命令2,后续命令要能正确处理传来的文本,否则无意义,如:
    1
    find /etc -type f | wc -l   //计算/etc下文件数量,将结果交给wc统计行数
  • shell脚本的运行方式

    • 作为指定shell解释程序的参数
    1
    2
    -sh 代码文件路径    ===     bash 代码文件路径
    -. 代码文件路径 === source 代码文件路径
    • 作为可独立运行的脚本程序
    1
    2
    为shell代码文件添加x权限,指定脚本路径即可运行.如:
    chmod +x /root/first.sh;/root/first.sh

标准输入输出和重定向

Unix/Linux基本思想:普通文件、目录、鼠标、键盘…都是以文件形式存在;要访问硬件设备,必须找对应的设备文件

I/O交互设备

类型 设备文件 文件描述号 默认设备 备注
标准输入 /dev/stdin 0 键盘 从此设备接收用户输入的数据
标准输出 /dev/stdout 1 显示器 通过此设备向用户报告正常的命令输出结果
标准错误输出 /dev/stderr 2 显示器 通过此设备报告执行中的错误信息

重定向:重新指定命令执行是I/O设备的方向

根据I/O方向和类型区分

类型 操作符 用途 举例
重定向输入 < 将文本输入来源由键盘改为指定的文件 mial -s ‘A Test Mail’ root@localhost < /root/mail.txt
重定向输出 > 将命令行的正常输出保存到文件,而非显示器 echo ‘nameserver 8.8.8.8’ > /etc/resolv.conf
重定向输出 >> 与“>”类似,但操作是追加而不是覆盖
重定向错误 2> 将命令行的错误输出保存到文件,而非显示器
重定向错误 2>> 与“2>”类似,但操作是追加而不是覆盖
混合重定向 &> 相当于“>”和“2>”

脚本逻辑

变量值及范围控制

  1. 引号在赋值中的应用
  • 双引号
1
2
3
- 在双引号内允许$扩展,可调用其他变量的值
- 出现特殊字符时,可采用\符号转义
- 当变量值不包括空格、制表符时,双引号通常被省略,如:A=CentOS7
  • 单引号
1
2
- 所有字符均视为该字符本身(无特殊含义)
- 不允许\转义
  1. read读入变量值
1
2
3
4
* 基本格式
- read 变量名.. ..
- read -p "提示信息" 变量名 .. .. //read -p "svr5 login" YOUR_NAME
- 启用read命令的 -s 选项,可关闭输入回显,适合敏感信息,提高安全性,如密码
  1. 变量的作用范围
  • 局部变量:只在定义此变量的shell环境有效;自定义变量默认都是局部变量
  • 全局变量:在当前shell及所有子shell环境下有效;子shell中若赋值同名变量,与父shell中变量无关

发布全局变量

1
2
3
export 局部变量名[=变量值] .. ..
- 直接定义/赋值指定的变量,作为全局变量发布
- 对已有的局部变量,只需发布不需赋值

数值运算及处理

bash内置机制仅支持整数运算

基本运算类别

加减乘除求模 ±*/%

1
2
3
4
5
6
1. expr工具:==expr 数值1 运算符 数值2==  
乘法操作需转义
2. 使用$[]表达式: ==$[数值1 运算符 数值2]==
* 乘法操作无需转义,运算符两侧可以无空格,引用变量可省略$符号,如:echo $[x+100-Y*2/7]
* 支持混合运算,乘除优先
* 支持乘方运算,如:echo $[10**3]

自增表达式

1
2
1. 加减乘除求模自增,如:i+=2 或 i=i+2 或 $[i+=2]
2. 如果步长为1,则支持如: --i,++i/i--,i++

let命令操作变量

1
操作变量值运算,并保存新结果,适用于不需要输出的情况,如:let  x++

使用随机整数

  1. 环境变量RANDOM:随机生成0~32767之间的一个整数
  2. 扩大随机数范围:多个随机数相乘
  3. 缩小随机数范围:取余数,如:$[RANDOM%1000]取0~999的整数

整数序列

使用seq命令

1
2
3
4
5
6
7
使用格式:默认分隔符为\n
- seq 末数 ;默认从1开始,步长为1
- seq 首数 末数
- seq 首数 步长 末数
参数选项:
-s:定义分隔符,如:seq -s' ' 3,结果“1 2 3”
-w:等宽显示,不足前面补0

bc计算器

bc运算器支持高精度的数值运算,输入bc进入交互式预算界面,quit退出,设置scale=n可约束小数位,也支持小数值的比较,大多数Linux系统已内置

使用举例:

  1. echo “scale=4;123.4*2.5” | bc
  2. echo “A>A>A>B” | bc

Shell变量

  • 变量:以固定名称存放的可能会变化的值
  • 定义/赋值变量
1
2
3
4
5
变量名=变量值
1. 如果变量名已存在,则相当于赋值
2. 等号两边不能有空格
3. 变量区分大小写
4. 变量名不能以数字开头,不要使用关键字和特殊字符
  • 查看/引用变量:$变量名 或 ${变量名}
  • 取消变量:退出shell变量自动失效 或 ==unset 变量名== 方式手动取消

变量的分类

  1. 存储类型:shell不作为高级编程语言,对存储类型的要求比较松散
  2. 使用类型
类型 说明 备注
环境变量 变量名通常大写,由系统维护,用来设置工作环境,其中只有个别变量用户可以直接修改 配置文件:/etc/profile,~/.bash_profile
位置变量 由bash内置,用来存储在执行脚本时提供的命令行参数 n,从1开始,当n>10,格式为==n,从1开始,当n>10,格式为 ==n,从1开始,当n>10,格式为=={n}==
预定义变量 由bash内置,一类有特殊用途的变量,可以直接调用,但不能直接赋值或修改 参见下表与定义变量定义
自定义变量 用户自主设置、修改及使用

env-列出所有环境变量;
set-列出所有变量

常见环境变量:PWD,PATH,USER,LOGNAME,UID,SHELL,HOME,PS1,PS2…

变量名 含义 备注
$0 当前所在进程或脚本名
$$ 当前运行进程PID
$? 命令执行后的状态值,0-正常 1或其他-异常
$# 已加载位置变量个数 如传入参数个数判断: if[ $# -ne 2 ]
$* 所有位置变量的值

条件测试

返回状态值:$?

专用测试工具test

1
2
3
格式:
* test 选项 参数...
* [ 选项 参数... ]

文件状态检测:test的参数则为文件或目录

测试选项 含义 举例
-e 检测对象是否存在Exist [ -e /etc/test ];echo $?
-d 检测对象是否为目录Directory
-f 检测对象是否为文件File
-r 检测对象是否有可读权限Read
-w 检测对象是否有可写权限Write
-x 检测对象是否有可执行权限eXcute

整数值比较

测试选项 含义 举例
-eq 等于Equal [ $(who|wc -l) -eq 10 ]//判断登陆用户数等于10
-ne 不等于Not Equal
-ge 大于或等于 Greater or Equal
-le 小于或等于 Lesser or Equal
-gt 大于 Greater Than
-lt 小于 Lesser Than

组合多个条件

1
2
3
格式:
* test 测试条件1 -a或-o 测试条件2...
* [[ 测试条件1 &&或|| 测试条件2...]]

字符串比较

1
2
3
格式:
* [ 字符串1 选项 字符串2 ]
* [ 选项 字符串 ]
测试选项 含义 举例/说明
= 两字符串相同 [ $USER = ‘root’ ] && echo $USER
!= 两字符串不同
-z 字符串值为空 Zero
-n 字符串值不为空 Not zero

将条件取反

1
2
3
4
格式:
[ ! 测试条件 ]
举例:
[ ! 100 -gt 200] && echo YES

字符串处理

截取字符串

  1. 使用expr命令,==expr substr $var1 起始位置 截取长度==
  2. 使用cut命令
1
2
* 命令输出|cut -c 起始位置-结束位置,echo $var1|cut -c 5-6
* 命令输出|cut -d '分隔符' -f 字段编号....,echo "CentOS6.5" |cut -d 't' -f2 //OS6.5,相当于java中的split[2]
  1. 使用${}
1
2
3
格式:
* ${var1:起始位置:截取长度}
* ${var1::截取长度} //默认从头开始

字符串替换

使用${}

1
2
3
格式:
* ${var1/old/new} //只替换一个
* ${var1//old/new} //替换全部

tr单字替换工具

1
2
3
格式:
* 命令输出|tr 'abc' 'ABC' //abc替换为大写ABC
* 命令输出|tr -d 'abc' //删除所有的abc

路径分割

  • dirname “路径字符串”:取目录位置
  • basename “路径字符串”:取基本名称

使用随机字符串

  • 随机数变量:RANDOM
  • 特殊设备文件:/dev/urandom
  • UUID生成命令:uuidgen

随机信息的转换:md5sum

依据输入文本计算出256位(32字符)的MD5编码值

  • echo $RANDOM |md5sum
  • head -1 /dev/urandom|md5sum

命令替换

  1. 反撇号`
  • 适用场景:在命令行潜入另一个命令的输出结果;将命令的输出保存到指定变量
  • 优先执行反撇号内的命令,并将执行结果作为输入
  • 举例:rpm -qf which tr
  1. $(可执行命令),优点为==可嵌套使用==,举例:rpm -qf $(which tr)

流程控制

if语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//单分支
if 条件测试
then 命令序列
fi

//双分支
if 条件测试
then 命令序列1
else 命令序列2
fi

//多分支(嵌套)
if 条件测试1
then 命令序列1
elif 条件测试2 ;then
命令序列2
else
命令序列n
fi

说明:如果then要跟着条件测试写在一行,则需在then前加封号,如:

1
2
3
if 条件测试 ;then
命令序列
fi

for循环

1
2
3
4
for 变量名 in 值列表
do
命令序列
done

while循环

1
2
3
4
while 条件测试
do
命令序列
done

case分支

1
2
3
4
5
6
7
8
9
case 变量值  in
模式1)
命令序列1;;
模式2)
命令序列2;;
.. ..
*)
默认命令序列
esac

中断及退出控制

类型 含义
break 跳出当前所在循环体,执行循环体后的语句块
continue 跳过循环体内余下的语句,重新判断条件以便执行下一次循环
exit 退出脚本,可以指定返回的状态值,默认返回0

编写服务脚本

shell函数

type 名称 //查看名称对应类型

1
2
3
4
5
6
7
8
9
10
11
12
13
基本格式:
function 函数名(){
命令序列
.. ..
}
或🔥
函数名(){
命令序列
.. ..
}

调用: 函数名
传参: 函数名 参数1 参数2 .. .. //传递的值作为函数的位置参数

系统服务管理

  • 查看服务列表、自启状态
    • chkconfig --list [服务名]
    • chkconfig 服务名 on/off
  • 启动/停止/重启服务
    • service 服务名 start/stop/restart
    • /etc/init.d/服务名 start/stop/restart
  • ntsysv:可视化设置自启动状态
  1. shell脚本直接交给service控制,则将脚本或者脚本的快捷方式放到/etc/init.d/下即可
  2. shell脚本交给chkconfig工具管理,需设置适用级别、启动/停止顺序、服务说明
  • 添加设置
1
2
3
4
#!/bin/bash
#
# chkconfig:2345 10 95
# description:服务相关说明
  • 添加服务:chkconfig --add 服务名

文件的排序集统计

ls列表排序

  • -S:按文档大小降序排列
  • -t:按文档的修改时间降序排列
  • -r:反序排列

uniq去重工具

1
2
用法1:uniq 文件
用法2: 命令|uniq

缺点:==未排序的文本会出现重复现象==,需配合其他方式先排序,再去重
方法:sort 文件名|uniq -c

sort工具

1
2
3
4
5
6
7
8
用法1:sort 文件
用法2:命令|sort

常用选项:
* -u: 去除重复行
* -n:按数字升序排列
* -r:反向排序
* -k:优先对第几列内容排序,即优先对哪个字段排序,只是字段是通过显示顺序编号的

文本处理的的特殊应用

tac、rev反序输出

  • tac:以行为单位反序,与cat命令效果相反
  • rev: 以字符为单位反序,与echo命令效果相反

tee整合重定向

举例:uname -r|tee un.txt

unix2dos与dos2unix转换

windows和linux系统文本格式转换

1
2
3
4
安装:yum -y install unix2dos dos2unix
基本用法:
* unix2dos Linux文件
* dos2unix Windows文件

xargs多参数处理

背景:ls、mv、rm、cp等命令给出的参数长度不能超过2.5M,基于*匹配、find等方式处理大量文件时容易出错

多参数的分散处理

  • 利用find… … -exec… … 查找处理 //仅适用于处理文件或目录参数,如:find / -exec ls -lh {} ;
  • xargs工具:根据给定的参数组(以行为单位)分次执行目标命令行
1
2
3
4
5
用法1:提供参数的命令 | xargs 目标命令,如:find /|args ls -lh
用法2: xargs --arg-file=提供参数的文件 目标命令
选项:
* -I:定义标记,如:ls txt.log* | xargs -I{} cp {} {}.new
* -d: 制定分割符,默认按行分割,如:head -1 /etc/passwd |xargs -d: -I{} echo {}

expect预期交互控制

基于TCL编写的自动化交互式程序,可以用在Shell脚本中,为FTP、SSH等交互过程自动输送预先准备的文本或指令,而无需人工干预,出发的依据是预期会出现的特征提示文本

  • 安装:yum -y install expect
  1. 手动交互
  2. 自动交互
1
2
3
4
5
6
7
8
9
10
11
12
13
cat mike-ftp.sh
--------------------
spawn ftp 192.168.4.5
expect "):"
send "mike\r"
expect "Password:"
send "123456\r"
expect "ftp>"
send "put install.log\r"
expect "ftp>"
send "quit\r"
---------------------
epxect mike-ftp.sh
  • 调整执行环境:添加Sha-Bang环境声明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat mike-ftp.sh
-----------------------
#!/usr/bin/expect
spawn ftp 192.168.4.5
expect "):"
send "mike\r"
expect "Password:"
send "123456\r"
expect "ftp>"
send "put install.log\r"
expect "ftp>"
send "quit\r"
------------------------
sh mike-ftp.sh
  • SSH登陆免交互举例
1
2
3
4
5
6
7
8
#!/usr/bin/expect
set host 192.168.4.5
set user mike
set password "1234567"
spawn ssh $user@$host
expect "password:"{send "$password\r"}
expect "\[$user\@"{send "pwd>/tmp/$user.txt;exit\r"}
expect eof

应用技巧

正则表达式

使用“一串符号”来描述有共同属性的数据

egrep测试工具

  • 用法1:egrep [选项] ‘正则表达式’ 文件
  • 用法2:前置命令|egrep [选项] ‘正则表达式’

选项

1
2
3
4
5
-i:忽略大小写
-v: 取反
-c:统计匹配行数
-q:静默、无任何输出
-n:显示出所匹配结果所在的行号

基本元字符

类型 含义 示例 说明
^ 匹配行首 ^abc 或 ^# 以abc开头的行 或 以#开头的行(比如注释行)
$ 匹配行尾 abc$ 或 ^$ 以abc结尾的行 或 空行
. 单个字符 . 除换行符\n以外的任意单个字符
+ 最少匹配一次 a+ 或 (abc)+ 一个或多个连续的a 或 一个或多个连续的abc
? 最多匹配一次 a? 或 (abc)? 0个或1个a 或 0或1个abc
* 匹配任意次数 a* 或 (abc)* 或 .* 0个或多个连续的a 或 0个或多个连续的abc 或 任意长度的任意字符串
{n} 匹配n次 (ab){3} 匹配ababab
{n,m} 匹配n~m次 (ab){1,3} 匹配ab、abab、ababab
{n,} 匹配至少n次 (ab){2,} 匹配2个及以上连续的ab
[] 匹配范围内的单个字符 [a-z] 匹配任意小写字母
[]内加^ 可取反 [^a-z] 匹配任意非小写字母
() 组合为整体 (ab) 连续的ab
或者 root|bin 匹配root、bin
\b 单词边界 \broot\b 匹配root,不匹配keroot、rooty、brooty等字符串
< 单词的开头 <th 匹配以th开头的单词
> 单词的结尾 th> 匹配以th结尾的单词

awk文本过滤

awk:模式扫描及处理语言,创始人Aho、Weinberger、Kernighan,基于模式匹配检查输入的文本,逐行处理并print结果,目前最常用的实际是GNU版本的gawk

  • 用法1:前置命令|awk [选项] ‘[条件]{编辑指令}’
  • 用法2:awk [选项] ‘[条件]{编辑指令}’ 文件,如:awk -F “:” ‘{print $1,$2} /etc/passwd’

条件的表现形式

  • 正则表达式,/正则表达式/ 🔥 ~匹配、!~不匹配,如:awk -F: ‘/^ro/{print}’ /etc/passwd
  • 数值/字符串比较
  • 逻辑比较
  • 运算符

选项

1
2
-F:指定分隔符,可省略,默认空格或Tab位,如:awk -F: '$1==ENVIRON["USER"]{print $3}' /etc/passwd  //输出当前用户的UID信息
-f:调用awk脚本进行处理

awk内置变量

变量 用途
FS 保存或设置字段分隔符,如 FS=“:”
$n 指定分隔符的第n个字段,如$1、$3分别表示第1、第3列
$0 当前读入的整行文本内容
NF 记录当前处理的字段个数(列数)
NR 记录当前已读入行的数量(行数)
FNR 保存当前处理行在元文本内的序号(行号)
FILENAME 当前处理的文件名
ENVIRON 调用Shell环境变量,格式:ENVIRON[“变量名”]

awk处理的时机:可单独使用,也可以同时一起使用,具体如下:

  • 行前处理,BEGIN{}:读入第一行文本之前执行,一般用来初始化操作
  • 逐行处理,{}:逐行读入文本执行相应的处理,是最常见的编辑指令块
  • 行后处理,END{}:处理完最后一行文本之后执行,一般用来输出处理结果
1
awk 'BEGIN{print NR}END{print NR}' m.txt

awk的流程控制

  • if分支,如:if(条件){编辑指令1}else if(条件){编辑指令12}…else{编辑指令n}
1
awk -F: 'BEGIN{i=0;j=0}{if($3<500){i++}else{j++}}END{print i,j}'     /etc/passwd
  • while循环,如:while(条件){编辑指令}
  • do while循环,如:do {编辑指令}while(条件)
  • for循环,如:for(初值;条件;步长){编辑指令}
关键字 含义
break 结束当前的循环体
continue 中止本次循环,转入下一次循环
next 跳过当前行,读入下一行文本开始处理
exit 结束文本读入,转入END{}执行,没有则直接退出

sed文本流处理

sed:Stream EDitor,流式编辑器,基于模式匹配过滤及修改文本,逐行处理并将结果输出到屏幕,可实现文本过滤/删除/替换/复制/剪切,以及导入/导出等各种操作

  • 用法1:前置命令|sed [选项] ‘编辑指令’,如:se -n /etc/inittab |sed -n ‘4,7p’
  • 用法2:sed [选项] ‘编辑指令’ 文件
1
编辑指令由“[定址符]处理动作”组成,[定址符]的格式为“[地址1,[地址2]]”

选项:

1
2
3
4
5
6
-n:屏蔽默认输出
-i:直接修改文件内容
-f:使用sed脚本
-e:可指定多个处理动作
-r:启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
{}:可组合多个命令,以分号分隔

处理动作:替换操作的分隔符“/”可用其他字符,如#、&等以便于修改文件路径

操作符 用途 指令示例
p 打印行 2,4p 输出2,3,4行 🔥 2p;4p输出第2行、4行
d 删除行 2,4d 删除第2,3,4行
s 字符串替换 s/old/new/ 将每行第1个old替换为new
s/old/new/3 将每行第3个old替换为new
s/old/new/g 将所有的old替换为new
4,+10p 加10行 输出第4行及其后10行内容
n 表示下一行 p:n输出奇数行
n:p输出偶数行
$= 输出文件的行数 sed -n ‘$=’ a.txxt
i 行前插入文本 2iYY 在第2行前添加文本行YY
4,7iYY 在第4-7行每一行钱添加文本行YY
a 行后插入文本 2aYY 在第2行后插入YY
c 替换当前行 2cYY 将第2行内容修改为YY
r 读取文件,结合-i选项才会存入,否则只输出 3r b.txt 在第3行下发插入文本b.txt
w 保存到文件,以覆盖方式 3w b.txt 将第3行保存到b.txt

sed复制剪切

  • 模式空间:存放当前处理的行,将处理结果输出;若当前行不符合处理条件则原样输出;处理完当前行再读入下一行来处理
  • 保存空间:作用类似剪贴板,默认存放一个空行\n
    选项:
1
2
3
4
5
6
-H:模式空间 追加 到 保持空间 ,即复制
-h:模式空间 覆盖 到 保持空间 ,即复制
-G:保持空间 追加 到 模式空间 ,即粘贴
-g:保持空间 覆盖 到 模式空间 ,即粘贴

sed '1,3H;$G' reg.txt //把第1~3行复制到文件末尾

实战脚本

基本知识

  1. 查看用户信息:id gsuis

awk&sed应用实战

oracle

发表于 2018-12-12 | 分类于 数据库

官网:https://www.oracle.com/index.html
版本中字母的含义:c(cloud)、g(grid)、i(internet)

下载:https://www.oracle.com/downloads/,需要登录oracle官网,下载的两个文件解压在一个文件夹中

安装:

  1. 安装Oracle11g出现INS-13001环境不满足最低要求 https://blog.csdn.net/q_sea__/article/details/79012808
  2. Environment variable: “PATH”
    安装时确保不要关机或断电;安装过程中复制文件过程比较耗费时间

完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例。

  1. 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等);
  2. Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区。

在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘中的数据文件。Oracle有一个很大的内存快,称为全局区(SGA)。

数据库的创建与监听器的配置54C
创建数据库:Database Conguration Assistant,可以创建、配置、删除、管理数据库
全局数据库名称为数据库名称,其至少要有一个Oracle实例引用,该实例由SID唯一标识,如:orcl
配置Enterprise Manager会占用较大内存,先不配置;注意选择字符集;修改scott和hr的密码
sys用户为数据库的所有者,system用户为数据库的操作员
监听器的配置:Net Conguration Assistant,配置完成后在系统服务中查看添加了OracleOraDb11g_home1TNSListener,此服务启动之后就允许外部连接数据库了
OracleServiceORCL是关于数据库实例的服务,此服务启动之后,数据库才可用

oracle常用数据库工具
Oracle Universal Installer:OUI(Oracle全局安装器),用来安装卸载oracle数据库管理系统
Database Conguration Assistant:(DBCA)创建、配置、删除、管理数据库
Net Conguration Assistant:(NCA)监听器、命名方法、本地网络服务名、目录使用配置
SQL Plus:基于命令行的oracle官方操作工具
SQL Devloper:基于Java的图形化的oracle官方操作工具,需人工关联sqldeveloper.exe文件和配置JDK
PL/SQL Devloper:第三方工具
TOAD:第三方工具

Oracle中的用户、权限与角色
用户管理:需切换到system用户操作
创建用户:create user 用户名 identified by 密码 [account lock|unlock] [password expire];(password expire表示密码立即过期,第一次登录后需修改密码)用户创建后还需授权才能操作数据库
修改用户:alter user 用户名 identified by 密码 [account lock|unlock] [password expire];
删除用户:drop user 用户名 [cascade];(cascade用来表示删除用户下的所有数据对象)
权限管理:权限为系统中设置的安全规则或安全策略,分为系统权限(用户能否在数据库上完成某个动作)和对象权限(用户能否在某个数据库对象上完成某种操作)
系统权限授予:grant 权限 to user|role [with admin option];(表示可以级联授予)
系统权限回收:revoke 权限 from user|role;
对象权限授予:grant 权限[(col,…)] on 数据库对象 to user|role [with admin option];
对象权限回收:revoke 权限[(col,…)] on 数据库对象 from user|role;
对象权限的回收是级联的,系统权限回收是非级联的
角色管理:角色是权限的集合,用来简化权限管理
创建/删除角色:create/drop role 角色;
角色上系统权限授予:grant 权限 to role [with admin option];(表示可以级联授予)
角色上系统权限回收:revoke 权限 from 角色;
角色上对象权限授予:grant 权限[(col,…)] on 数据库对象 to role [with admin option];
角色上对象权限回收:revoke 权限[(col,…)] on 数据库对象 from role;
用户角色授予:grant 角色 to 用户;
用户角色回收:revoke 角色 from 用户;

Oracle表:由行和列组成的数据库中基本的存储单元,访问其他用户的表需要加用户名作为前缀
约束:表级别约束和列级别约束,由主键、外键、非空、唯一、检查5种约束
启用表的只读状态便于备份和导出表:alter table 表名 read only;启用表的读写状态:alter table 表名 read write;

Oracle事务:有一组DML组成的逻辑工作单元,有原子性、一致性、独立性和持久性

序列sequence:数值生成器,通常用于生成主键值,

dual是Oracle提供的最小的工作表,只有一行一列,具有某些特殊功用,只有一条记录:‘X’,习惯上,我们称之为’伪表’,他的存在是为了操作上的方便,因为select都是要有特定对象的.
select count(*) from dual;

索引和同义词的使用
索引:通过关联ROWID和关键值来提升查询速度
同义词:数据库对象的别名,public同义词对所有用户有用,创建需一定权限
创建:create [public] synonym 名称 for object;
删除:drop [public] synonym 名称 for object;

PL/SQL:是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点
官网:https://www.oracle.com/technetwork/database/features/plsql/index.html
PL/SQL developer官网:https://www.allroundautomations.com/
PLSQL Developer 12 注册码
product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le
serial Number:226959
password: xs374ca

配置pl/sql的Database的两种方式:
确保OracleOraDb11g_home1TNSListener和OracleServiceXXXX服务已启动
1.登录时直接在Database选项输入数据库信息:在登录时输入数据库信息 ip:端口/数据库名,如:127.0.0.1:1521/ORCL
2.配置product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora文件,添加一下内容到文档最后,登录时输入如ORCL即可登录
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)

https://www.jikexueyuan.com/course/oracledb/

https://www.oracle.com/technetwork/topics/winsoft-085727.html

https://www.cnblogs.com/xiashiwendao/p/7634240.html

严格来讲SQL会分为三种类型:

1、数据操纵语言(DML):用来操纵数据库中数据的命令。包括:select、insert、update、delete。

2、数据定义语言(DDL):用来建立数据库、数据库对象和定义列的命令。包括:create、alter、drop。

3、数据控制语言(DCL):用来控制数据库组件

用select * from tab;来查询用户下的表
查看表结构用:DESC 表名称

https://www.cnblogs.com/adforce/p/3312252.html
全局数据库名:就是一个数据库的标识,在安装时就要想好,以后一般不修改,修改起来也麻烦,因为数据库一旦安装,数据库名就写进了控制文件,数据库表,很多地方都会用到这个数据库名。
启动数据库:也叫全局数据库,是数据库系统的入口,它会内置一些高级权限的用户如SYS,SYSTEM等。我们用这些高级权限账号登陆就可以在数据库实例中创建表空间,用户,表了。

查询当前数据库名:select name from v$database;

我们访问Oracle都是访问一个实例,但这个实例如果关联了数据库文件,就是可以访问的,如果没有,就会得到实例不可用的错误。
实例名指的是用于响应某个数据库操作的数据库管理系统的名称。她同时也叫SID。实例名是由参数instance_name决定的
查询当前数据库实例名:select instance_name from v$instance;

从oracle9i版本开始,引入了一个新的参数,即数据库服务名。数据库的逻辑表示,它是数据库呈现给客户机的方式。参数名是SERVICE_NAME。如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。

网络服务名(NET SERVICES NAME)
         它是“连接描述符”简称,连接描述符是网络连接目标特殊格式的描述,它包括网络协议、主机名称或地址、和目标服务
         在Oracle7和Oracle8版本,目标服务由Oracle系统标识符(SID)来标识,而Oracle8i、Oracle9i则通过数据库服务名来来标识。保存tnsnames.ora文件中在格式如下:
 myDB =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.1)(PORT = 1521))
     )
     (CONNECT_DATA =
       (SERVICE_NAME = testDB.ChinaMobile.com)
     )
   )

若要向ORACLE代理商购买ORACLE,是以用户数来算钱的。那么,这个“用户”跟我们在ORACLE中通过

CREATE USER USERNAME IDENTIFIED BY PASSWORD创建的用户是不同概念,“用户数”指的是并发访问用户数,

(我理解是同时间访问同一个内存地址的进程数)。要是我买了8个用户的,可以建几十、上百个用户也没问题,只要峰值达不到并发数就可以了。

打个比方,你的名字叫小明,但是你有很多外号。你父母叫你小明,但是朋友都叫你的外号。
这里你的父母就是oracle实例,小明就是sid,service name就是你的外号。
sid用于实例区分各个数据库,service name用于外部链接。

一个Oracle Server由一个Oracle实例和一个Oracle数据库组成。
即:Oracle Server = Oracle Instance + Oracle Database

Oracle实例包括了内存结构(SGA)和一系列后台进程(Background Process),两者合起来称为一个Oracle实例,即:Oracle Instance = SGA + Background Process

数据库逻辑组织结构
表空间、段、区、块
一个数据库由一个或多个表空间组成,一个表空间只能属于一个数据库
一个表空间由一个或多个多个数据文件组成,一个数据文件只能属于一个表空间
一个数据文件由一个或多个操作系统块组成,每一个操作系统块只能数以一个数据文件
一个表空间可以包含一个或多个段,一个段只能属于一个表空间
一个段由一个或多个区组成,每一个区只能属于一个段
一个区由一个或多个Oracle 块组成,每一个Oracle块只能属于一个区
一个区只能属于一个数据文件,数据文件的空间可以分配到一个或多个区
一个Oracle 块由一个或多个操作系统块组成,一个操作系统块是一个Oracle块的一部分

https://blog.csdn.net/prince_lintb/article/details/78772999

pl/sql plus: "/"表示执行

scott库:https://www.2cto.com/database/201805/742911.html

https://www.cnblogs.com/adforce/p/3312252.html
http://www.cnblogs.com/kscnchina/p/4570865.html

声明时,变量以v_开头,常量以c_开头

https://blog.csdn.net/michaelehome/article/details/79464214

select userenv(‘language’) from dual;
NLS_LANG=“AMERICAN_AMERICA.AL32UTF8”

字符集:https://www.cnblogs.com/kaishirenshi/p/9018343.html

本地动态sql

SQL环境 begin … end pl/sql环境

一组SQL语句操作要成为事务,数据库管理系统必须保证这组操作的原子性(Atomicity)、一致性(consistency)、隔离性(Isolation)和持久性(Durability),这就是ACID特性。

MyBatis

发表于 2018-12-10 | 分类于 Java

Java持久化框架 瞬态+持久态

iBatis-MyBatis
apache-google-github

SQL语句与代码分离;面向配置编程;良好支持复杂数据映射;动态SQL

https://github.com/mybatis/mybatis-3
http://www.mybatis.org/mybatis-3/zh/index.html

日志配置
https://www.cnblogs.com/zhaozihan/p/6371133.html

MyBatisg工作流程

  1. 读取配置文件
  2. 生成SqlSessionFactory,表示和数据库的连接,一般是程序级的生命周期
  3. 简历SqlSession
  4. 调用MyBatist提供的API
  5. 查询Map配置
  6. 返回结果
  7. 关闭SqlSession
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>

map文件引用
1.相对路径 2.绝对路径 3.包路径

MyBatis配置文件:基本配置文件+映射配置文件

typeAliases标记定义别名,需要environments标记之前

map文件方式+注解方式(接口方式)

mappers里面3种写法:resource/class/package

Select配置属性说明
两者只能有一个成立
resultType
resultMap解决复杂查询时的映射问题,如属性为对象

parameterType封装hashmap,key既是key也是sql形参
parameterType封装对象如User,对象参数自动匹配属性,如果对象属性和列名不一样用别名

返回多上记录时MyBatis自动封装成List

事务处理:
MyBatis事务处理由两种方式处理:JDBC+MANAGED

每张表单独的一个配置文件,方便管理

MyBatis自动id返回,

1
2
3
one.setUserName("123");
session.insert("insertOne",one);
System.out.println(one.id); //可以正常获取id

高级查询
关联查询
联合查询:association
构造查询:POJO添加构造函数,同时确保要有默认构造函数,防止构造函数重新后找不到默认构造函数
子查询:所有联合查询,都可以通过子查询替换,但是他让查询成了N+1次的查询

子查询和联合查询的区别:
联合查询一次查询占用资源大,子查询N+1次查询占用资源可大可小,MyBatis中子查询可能速度比联合查询速度高如果开启了懒加载的话
懒加载的使用:配置要在配置别名之前

集合查询:Collection标记,适用于查询的对象还有一个集合引用的事后
鉴别器:discriminator标记
javaType属性:
Column属性:
Case子标记:

MyBatis动态SQL:动态生成SQL

https://www.aliyun.com/jiaocheng/811373.html

https://www.jikexueyuan.com/course/oracledb/1-0-0-0/

CentOS查看硬件信息

发表于 2018-11-26 | 分类于 Linux
  • 操作系统信息:lsb_release -a ;uname -a
  • 查看网卡型号:lspci | grep Ethernet controller
  • 查看硬盘信息:df -ah
  • 查看内存信息:cat /proc/meminfo
  • 查看CPU信息:more /proc/cpuinfo | grep “model name”

Linux nc命令使用

发表于 2018-11-26 | 分类于 Linux

https://www.cnblogs.com/jjzd/p/6306273.html

https://blog.csdn.net/zhangxiao93/article/details/52705642

1…789…50
行锋

行锋

496 日志
15 分类
74 标签
GitHub E-Mail
自古写字楼如青楼,不许楼里见白头
© 2015 — 2019 行锋
博客全站共229.9k字