zoukankan      html  css  js  c++  java
  • Linux基础

    学习笔记之Linux基础:

    Linux内核源码包
    www.kernel.org

    uname -r:查看当前的内核版本
    3.5.0-23-generic
    主版本号.次版本号.修订版本号-微调patch次数-内核种类
    次版本号为偶数,稳定版本
    次版本号为奇数,开发版本

    软件包
    有Debin Linux提出的Deb软件包管理机制
    Redhat Linux 提出的Rpm软件包管理机制
    ubuntu是基于deb软件包开发的

    ubuntu有两种类型的deb软件包:
    1.二进制软件包(.deb) deb软件包将二进制文件,配置文档,man,info等帮助手册合并在deb软件包中
    2.源码包(.deb-src)

    软件包命名格式:
    sl_3.03-16_i386.deb
    软件包名_软件版本-修订版本_体系结构.deb

    软件包管理工具:
    1.命令行 没有独立操作系统时只能以用户的形式远程登录服务器,这个时候只能选择命令行
    2.文本窗口
    3.图形化界面

    dpkg
    1.离线安装,安装前需要准备软件包
    2.不会检查软件包依赖关系
    sudo:临时借用超级用户权限

    sudo dpkg -i 软件包 : 安装本地的Debin软件包 (后面跟的是软件包的全名)
    sudo dpkg -r 软件名:移除当前安装的软件包(后面跟的是软件名) 只是删除二进制
    文件,会留下配置文件(不完全删除)
    sudo dpkg -P 软件名:移除已安装的软件包和配置文件(完全删除)
    sudo dpkg -L 软件名:列出安装软件包的清单


    apt ubuntu集中式的软件仓库机制:
    软件源配置文件/etc/apt/sources.list,在这个文件中会列出最适合的软件源
    索引文件/var/lib/apt/lists(列一个清单作为软件包的索引)

    1.在线安装,不需要提前准备软件包
    2.会自动检查软件的依赖关系,如果依赖关系不存在,会自动下载和安装
    sudo apt-get upgarde:软件包的全部升级
    sudo apt-get update:扫描软件源配置文件,更新索引文件

    sudo apt-get install 软件名: 安装软件
    1.扫描软件源配置文件和索引文件,找到相应的镜像站点,找到最新版本的软件包
    2.检查软件包依赖关系
    3.下载软件包
    4.解压软件包,完成安装和配置
    sudo apt-get remove 软件名:卸载软件(不完全卸载,会留下配置文件)
    sudo apt-get --purge remove 软件名:(完全卸载软件)
    sudo apt-get install 软件名 --reinstall:重新安装软件
    sudo apt-get check:检查软件包依赖关系
    sudo apt-get -f install:修复软件包依赖关系

    软件包缓冲区: /var/cache/apt/archives
    sudo apt-get clean:删除软件包缓冲区
    sudo apt-get autoclean:(保留最新版本的软件包,只删除重复的软件包)
    下载源码包: sudo apt-get source 软件名 注意:下载的源码包存放路径就是命令的执行路径


    修改镜像地址:
    1.sudo software-center
    2.选左上角Edit,下拉菜单中点击software sources
    3.选download form中的other
    4.选择china的服务器,点chose service
    5.退出窗口
    6.执行sudo apt-get update,更新索引文件


    shell命令
    linux中使用的是bash shell,功能是完成用户与内核的交互,将用户的命令解析成操作系统明白的指令(命令解释器与windows中的dos.exe相同)
    shell命令格式:
    通常一个命令包括三个部分:
    1.命令名称: 严格区分大小写
    2.选项:由'-'或者'--'引导,用于改变命令执行的类型,选项可以同事有多个
    3.参数:命令执行的对象,参数也可以同时使用多个
    大多数情况下,命令参数和选项位置可以互换
    三个要素之间必须用空格隔开


    常用命令
    linux@ubuntu:~$
    linux:用户名 whoami
    ubuntu:主机名 hostname
    ~:家目录 pwd(显示用户当前所在路径)
    $:代表当前用户为普通用户
    #:代表当前用户为超级用户(root)

    history:查询命令历史记录
    history 20:显示最近的20条命令记录
    history -c:清楚当前命令记录
    历史命令被保存在家目录下的配置文件.bashrc中
    HISTSIZE:决定能够保存多少条命令
    echo $HISTSIZE 打印HISTSIZE
    在.bash_history文件中存放了之前使用过的历史命令
    HISTFILESIZE:决定在文件中保留多少条命令记录

    配置修改:
    1.通过命令行修改:临时性,只在当前终端有限
    2.修改配置文件:永久生效
    保存修改后的配置文件,source+配置文件名(重启配置文件,使配置文件立即生效)

    alias:给已知或已存在的命令起别名
    格式:
    alias 别名='已知或已存在的命令'
    临时修改;
    取消别名:unalias+别名

    man:
    man man
    man 1:shell 命令
    man 2:系统调用函数
    man 3:库函数
    man 5:配置文件
    man 7:网络协议族

    chmod:修改文件权限
    chmod u/g/o+r/w/x 文件名
    u:用户
    g:用户组
    o:其他
    r:读权限
    w:写权限
    x:执行权限
    -:无权限

    chmod 777 文件名:将文件权限修改为最高
    777:这个数组是由八进制得到,每个文件都有对应的三组权限例如:rw-rw-r-- 有权限代表1,
    无权限代表0,三个二进制组合成一个八进制数,最终得到三个八进制数,就是该文件的所有权限

    sudo shutdown -h now/+60 马上关机/60分钟后关机
    sudo shutdown -r now/+60 马上重启/60分钟后重启

    shell命令中的特殊字符

    通配符:
    本质:批量处理文件
    *:代替任意长度的任意字符
    ?:代替一个长度的任意字符
    []:
    ls -l [123].c:显示.c前是一个长度且为123字符的文件的详细信息
    ls -l [1-3].c:同上
    ls -l [^123].c:显示除了.c之前字符为123的文件的详细信息

    管道符:
    |
    格式:命令1|命令2|命令3
    功能:链接多条命令,完成特殊操作
    (把前面一条命令的输出结果作为后面命令的输入)
    要求:管道前的命令具有输出能力,管道后的命令具有输入能力

    具有输出功能的命令:
    ls:列出当前路径下的内容
    cat + 文件名:列出文件里面的全部内容
    head -20 文件名:列出文件前20行的内容
    tail -20 文件名:列出文件后20行的内容

    wc:(word count):统计内容的行数,单词数,字符数
    wc + 文件名:统计文件的行数,单词数,字符数
    wc也可以从终端输入数据进行统计
    wc -l:统计内容的行数
    wc -w:统计内容的单词数
    wc -c:统计内容的字符数

    ctrl + d:结束终端输入

    例如:
    ls /bin | wc -w
    sort 文件名:对文件内容进行排序,显示

    具有输入能力的常用命令:
    grep:查找字符串
    grep "string" 文件名:在文件中查找有字符串string的行,显示到终端
    grep "^string" 文件名:显示所有开头为string的行
    grep "string$" 文件名:显示所有结尾为string的行
    grep "^string$" 文件名: 显示所有只有string的行

    -n:显示行号
    -R:递归子目录查找
    grep "string" -n -R *:递归子目录查找文件中所有含string的行数和对应的文件名


    vim编辑器下查找字符串
    在命令模式下,直接输入/字符串 ,回车
    如果有该字符串存在,以高亮的形式显示
    n:光标跳到下一个
    N:光标跳到上一个
    取消高亮:在底行模式下输入nohl回车

    输入输出重定向
    改变shell命令或程序默认的输入输出,定位到新的目标中
    格式:
    shell命令 重定向符 文件
    输出重定向符: > >>
    ls > 1.c:(新建模式) 如果文件1.c不存在,先创建文件1.c,再写入数据
    如果文件存在,抹去原来的内容,重新写入新的内容
    ls >> 1.c (追加模式) 如果文件不存在,先创建文件1.c,再写入数据
    如果文件存在,以追加的方式进行数据的写入

    错误输出重定向
    2> &>:(新建模式)
    2>> &>>:(追加模式)
    2> 和 2>>:只会将错误信息输出重定向到文件中
    &> 和&>>:错误和正确的信息都会重定向到文件中

    ls -l 文件名 > right.c 2> wrong.c
    正确的保存在right.c文件中 错误的保存在wrong.c中

    输入重定向:<
    把文件作为内容输入给命令
    wc < filename

    命令置换符
    功能:把一条命令的输出结果作为另外一条命令的参数
    格式:
    命令1 `命令2`
    把命令2输出结果给命令1作为参数
    ls `pwd`
    ls -l `ls 18072`
    ls -l `ls -a 18072`


    cut:截取字符段
    格式:
    -d:指定分隔符
    -f:根据指定分隔符,截取指定的字符段内容
    cut -d ':' -f 1,4,5
    根据':'截取字符段1,4,5中的内容

    练习题:
    前提:把/etc/passwd拷贝一份到你们的家目录
    要求使用:cat head tail grep cut | `` >
    查找文件中linux的信息输出到user.txt当中
    1,linux所在的行
    grep "linux" -n passwd > user.txt
    2,linux
    grep "linux" -n passwd | cut -d ':' -f 2 > user.txt

    Diff
    比较文件:
    用于比较文件内容,比较两个不同版本的文件时可以找到改动的地方,一行一行比较
    diff 1.c 2.c 比较1.c和2.c的不同之处,显示在终端上
    <:文件1
    >:文件2
    -----:分隔符
    c:change修改
    a:add添加
    d:delete删除

    如果要生成补丁文件则需要将显示结果输出重定向到以.log为结尾的补丁文件中
    diff 1.c 2.c > 3.log

    patch
    用法将补丁文件打补丁到需要打补丁的文件
    例如:
    patch 1.c 3.log
    将diff比较输出重定向的补丁文件3.log安装到1.c上
    撤销打补丁:
    patch -R 1.c < 3.log
    -R:撤销打补丁

    比较目录:
    注:
    比较目录文件生成补丁文件操作如下:
    -r:比较子目录文件
    -u:以合并的方式来显示文件内容的不同,同一格式输出
    -N:比较空目录时,若文件A仅出现在某个目录下,显示时,另一个目录将缺席文件视为空

    1.通过比较两个文件,生成补丁文件
    diff -ruN dir1 dir2 > diff.txt
    2.切换到修要修改内容的文件所在的路径下
    cd dir1
    3.完成打补丁操作
    patch -p1 < ../diff.txt
    -p:去除相对路径层数的数量
    4.撤销打补丁操作
    patch -Rp1 < ../diff.txt
    -R:撤销有新旧文件比较产生的不同之处

    压缩和解压缩

    归档:只是整理文件,不会改变文件总大小
    压缩:压缩文件内容,将文件打包,文件总大小一般变小,节约磁盘空间

    linux下常用压缩软件:
    注意:压缩软件都不能对目录压缩,只能对单个文件压缩

    gzip:linux使用最多的压缩软件,移植性好
    格式:
    gzip 文件名:默认得到的压缩文件格式: 文件名.gz
    -l :查看文件压缩后信息
    -num:压缩等级数越大,压缩力度也就越大
    -d:解压缩 gunzip 压缩文件.gz:解压压缩文件

    bzip2:压缩力度大
    格式:
    bzip2 文件名:默认得到的压缩文件格式: 文件名.bz2
    bunzip2 压缩文件.bz2:解压压缩文件
    注意:不能用两种压缩方式混合压缩文件


    zip:Windows下支持zip格式
    格式:
    zip 文件名.zip 文件名:得到压缩文件 文件名.zip文件
    unzip 文件名.zip :解压缩文件

    tar:归档整理,只整理文件没有压缩
    选项: -c 创建
    -f 指定生成文件名
    -v 显示执行过程
    -x 释放
    -z 指定使用gzip完成压缩
    -j 指定使用bzip2完成压缩

    把目录文件打包并压缩 tar -czvf 新生成的归档文件名字.tar.gz 归档压缩的目标文件
    释放解压缩文件 tar -xvf 文件名.tar.gz

    用户管理命令

    find -name 文件名:
    查找当前目录下(包括子目录)需要查找的文件显示路径在终端上(在命令执行的当前路径下查找)

    echo:
    在终端上打印一段文字,一般起提示作用,一般用于脚本 -n : 输出文字后不换行

    命令帮助手册查询:
    1.man手册 man 1 命令名
    2.help选项 命令名 --help
    3.info手册 info 命令名

    df:查询磁盘使用情况
    df -T:显示磁盘信息
    df -h:带单位显示信息

    du:查询文件占用磁盘空间大小
    du 文件名:查看文件大小,一般kb为单位显示
    -h:会把单位显示出来

    passwd:修改当前用户密码 linux下每一个用户都有自己的账号和密码
    root:可以修改所有人的密码
    普通用户:只能修改自己的密码(sudo 可以改变)

    su:临时改变用户身份
    su root:临时切换到超级用户 (工作目录没有切换)
    su - root:环境变量也切换到root用户的环境变量 export:(环境变量打印)
    exit(退出当前用户):
    临时切换身份后,记得用exit退出!

    用户属性:配置文件在/etc/passwd
    linux: x :1000:1000:ubuntu,,,:/home/linux:/bin/bash
    linux:用户名
    x:密码(隐藏了)
    1000:用户编号(UID)
    1000:用户组编号(GID)
    ubuntu:主机名
    /home/linux:家目录所在位置(工作目录)
    /bin/bash:默认使用的shell命令解析器

    用户组属性配置文件:/etc/group
    linux:x :1000
    linux:用户组名
    x:用户组密码
    1000:用户组编码(GID)

    创建新用户:sudo adduser 用户名
    1.新建用户
    2.新建用户组(设置GID)
    3.将新建用户添加到新建组内,设置(UID)
    4.创建家目录
    5.拷贝/etc/skel到家目录下
    6.设置密码 和 基本信息

    检查用户是否创建成功:
    1.检查/etc/group
    2.检查/etc/passwd
    3.检查家目录 ls /home
    4.检查家目录内容是否和/etc/skel相同

    删除用户:
    sudo deluser 用户名
    注意:如果删除指定用户后,其用户组内没有成员,系统自动删除用户组

    sudo deluser --remove-home 用户名:
    删除用户时将工作目录同时移除

    adduser的配置文件 :
    /etc/adduser.conf中决定了创建时用户的ID用户组ID,
    shell和家目录位置 FIRST_UID=1000 LAST_UID=29999 FIRST_GID=1000 LAST_GID=29999 DSHELL=/bin/bash DHOME=/home SKEL=/etc/skel

    创建用户组:
    sudo addgroup 组名:
    删除用户组:
    sudo delgroup 组名:注意:删除用户组的时候要确定组内没有用户

    修改用户属性:usermod

    修改用户名字及用户的工作目录:
    sudo usermod -d /home/newname -m -l newname oldname
    -m:文件不存在,强制创建
    -l:新的用户名

    更改用户所在组
    sudo usermod -g 新的组 用户名

    新添加了一个用户没有sudo 权限,解决方法:
    1.root
    2.打开配置文件 vi /etc/sudoers
    3.添加内容:用户名 ALL=(ALL:ALL) ALL
    4.shift+:进入底行模式 w !sudo tee % 保存不了用这个保存


    进程管理命令
    程序执行一次的过程就是进程
    ps:查看进程状态(windows的任务管理器)
    ps -ef:查看进程的信息
    UID:用户名 PID:进程编号 PPID:父进程编号

    ps -aux:查看进程的状态
    USER PID %CPU %MEM STAT
    用户 进程 cpu占有率 内存占有率 进程状态

    进程状态:
    s:阻塞
    +:进程在前台运行
    R:运行
    T:暂停 ctrl + z : 暂停进行
    Z或者D:僵尸态(资源没有被正确回收) ctrl + c结束进程

    top:进程监视
    b,B进行翻页 q:退出top

    kill:给进程发送信号
    kill -l:列出kill命令所有支持的信号

    格式:kill -信号编号 进程PID (默认发送15)
    kill -9 PID:杀死进程
    kill -18 PID:让进程结束暂停态

    文件系统
    文件系统是操作系统重要的组件,组织管理计算机上大量的存储文件,并提供用户的交互接口

    磁盘文件系统:
    FAT,FAT16,FAT32,NTFS windows上的文件系统
    EXT3,EXT4 日志文件系统(linux上主流的文件系统,可以回溯时间点)

    sudo fdisk -l:查看磁盘分区情况

    /dev/sda1: sd:SCSI(SATA)的硬盘 hd:IDE的硬盘(现在不太用)
    a:代表硬盘标号,第一块硬盘
    1:分区编号(1~4,主分区) 交换分区(swapping) 内存的1.5~2倍左右,
    一般在硬盘的起始位置 缓解cpu和内存压力

    网络文件系统 NFS(网络文件系统),samba 通过网络获取文件系统

    文件系统逻辑结构: windows:目录属于分区
    linux:分区属于目录

    linux:一切接文件 bcd-lsp
    b:块设备文件(存储设备) c:字符设备(键盘,鼠标) d:目录文件
    -:普通文件 l:链接文件 s:套接字文件 p:管道文件

    /:根目录
    /bin:可执行程序 /etc:配置文件 /lib:库文件 /usr/include:C库文件
    /dev:设备驱动 /mnt:文件系统挂载点 /boot:系统启动文件

    文件系统相关的命令
    ls -i:显示文件的inode号,inode号唯一

    file + 文件名:查看文件的类型

    ln:创建连接文件

    软链接:(符号链接):相当于快捷方式
    格式:
    ln -s 源文件 软链接文件名(源文件在修改时,写上绝对路径,不然可能导致链接文件失败)
    1.如果修改源文件或者链接文件,另一个文件也会做同步修改
    2.删除源文件,软连接文件失效,再次创建同名的文件时,软链接文件生效
    3.软链接文件会占用存储空间(独立的inode号)
    4.可以对目录创建软链接
    5.可以跨文件系统,但是创建的软链接必须是处于linux环境下

    硬链接:相当于给源文件起别名,利用(inode)产生新的名字
    格式:
    ln 源文件 硬链接文件名
    1.如果修改源文件或者链接文件,另一个文件也会做同步修改
    2.删除源文件,硬连接文件不失效
    3.硬链接文件不会占用存储空间(inode号和原文件一样)
    4.不可以对目录创建硬链接
    5.不可以跨文件系统

    网络管理命令
    ifconfig:查询当前ip

    sudo ifconfig 网卡名(eth0) IP地址 :临时修改
    sudo dhclient(动态获取ip):临时获取

    sudo /etc/init.d/networking restart :网络重启

    ping -c 3 www.baidu.com
    检查与百度通不通,-c后是指定次数

    shell

    编译性语言 C语言
    1.需要编译
    2.编译时不能出错,运行时也不能出错
    3.执行效率高

    解释性语言 脚本语言
    1.不需要编译
    2.运行时出错位置不会影响后期代码运行
    3.执行效率较差

    shell脚本:shell命令的有序集合

    创建脚本文件:
    1.以.sh为结尾
    vi xxx.sh

    2.赋予执行权限
    chmod u+x xxx.sh chmod 777 xxx.sh

    3.运行
    (1) ./xxx.sh
    (2) bash xxx.sh
    (3) source xxx.sh

     

    shell脚本语言

    变量:
    1.没有数据类型 没有存储类型
    2.引用变量时加$

    用户自定义变量:
    注:
    1.变量和赋值符号之间不能出现空格
    2.脚本中""和''用法一致
    echo:打印命令
    echo "数据" 按原型输出

    1 var=10
    2 var1="hello world"
    3 var2='hello         world'
    4 
    5 echo $var
    6 echo $var1
    7 echo "$var2"
    var

    环境变量:
    export env

    位置变量:(类似命令行传参)
    $0: 类似argv[0]
    $1~&9: argv[1] ~ argv[9] ${10}
    $*和$@: 显示所有的位置变量 也不显示$0
    $#: 类似argc 统计位置变量的个数不计算$0
    $?: (1)判断上一条shell命令的执行和结果
    0成立 1不成立
    (2)函数返回值
    $$: 显示当前脚本文件的进程编号


    shell语句:
    说明性语句:注释 #
    #!/bin/bash 告诉编译器使用bash shell执行文件


    功能性语句:
    (1)输入语句:
    read:
    read 变量:从标准输入读入一行作为数据保存到变量

     1 #!/bin/bash 
     2 
     3 
     4 
     5 #read var
     6 read var1 var2 var3
     7 
     8 
     9 #echo $var
    10 echo $var1 
    11 echo $var2
    12 echo $var3
    read

    (2)运算语句:
    expr:
    运算符:+,-,/,%,\*
    格式:expr 变量1 运算符 变量2
    注:
    1.运算符左右两边必须出现空格
    2.将命令的结果赋值给其他变量时需要添加``命令置换符
    例如:
    var=`expr $num1 + $num2` == ((var = num1 + num2))

     1 #!/bin/bash 
     2 
     3 read num1 num2
     4 
     5 var=`expr $num1 \* $num2`
     6 
     7 ((var1 = num1 + num2))
     8 #var1=`ls -l`
     9 
    10 echo $var
    11 echo $var1
    expr

    (3)测试语句:
    test:
    (1)判断字符串 类似strcmp
    test 字符串1 =/!= 字符串2
    []代替test
    [ 字符串1 =/!= 字符串2 ]
    注:'['的右边以及']'的左边必须出现空格

    1 #!/bin/bash 
    2 
    3 num1='hello'
    4 num2='hello'
    5 
    6 #test $num1 = $num2
    7 [ $num1 = $num2 ]
    8 echo $?
    test_string

    (2)比较数值大小
    test 数值1 选项 数值2
    选项: -eq 等于 -ne 不等于 -gt 大于 -ge 大于等于
    -lt 小于 -le 小于等于
    [ 数值1 选项 数值2 ]
    例如:100<num<200
    两句test: && 与 ||或
    test $num -gt 100 && test $num -lt 200
    [ $num -gt 100 ]&&[ $num -lt 200 ]
    一句test: -a 与 -o或
    test $num -gt 100 -a $num -lt 200
    [ $num -gt 100 -a $num -lt 200 ]

    #!/bin/bash 
    
    
    
    read num
    
    
    test $num -gt 100 && test $num -lt 200
    echo $?
    
    [ $num -gt 100 ]&&[ $num -lt 200 ]
    echo $?
    
    test $num -gt 100 -a $num -lt 200
    echo $?
    
    [ $num -gt 100 -a $num -lt 200 ]
    echo $?
    test_num

    (3)测试文件属性
    test 选项 文件名
    选项: -e 是否存在 -f 是否为普通文件 -d 是否为目录文件
    -r -w -x
    ! -e 是否不存在
    [ 选项 文件名 ]

    逻辑语句:
    if:二分支语句
    if 表达式
    then
    命令表
    fi
    注:
    1.判断表达式,成立执行then中语句块,失败不执行
    2.if和表达式之间有空格,且if和fi保持成对出现

    if_else格式:
    if 表达式
    then
    命令表1
    else
    命令表2
    fi

    if_else if_else if_else格式:
    if 表达式1
    then
    命令表1
    else if 表达式2
    命令表2
    else if 表达式3
    命令表3
    else
    命令表4
    fi
    fi
    fi

     1 #!/bin/bash 
     2 
     3 echo -n "please input a filename:"
     4 
     5 read filename
     6 
     7 if [ ! -e $filename ]
     8 then
     9     echo "no such file"
    10     exit
    11 fi
    12 
    13 if [ -f $filename ]
    14 then
    15     ls -l $filename    
    16 else if [ -d $filename ]
    17 then
    18     echo "delete it?[y|n]"
    19     read cmd
    20     if [ $cmd = 'y' ]
    21     then
    22         rm -r $filename
    23     else
    24         echo "it is a dir"
    25     fi
    26 else
    27     echo "other file"
    28 fi
    29 fi
    if_file

    多分支语句:case
    case 变量(引用) in
    模式1) 满足该形式: 模式1|模式2)
    命令列表1
    ;; 类似break,不能省略
    模式2)
    命令列表2
    ;;
    .
    .
    .
    *) 类似default
    命令列表n
    ;;
    esac

     1 #!/bin/bash 
     2 
     3 
     4 
     5 read score
     6 
     7 if [ $score -gt 100 -o $score -lt 0 ]
     8 then
     9     echo "error,exit!"
    10     exit
    11 fi
    12 
    13 
    14 cmd=`expr $score / 10`
    15 
    16 case $cmd in
    17     10 | 9)
    18         echo "A"
    19         ;;
    20     8)
    21         echo "B"
    22         ;;
    23     6 | 7)
    24         echo "C"
    25         ;;
    26     *)
    27         echo "NO PASS"
    28         ;;
    29 esac
    case_score

    循环语句:
    for

     1 #!/bin/bash 
     2 
     3 
     4 
     5 if [ $# -ne 1 ]
     6 then 
     7     echo "please input a path"
     8     exit
     9 fi
    10 
    11 
    12 anx=`ls $1`
    13 
    14 num=0
    15 
    16 for name in $anx
    17 do
    18     ((num++))
    19 done
    20 
    21 echo $num
    for_flie

    while 表达式
    do
    命令列表
    done

     1 #!/bin/bash 
     2 
     3 
     4 
     5 num=1
     6 sum=0
     7 
     8 while [ $num -le 100 ]
     9 do
    10 #    sum=`expr $sum + $num`
    11 #    num=`expr $num + 1`
    12     ((sum = sum + num))
    13     ((num++))
    14 done
    15 
    16 echo $sum
    while

    while死循环
    while :
    do
    命令
    done

    1 while :
    2 do
    3     echo "1111"
    4 done
    while

    until 表达式
    do
    命令
    done
    注:直到表达式成立时结束循环

     1 #!/bin/bash 
     2 
     3 
     4 num=1
     5 sum=0
     6 
     7 until [ $num -gt 100 ]
     8 do
     9     sum=`expr $sum + $num`
    10     num=`expr $num + 1`
    11 done
    12 
    13 echo $sum
    nutil

    break
    continue 和C语言一致

    for 变量 in 单词表
    do
    命令
    done
    注:for循环执行的次数由单词表中单词(以空格作为区分)个数决定,且每一次循环变量会从单词表中获取单词

     1 #!/bin/bash 
     2 
     3 info='a b c d e f'
     4 
     5 #for var in a b c d e f
     6 for var in $info
     7 do
     8     echo $var
     9     echo "************"
    10 done
    for

    该形式的for单词表由位置变量提供
    for 变量
    do
    命令
    done

    shell中函数:

    函数定义:
    1.funname()
    {
    命令列表
    }

    2.function funname()
    {
    命令列表
    }

    函数返回值使用return时只能返回0~255的数值
    通过变量传递(脚本中定义的变量本质都是全局的,加上local定义变量则是局部的变量)
    $?可以用于接收函数的返回值

    函数调用
    函数名直接使用就表示调用,后面可以添加传递的参数(多个参数空格隔开)

    函数主体则利用位置变量接收传参

     1 #!/bin/bash 
     2 
     3 
     4 function check_usr()
     5 {
     6     exist=`cat /etc/passwd | cut -d ':' -f 1 | grep "^$1$" | wc -l` 
     7     
     8     if [ $exist -eq 0 ]
     9     then
    10         return 0
    11     else
    12         line=`cat /etc/passwd | cut -d ':' -f 1 | grep "^$1$" -n | cut -d ':' -f 1`
    13         return $line
    14     fi
    15 }
    16 
    17 function show_usr()
    18 {
    19     info=`cat /etc/passwd | head -$1 | tail -1`
    20     echo $info
    21 }
    22 
    23 echo ">>START<<"
    24 
    25 while :
    26 do
    27     echo -n "please input a user name:"
    28 
    29     read usrname
    30 
    31     if [ $usrname = 'quit' ]
    32     then
    33         echo ">>END<<"
    34         exit
    35     fi
    36 
    37     check_usr $usrname
    38     ret=$?
    39     
    40     if [ $ret -eq 0 ]
    41     then 
    42         echo "no such user"
    43         continue
    44     fi
    45     
    46     show_usr $ret
    47 
    48 done
    fun_user

    cat
    cut -d '分隔符' -f n
    例如:cat /etc/passwd | cut -d ':' -f 1,3
    grep "^string$" -n
    wc -l 行 -c 字符 -w 单词数
    head
    tail

    工程管理工具 make
    管理多个文件,make只会将时间戳发生变化的文件编译

    Makefile文件:make能够唯一自动识别和读入的配置文件
    命名格式:
    1.Makefile , makefile ,GNUmakefile
    在同一路径下只能使用其中一个,执行方式:make
    2.xxx.mk xxx.Linux xxx.AIX
    执行方式: make -f

    1.c 2.c 3.c main.c ---> 1.o 2.o 3.o main.o ----> a.out 最终目标
    目标文件 1.o
    依赖文件 1.c
    最终目标 a.out

    注:对于make来说得到最终目标时则结束,对于Makefile文件来说,处于文件最开始的目标文件就是最终目标文件

    显示规则:
    目标文件:依赖文件
    <tab大小>执行语句 (前面加@隐藏编译过程)

    快捷清楚:clean 纤细见代码
    make clean 运行

    伪目标声明:防止出现目标与该路径下有同名文件存在,导致make执行时受到干扰
    .PHONY:目标名字

    touch:刷新时间戳

    变量: 引用变量记得加$ {}或()
    用户自定义变量
    1. 变量 = 值 支持变量向后引用
    2. 变量 := 值 不支持变量向后引用
    3. 变量 += 值 追加赋值,且支持向后引用
    4. 变量 ?= 值 支持向后引用 如果该变量之前赋值过了,则该语句失效,反之,执行

    预定义变量
    CC == cc

    自动变量
    $*:表示目标文件的名字不包含扩展名 例如.c .o .txt
    $@:代表目标文件
    $<:代表第一个依赖文件
    $^:代表所有不重复的依赖文件

     1 .PHONY:clean
     2 
     3 VAR = -Wall -c
     4 
     5 stu:fun1.o fun2.o fun3.o main.o
     6     gcc -Wall $^ -o $@
     7 
     8 fun1.o:fun1.c
     9     $(CC) $(VAR) $< -o $@
    10 fun2.o:fun2.c
    11     ${CC} $(VAR) fun2.c -o $*.o
    12 fun3.o:fun3.c
    13     gcc $(VAR) fun3.c -o $@
    14 main.o:main.c
    15     gcc $(VAR) main.c -o $*.o
    16 
    17 clean:
    18     rm *.o stu
    makefile

    make:
    make -f 文件 指定文件按makefile文件执行
    make -l 或略错误执行
    make -n 模拟执行
    make -C 指定一个目录下的makefile文件执行

    隐式规则:


    tftp与nfs搭建:
    tftp:
    1.安装tftp客户端和服务器
    sudo apt-get install tftp-hpa
    sudo apt-get install tftpd-hpa

    2.修改配置文件
    sudo vi /etc/default/tftpd-hpa

    3.创建tftpboot目录
    cd /
    sudo mkdir tftpboot
    sudo chmod 777 tftpboot

    4.重启tftp服务
    sudo service tftpd-hpa restart

    5.测试
    不要在/目录下操作
    tftp 对方ip地址
    get 文件 下载
    put 文件 上传
    退出:quit

    nfs:
    1.安装nfd服务器
    sudo apt-get install nfs-kernel-server

    2.配置文件
    sudo vi /etc/exports
    /rootfs *(rw,sync,no_root_squash)

    3.创建rootfs
    cd /
    sudo mkdir rootfs
    sudo chmod 777 rootfs

    4.重启服务
    sudo /etc/init.d/nfs-kernel-server restart

    5.测试
    mount -t nfs 对方ip地址:/rootfs /mnt
    例如:sudo mount -t nfs 192.168.2.242:/rootfs /mnt

    注:不能再挂载点操作卸载
    sudo umount /mnt


  • 相关阅读:
    Linux下MySQL数据库常用基本操作 一
    Cdnbes负载均衡的权重用法解释
    docker安装
    centos网卡配置和防火墙停止和启动
    Excel 如何锁定表头
    权值线段树 基础入门知识详解
    JZOJ 3362. 【NOI2013模拟】数数(DFS)
    JZOJ 3348. 【NOI2013模拟】秘密任务(最短路+最小割唯一性)
    JZOJ 3303. 【集训队互测2013】城市规划(卷积+分治NTT)
    FFT快速傅里叶变换(超详细的入门学习总结)
  • 原文地址:https://www.cnblogs.com/hslixiqian/p/9560423.html
Copyright © 2011-2022 走看看