zoukankan      html  css  js  c++  java
  • linux入门

    安装CentOS

    安装虚拟机

    http://www.vmware.com

    创建虚拟机

    创建虚拟机时,选择稍后安装操作系统

    创建完成后,可以设置虚拟机的内存、处理器等。

    • 处理器设置页面
      【虚拟化Intel Vt-x/EPT或AMD-V/RVI(V)】的作用是在虚拟机需要处理大数据量时,勾选之个选择后,能够处理得更加快速,但会占用系统资源

    • CD/DVD(IDE)
      默认【启动时连接】即可
      初始安装系统,勾选【使用ISO映像文件(M)】,并选择ISO映像文件

    • 网络适配器
      默认【启动时连接】即可。选择桥接模式。
      在VM虚拟机这个软件安装完后,在电脑的【控制面板】的【网络连接】中会出现两个网卡
      【VMware Virtual Ethernet Adapter for VMnet1】与【VMware Virtual Ethernet Adapter for VMnet8】
      桥接模式:这个模式是直接使用真实的物理网卡,会独立占用IP
      NAT模式:可以上网,使用【VMware Virtual Ethernet Adapter for VMnet8】这个虚拟网卡与真实机进行通信
      仅主机模式:不可以上网,使用【VMware Virtual Ethernet Adapter for VMnet1】这个虚拟网卡与真实机进行通信
      如果选择了【NAT模式】或【仅主机模式】,则虚拟机只能与本机通信,而不能直接与局域网内的其它机器通信

    • 拍摄快照
      点击VM虚拟机工具栏中的【拍摄此虚拟机的快照】
      快照这个功能,对学习很方便

    系统分区

    • 系统分区

    主分区:最多只能有4个。硬盘结构决定,每个扇区512B,其中64B是记录分区(16B记录一个分区)
    扩展分区:最多只能有1个;主分区加扩展分区最多有4个;不能写入数据,只能包含逻辑分区。
    逻辑分区

    • 格式化

    格式化不是为了清空数据,而是为了写入文件系统(如FAT16、FAT32、NTFS、EXT2、EXT3、EXT4等)。
    把分区划分成相等大小的数据块(block),方便存储文件
    在分区列表里,建立表格,记录每个文件的节点、修改时间、权限、文件保存位置等

    • 分区文件名及挂载

    分区 ---> 格式化 ---> 给每一个分区起一个设备文件名 ---> 起一个盘符

    在linux中每一个硬件,都是文件

    • 设备文件名
      /dev/hda1 (IDE硬盘接口,古老的,速度比较慢)
      /dev/sda1 (SCSI硬盘接口(比较老,速度没SATA快)、SATA硬盘接口)

    • 挂载
      必须分区:
      / 根分区
      swap分区(交换分区,内存2倍,不超过2GB)
      推荐分区:
      /boot 启动分区,200MB

    下载CentOS

    http://www.centos.org

    安装CentOS

    • 为虚拟机设置CentOS的ISO映像文件
      【CD/DVD】 选择 使用ISO映像文件 , 并选择相应的CentOS映像文件

    • 开启虚拟机
      不要安装图形界面

    • 设置root密码为root
      以后测试开发用的都设置为用户名与密码相同

    连接软件

    • SecureCRT
    • WinSCP
    • XShell

    常用目录及作用

    • / 根目录
    • /bin 命令保存目录(普通用户就可以读取的命令)
    • /boot 启动目录,启动相关文件
    • /dev 设备文件保存目录
    • /etc 配置文件保存目录
    • /home 普通用户的家目录
    • /lib 系统库保存目录
    • /mnt 系统挂载目录
    • /media 挂载目录

    • /root 超级用户的家目录
    • /tmp 临时目录
    • /sbin 命令保存目录(超级用户才能使用的目录)
    • /proc 直接写入内在的,不能直接操作
    • /sys 直接写入内在的,不能直接操作
    • /usr 系统软件资源目录
      /usr/bin 系统命令(普通用户)
      /usr/sbin 系统命令(超级用户)
      /var 系统相关文档命令

    在家目录/home/tmp目录操作,其它的一般不要操作

    linux常用命令

    命令提示符(由echo $PS1定义):
    [root@centos7 ~]#
    root: 用户名
    centos7: 主机名

    ~: 家目录
    #超级用户提示符,普通用户提示符为$

    命令基本格式

    命令 [选项] [参数]

    注意:个别命令使用不遵循此格式
    当有多个选项时,可以写在一起
    简化选项与完整选项 -a表示--all

    使用命令ls -lh
    -rw-r--r-- (r读w写x执行)
    第1个字符表示文件类型(-文件 d目录 l软链接文件)
    第2到第4个表示所有者权限 rw-
    第5到第7个表示所属组权限 r--
    第8到第10个表示其他人权限 r--

    文件处理命令

    • 建立目录:mkdir (make directories)
      mkdir -p [目录名]
      -p 递归创建,即,如果父目录不存在,则创建之

    • 切换所在目录:cd (change directory)
      简化操作
      cd ~ 进入当前用户的家目录
      cd
      cd - 进入上次目录
      cd .. 进入上一级目录
      cd . 进入当前目录

    • pwd (print working directory)

    • 删除空目录:rmdir (remove empty directory)

    • 删除文件或目录: rm
      rm -rf [文件或目录] 直接删除,使用时需要注意
      -r 删除目录
      -f 强制

    • 复制命令: cp (copy)
      -r 复制目录
      -p 连带文件属性复制
      -d 若源文件是链接文件,则复制链接属性
      -a 相当于 -pdr

    • 剪切或改名命令: mv (move)
      mv [原文件或目录] [目标目录]

    • 链接命令: ln (link)
      ln -s [原文件] [目标文件] 生成链接文件
      -s 创建软链接

    硬链接特征:

    1. 拥有相同的i节点和存储block块,可以看做是同一个文件
    2. 可通过i节点识别
    3. 不能跨分区
    4. 不能针对目录使用

    软链接特征:

    1. 类似windows快捷方式
    2. 软链接拥有自己的I节点和Block块,但数据块中只保存原文件的文件名和I节点号,并没有实际的文件数据
    3. lrwxrwxrwx l表示软链接 软链接文件权限都为rwxrwxrwx
    4. 修改任意文件,另一个都改变
    5. 删除原文件,软链接不能使用

    文件搜索命令

    locate

    centos7最小安装时,没有locate命令

    locate 文件名 只能搜索文件名
    在后台数据库中按文件名搜索,搜索速度比较快

    /var/lib/mlocate
    locate命令所搜索的后台数据库
    数据库不是实时更新的,应该是每天自动更新一次
    所以使用locate命令时,有可能搜索不出来

    updatedb 更新数据库

    /etc/updatedb.conf配置文件

    • PRUNE_BIND_MOUNTS = "yes" 开启搜索限制
    • PRUNEFS = 搜索时,不搜索的文件系统
    • PRUNENAMES = 搜索时,不搜索的文件类型
    • PRUNEPATHS = 搜索时,不搜索的路径

    whereis与which

    PATH环境变量: 定义的是系统搜索命令的路径 也是查找命令位置的路径

    [root@centos7 etc]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    

    whereis 命令名 只能搜索系统的命令,不能搜索自定义的命令
    搜索命令所在路径及帮助文档所在位置
    -b: 只查找可执行文件
    -m: 只查找帮助文件

    whereis可以看到命令所在位置,还可以看到命令的帮助文档
    which 只能看命令的位置,可以看到命令的别名

    find

    文件搜索的最强大功能find

    搜索文件: find [搜索范围] [搜索条件]

    示例: find / -name install.log
    避免大范围搜索,会非常耗费系统资源
    find 是在系统当中搜索符合条件的文件名。如果需要匹配,使用通配符匹配,通配符是完全匹配

    • find /root -iname install.log 不区分大小写
    • find /root -user root 按照所有搜索
    • find /root -nouser 查找没有所有者的文件
    • find /var/log/ -mtime +10 (modify)查找10天前修改的文件(-10表示10天内,10表示10天当天,+10表示10天以前)
    • find /var/log/ -atime +10 (access)文件访问时间
    • find /var/log/ -ctime +10 (change)改变文件属性
    • find . -size 25k 查找文件大小是25KB的文件(k为小写的k,M为大写的。-25k表示小于25KB的文件,25k表示等于25K,+25k表示大于25K)
    • find . inum 262422 查找i节点是262422的文件

    linux中的通配符

    • * 匹配任意内容
    • ? 匹配任意一个字符
    • [] 匹配任意一个中括号内的字符

    grep

    搜索字符串命令: grep [选项] 字符串 文件名
    在文件中匹配符合条件的字符串
    选项:
    -i: 忽略大小写
    -v: 排除指定字符串
    -a: 将二进制文件当成文本文件进行读取(文件内容中出现乱码的情况)
    -n: 同时输出行号
    --colour: 高亮匹配的文本
    -B 10: 输出前面10行
    -A 10: 输出后面10行
    -C 10: 输出前后10行,相于-B 10 -A 10

    find vs grep

    find命令:在系统当中搜索符合条件的文件名,如果需要匹配,使用通配符匹配,通配符是完全匹配
    grep命令: 在文件当中搜索符合文件中的字符串,如果需要匹配,使用正则表达式进行匹配,正则表达式时包含匹配

    帮助命令

    man 命令
    如: man ls

    help shell内部命令 获取shell内部命令的帮助
    例如:
    whereis cd 确定是否为shell内部命令(没有可执行文件)
    help cd 获取shell内部命令的帮助

    info 命令 详细命令帮助info
    回车 进入子帮助页面(带有*号标记)
    u 进入上层页面
    n 进入下一个帮助小节
    p 进入上一个帮助小节
    q 退出

    压缩与解压命令

    常用压缩格式: .zip .gz .bz2 .tar.gz .tar.bz2

    zip

    最小安装没有zip命令

    zip 压缩文件名 源文件 # 压缩文件
    zip -r 压缩文件名 源目录 # 压缩目录

    unzip 压缩文件名 # 解压文件

    gz只能压缩文件

    gzip 源文件 # 压缩为.gz格式的压缩文件,源文件会消失
    gzip -c 源文件 > 压缩文件 # 压缩为.gz格式,源文件保留 (-c为输出到屏,>为重定向输出)
    gzip -r 目录 # 压缩目录下所有的子文件,但是不能压缩目录

    gzip -d 压缩文件 # 解压文件
    gunzip 压缩文件 # 解压文件
    gunzip -r 目录 # 解压目录下所有压缩文件

    .tar.gz与.tar.bz2

    tar -cvf 打包文件名 源文件

    • -c:打包
    • -v:显示过程
    • -f:指定打包的文件名
    • -t:列出归档内容 tar -tvf 打包文件名
    • -x:从归档中解出文件 tar -xvf 打包文件名
    • -z:通过 gzip 过滤归档 tar -zcvf 压缩包名.tar.gz 源文件 tar -zxvf 压缩包名.tar.gz
    • -j:过 bzip2 过滤归档 tar -jcvf 压缩包名.tar.bz2 源文件 tar -jxvf 压缩包名.tar.bz2

    关机和重启命令

    shutdown [选项] 时间 使用这个命令比较安全

    • -c:取消前一个关机命令
    • -h:关机
    • -r:重启

    其他关机命令

    • halt
    • poweroff
    • init 0

    其他重启命令

    • reboot
    • init 6

    系统运行级别
    runlevel查看系统运行级别
    cat /etc/inittab 修改默认运行级别 id:3:initdefault:

    • 0 关机
    • 1 单用户
    • 2 不完全多用户,不含NFS服务
    • 3 完全多用
    • 4 未分配
    • 5 图形界面
    • 6 重启

    退出登录命令
    logout

    其他常用命令

    linux 挂载命令

    mount # 查询系统中已挂载的设备
    mount -a # 依据配置文件/etc/fstab的内容,自动挂载
    mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载点

    mkdir /mnt/cdrom/ # 建立挂载点
    mount -t iso9660 /dev/sr0 /mnt/cdrom/ # 挂载光盘
    umount /mnt/cdrom/ # 卸载挂载点

    挂载U盘(linux默认不支持NTFS文件系统的)
    fdisk -l # 查看U盘设备文件名
    mount -t vfat /dev/sdb1 /mnt/usb/

    linux用户登录查看命令

    w 用户名

    • USER: 登录用户名
    • TTY: 登录终端
    • FROM: 从哪个IP地址登录
    • LOGIN@: 时间
    • IDLE: 用户闲置时间
    • JCPU: 指的是和该终端连接的所有进程占用的时间
    • PCPU: 是指当前进程所占用的时间
    • WHAT: 当前正在运行的命令

    who 用户名

    • 用户名
    • 登录终端
    • 登录时间(登录来源IP)

    last # 所有用户的登录信息(包括系统启动时间)
    last命令默认是读取/var/log/wtmp文件数据

    • 用户名
    • 登录终端
    • 登录IP
    • 登录时间
    • 退出时间 (在线时间)

    lastlog # 查看所有用户的最后一次登录信息
    lastlog命令默认是读取/var/log/lastlog文件数据

    shell 基础

    查看当前使用的shell:echo $SHELL
    查看支持的shell: cat /etc/shells
    进入子shell后,使用命令exit即可退出
    查看父子shell:

    echo输出命令

    echo [选项] [输出内容]
    -e:支持反斜线控制的字符转换

    控制字符 作用
    a 输出警告音
     退格键
    换行符
    回车键
    制表符
    v 垂直制表符
    nnn 按照八进制ASCII码表输出字符
    xhh 按照十六进制ASCII码表输出字符

    脚本编写

    #!/bin/bash声明使用bash开头,若当前使用其它shell时,执行这个脚本时,也会自动使用bash

    赋予执行权限 chmod +x hello.shchmod 755 hello.sh
    执行: ./hello.sh 或调用bash来执行 bash hello.sh

    命令别名与快捷键

    alias # 查看系统中所有的命令别名
    alias 别名='原命令' # 设定命令别名
    unalias 别名 # 删除别名
    
    
    # 别名永久生效与删除别名  
    vi ~/.bashrc # 写入环境变量配置文件
    source ~/.bashrc # 写环境变量马上生效,不需要重新登录
    

    命令生效顺序

    • 第一顺序执行用绝对路径或相对路径执行的命令
    • 第二顺序执行别名
    • 第三顺序执行Bash的内部命令
    • 第四顺序执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

    常用快捷键

    • CTRL + C 强制终止当前命令
    • CTRL + L 清障
    • CTRL + A 光标移动到命令行首
    • CTRL + E 光标移动到命令行尾
    • CTRL + U 从光标所在位置删除到行首
    • CTRL + Z 把命令放入后台
    • CTRL + R 在历史命令中搜索

    历史命令

    history # 列出历史命令
    history -c # 清空历史命令
    history -w # 把缓存中的历史命令写入历史命令保存文件~/.bash_history
    

    ~/.bash_history 这个文件保存的上次登录正常退出后保存的命令

    历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
    HISTSIZE=1000

    历史命令的调用

    • 使用上、下箭头调用以前的历史命令
    • 使用"!n"重复执行第n条历史命令
    • 使用"!!"重复执行上一条命令
    • 使用"!字串"重复执行最后一条以字串开头的命令

    输出重定向

    标准输入输出

    设备 设备文件名 文件描述符 类型
    键盘 /dev/stdin 0 标准输入
    显示器 /dev/sdtout 1 标准输出
    显示 /dev/sdterr 2 标准错误输出

    输出重定向

    类型 符号 作用
    标准输出重定向 命令 > 文件 以覆盖的方式,把命令的正确输出,输出到指定的文件或设备当中。
    标准输出重定向 命令 >> 文件 以追加的方式,把命令的正确输出,输出到指定的文件或设备当中。
    标准错误输出重定向 命令 2> 文件 以覆盖的方式,把命令的正确输出,输出到指定的文件或设备当中。
    标准错误输出重定向 命令 2>> 文件 以覆盖的方式,把命令的正确输出,输出到指定的文件或设备当中。

    正确输出和错误输出同时保存

    符号 作用
    命令 > 文件 2>&1 以覆盖方式,把正确输出和错误输出保存到同一个文件当中。
    命令 >> 文件 2>&1 以追加方式,把正确输出和错误输出保存到同一个文件当中。
    命令 &> 文件 以覆盖方式,把正确输出和错误输出保存到同一个文件当中。
    命令 &>> 文件 以追加方式,把正确输出和错误输出保存到同一个文件当中。
    命令 >> 文件1 2>>文件2 把正确的输出追加到文件1中,把错误的输出追加到文件2中。

    输入重定向

    wc -c # 统计字节数
    wc -w # 统计单词数
    wc -l # 统计行数
    

    输入重定向,一般很少使用,在软件安装打补丁时,可能会用到

    wc -l < hello.sh # 统计hello.sh

    多命令执行顺序

    多命令执行符 格式 作用
    ; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑关系。不管前面命令对错,都会执行
    && 命令1&&命令2 逻辑与。当命令1正确执行,则命令2才会执行;当命令1执行不正确,则命令2不执行
    || 命令1

    管道符

    # 格式:命令1的正确输出作用命令2的操作对象
    命令1 | 命令2
    
    # 当文件过多时,分屏查看文件列表
    ls -lh | more
    
    # 查看8080端口当前并发连接数据(ESTABLISHED表示有人正在连接当前端口,LISTEN表示当前端口被监听等待有人访问)
    netstat -an | grep ESTABLISHED | grep '8080'
    netstat -an | grep ESTABLISHED | grep '8080' | wc -l # 统计当前8080端口并发数量
    

    通配符

    通配符 作用
    ? 匹配一个任意字符
    * 匹配0个或任意多个任意字符,也就是可以匹配任何内容
    [] 匹配中括号中任意一个字符。
    [-] 匹配中括号中任意一个字符,-表示珍上范围
    [^] 逻辑非,表示匹配不是中括号内的一个字符

    ls -lh test*.txt

    bash中其他特殊符号

    符号 作用
    '' 单引号。在单引号中所有的特殊符号,如$ `(反引号),都没有特殊意义
    "" 双引号。在双引号中特殊符号都没有特殊意义,但是$(调用变量值)、 (引用命令)和 `(转义符)是例外
    | 反引号。反引号括志来的内容是系统命令,在Bash中会先执行它。和$()使用一样,不过推荐使用$()`,因为反引号非常容易看错
    $() 和反引号使用一样,用来引用系统命令。
    # 在Shell脚本中,#开头的行代表注释
    $ 用于调用变量的值,如需要调用变量name的值时,使用$name
    转义符,跟在之后的特殊符号将失去特殊含义,变为普通字符

    `

    磁盘管理

    磁盘管理基本命令

    df -h # 以人性化的格式显示磁盘分区使用情况
    du -h # 以人性化的单位统计当前路径的文件大小,-s指定统计目录
    du -sh # 以人性化的单位统计当前目录大小
    

    使用fdisk进行分区

    linux系统中硬件设备都是以文件的形式存在于根目录下的dev目录下
    硬件设备都是由linux系统自动识别的
    必须对硬盘进行分区、格式化、挂载后才能使用

    fdisk -l # 查看磁盘列表  
    
    fdisk /dev/sdb # 进入命令模式
    

    执行fdisk /dev/sdb进入命令模式后,输入m可以查看到帮助
    n 新建分区(有默认使用默认值即可,只能有一个扩展分区,可以有多个逻辑分区)
    p 查看分区情况
    d 删除分区。如果分配有误,需要将扩展分区删除,再重新分配剩余的磁盘空间
    w 写入并退出

    硬盘分区模式

    MBR分区:主分区不超过4个,单个分区容量最大2TB,比较过时,前面的分区方式就是MBR分区
    GPT分区:主分区最多可以支持128个分区,单个分区容量几乎没有限制(18EB),分区就是分区,不需要区分主分区或逻辑分区

    GPT分区不适合安装x86架构的系统,即32位系统

    fdisk只能进行MBR分区
    parted命令,可以进行MBR分区,也可以进行GPT分区

    使用parted进行分区

    没有主分区、扩展分区、逻辑分区,的区分

    直接输入parted命令,即可进入parted分区工具
    help 帮助信息
    select /dev/sdc 选择/dev/sdc这个磁盘进行分区
    mklabel gpt 创建label,如果需要进行MBR分区,则为msdoc,如果为GPT分区,则为gpt
    print 显示当前磁盘分区情况
    print all 显示所有磁盘分区情况

    parted有两种分区模式 交互模式(与fdisk类似,一步步提示)与命令模式(设置参数,一步到位)
    只输入mkpart,则以交互模式一步步创建分区,起始点与结束点的单位是M
    mkpart test 2000 3000 一步到位的命令模式,格式是mkpart 分区名称 起始点 结束点(不包含)

    rm 3 删除分区,数字3为print显示的对应分区号

    unit GB 设置使用的单位,包括创建分区时的单位与使用print显示出来单位

    quit 退出parted分区工具

    分区格式化

    parted工具也可以进行格式化,但其支持的格式比较少
    一般使用mkfs进行格式化

    mkfs.ext3 /dev/sdb1/dev/sdb1分区格式化为ext3格式
    mkfs -t ext3 /dev/sdb1

    挂载分区

    挂载默认位置/mnt
    需要挂载在一个已经存在的位置

    mkdir -p /mnt/test # 创建挂载点  
    mount /dev/sdb1 /mnt/test # 挂载
    umount /mnt/test # 解除挂载
    
    vim + /etc/fstab # 配置自动挂载
    

    vim + /etc/fstab 配置自动挂载
    格式: 设备名称 挂载点 文件类型 defaults 0 0
    示例: /dev/sdb1 /mnt/test ext3 dfaults 0 0

    swap分区

    • 建立一个普通的linux分区

    • 修改分区类型的16进制编码
      fdisk /dev/sdb 查看分区,选择一个分区设置为swap分区
      t 修改系统编码
      l 列出所有编码
      输入82
      w 保存退出

    • 格式化交换分区
      mkswap /dev/sdb6

    • 启用分区
      swapon /dev/sdb6

    • 停止swap分区
      swapoff /dev/sdb6

    用户管理

    /etc/group 存储当前系统中所有用户信息
    Group : x : 123 : user1,user2,user3
    组名称 : 组密码占位符 : 组编号 : 组中用户列表
    手动创建的用户组从500开始

    /etc/gshadow 存储当前系统中用户组的密码信息,每行与/etc/group中的一行行对应
    Group : * : : user1,user2,user3
    组名称 : 组密码 : 组管理者 : 组中用户列表
    组密码为*或为空白时,都认为这个组没有设置密码

    /etc/passwd 存储当前系统中所有用户的信息
    user : x : 123 : 456 : xxxx : /home/user : /bin/bash
    用户名 : 密码占位符 : 用户编号 : 用户组编号 : 用户注释信息 : 用户主目录 : shell类型

    /etc/shadow 存储当前系统中所有用户的密码信息,每行与/etc/passwd中的一行行对应
    user : 单向加密 :::::
    用户名 : 密码 :::::

    基本命令

    # 新建组
    groupadd 组名
    groupadd -g 组ID 组名
    
    # 修改组名
    groupmod -n 新组名 原组名
    # 修改组ID
    groupmod -g 组ID 组名
    
    # 删除组
    groupdel 组名
    
    # 新建用户(指定组名)
    useradd -g 组名 用户名
    # 新建用户(指定个人文件夹)
    useradd -d /home/xxx 用户名
    
    # 为用户添加注释
    usermod -c 注释信息 用户名
    # 修改用户名
    usermod -l 新用户名 原用户名
    # 为用户名指定个人文件夹
    usermod -d /home/xxx 用户名
    # 修改用户所属用户组
    usermod -g 组名 用户名
    
    # 删除用户(不会删除个人文件夹)
    userdel 用户名
    # 删除用户,同时删除个人文件夹
    userdel -r 用户名
    
    # 禁止除root用户外的其他用户登录,文件内容无关紧要
    touch /etc/nologin
    

    进阶命令

    # 锁定用户,不让其登录
    passwd -l 用户名
    # 解锁用户
    passwd -u 用户名
    
    # 清除用户密码
    passwd -d 用户名
    
    # 添加附属组(同时属于多个组,一个主要组,其他附属组)
    gpasswd -a 用户名 附属组名
    # 切换到附属组
    newgrp 组名
    # 删除附属组
    gpasswd -d 用户名 附属组名
    
    # 新创建用户时,同时指定主要组及附属组
    useradd -g 主要组名 -G 附属组名1,附属组名2...
    
    # 修改或添加组密码,会提示输入组密码
    gpasswd 组名
    
    # 显示用户所在的所有组
    groups 用户名
    
    
  • 相关阅读:
    left join的多重串联与groupby
    转换坐标为数字型的函数
    oracle 11g 导出空表
    sql优化
    pl/sql使用技巧
    佳能mp288拆解步骤--绝对原创
    转)delphi chrome cef3 控件学习笔记 (二)
    mac, ios 模拟器
    一个人软件独立开发。
    Delphi在Android下通过WiFI进行调试
  • 原文地址:https://www.cnblogs.com/chencye/p/5975410.html
Copyright © 2011-2022 走看看