zoukankan      html  css  js  c++  java
  • linux Bash

    本文包含的命令:type、echo、evn、set、locale、read、declare / typeset、ulimit、alias、unalias、history、!、source、stty、cut、grep、sort、uniq、wc、tee、tr、col、join、paste、expand、split、xargs。

    概念与知识点:

    • 双引号里面的变量有意义,单引号里面的变量没有意义。
    • 变量的简单定义:『变量就是以一组文字或符号等,来取代一些设定或者是一串保留的数据!』
    • 变量设定的规则:
      1. 变量与变量内容以一个等号『=』来连结,如下所示: 『myname=VBird』
      2. 等号两边不能直接接空格符,如下所示为错误: 『myname = VBird』或『myname=VBird Tsai』
      3. 变量名称叧能是英文字母与数字,但是开头字符不能是数字,如下为错误: 『2myname=VBird』
      4. 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
        1. 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
          1. 『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
        2. 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
          1. 『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
      5. 可用跳脱字符『 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;
      6. 在一串指令中,还需要藉由其他的指令提供的信息,可以使用反单引号『`指令`』或 『$(指令)』。
      7. 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:『PATH="$PATH":/home/bin』
      8. 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量:『export PATH』
      9. 通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断。
      10. 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的设定:『unset myname』
    • 环境变量会被子程序继承,而自定义变量不会被子程序继承。
    • 变量内容的删除、取代与替换
      • 删除-----例:
        • ${path#/*:}---------匹配的是第一个是/,最后一个是:的内容 *为通配符
          • # :符合取代文字的『最短的』那一个;-------------从前面开始删除
          • ##:符合取代文字的『最长的』那一个
          • %与%%意义与#与##类似,与过是从后面开始删除
      • 取代-----${path/sbin/SBIN}
    • 路径与指令搜寻顺序
      1.  以相对/绝对路径执行指令,例如『 /bin/ls 』或『 ./ls 』;
      2.  由 alias 找到该指令来执行;
      3. 由 bash 内建的 (builtin) 指令来执行;
      4. 透过 $PATH 这个变量的顺序搜寻到的第一个指令来执行。
    • bash 的进站与欢迎讯息: /etc/issue, /etc/motd  /etc/issue.net
      • issue内的各代码意义
        • d 本地端时间的日期;
        • l 显示第几个终端机接口;
        • m 显示硬件的等级 (i386/i486/i586/i686...);
        • 显示主机的网络名称;
        • o 显示 domain name;
        • 操作系统的版本 (相当于 uname -r)
        • 显示本地端时间的时间;
        • s 操作系统的名称;
        • v 操作系统的版本。
      • /etc/issue.net---------供telnet登录显示的欢迎信息,设置同 issue一样
      • /etc/motd ----登入系统后得到的一些警告或维护信息
    • bash 的环境配置文件
      • login 与 non-login shell
        • login shell:取得 bash 时需要完整的登入流程
          • 会读取的配置文件
            • /etc/profile:这是系统整体的设定,你最好不要修改这个档案;
              • /etc/inputrc
              • /etc/profile.d/*.sh
              • /etc/sysconfig/i18n
            •  ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:属于使用者个人设定,你要改自己的数据,就写入这里!
        • non-login shell:取得 bash 接口的方法不需要重复登入的举动(不需要再次输入密码)
          • 会读取的配置文件
            • ~/.bashrc---呼叫/etc/bashrc
    • 数据流量导向
      • 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
      • 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
      • 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
      • 标准输出与标准错误输出同时输入到同一个文件  2>&1 ;
        • 例:find /home -name .bashrc 【> list】 【2>&1】 <==正确
    • $? (指令回传值) 与 && 或 ||
      • cmd1 && cmd2
        • 若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2
        • 若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行。
      • cmd1 || cmd2
        • 若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行。
        • 若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2。
    • 管线的命令: |
      • 在每个管线后面接的第一个数据必定是『指令』,而且这个指令必须要能够接叐 standard input 的数据才行,这样的指令才可以是为『管线命令』,例如 less, more, head, tail 等都是可以接叐 standard input 的管线命令。至于例如 ls, cp, mv 等就不是管线命令。
      • 管线命令仅会处理 standard output,对于 standard error output 会予以忽略
      • 管线命令必须要能够接叐来自前一个指令的数据成为 standard input 继续处理才行。
    • 关于减号 - 的用途
      • 在管线命令当中,常常会使用到前一个指令的 stdout 作为这次的 stdin , 某些指令需要用到文件名 (例如 tar)来进行处理时,该 stdin 与 stdout 可以利用减号 "-" 来替代,
    • 修改语系的配置文件
      • vim /etc/sysconfig/i18n
    • 数组变量的赋值
      • 数组名[参数序号]=内容
    • exec
      • 在当前shell中执行命令,执行完后退出当前shell

    相关命令:

    1. cat /etc/shells-----------查看系统可用的shells
    2. type---------查看命令的类型:内建或外部-------------只能查找执行档
      • type [-tpa] name
        • -t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
          • file :表示为外部指令;
          • alias :表示该指令为命令别名所设定的名称;
          • builtin :表示该指令为 bash 内建的指令功能;
        • -p :如果后面接的 name 为外部指令时,才会显示完整文件名;
        • -a :会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias
    3. echo----------变量的取用
      • echo $变量名 --------------显示变量的具体路径
      • -e 选项为使内容中的特殊字符生效,例如 换行
    4. evn---------观察环境变量
    5. set----------观察环境变量(含所有变量:环境变量与自定义变量)
    6. locale -a---------显示所有的语系变量
    7. read-------------读取来自键盘输入的变量
      • read [-pt] 变量名称 ==============变量名与参数之间必须需要空格
        • -p :后面可以接提示字符!
        • -t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
    8. declare / typeset----------变量类型宣告
      • declare [-aixr] variable
        • -a :将后面名为 variable 的变量定义成为数组 (array) 类型
        • -i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
        • -x :用法不 export 一样,就是将后面的 variable 变成环境变量;
        • -r :将变量设定成为 readonly 类型,该变量不可被更改内容,也不能 unset
    9. ulimit------------与文件系统及程序的限制关系:
      • ulimit [-SHacdfltu] [配额]
        • -H :hard limit ,严格的设定,必定不能超过这个设定的数值;
        • -S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息。
        • -a :后面不接任何选项不参数,可列出所有的限制额度;
        • -c :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案(除错用),这种档案就被称为核心档案(corefile)。此为限制每个核心档案的最大容量。
        • -f :此 shell 可以建立的最大档案容量(一般可能设定为 2GB)单位为 Kbytes
        • -d :程序可使用的最大断裂内存(segment)容量;
        • -l :可用于锁定 (lock) 的内存量;
        • -t :可使用的最大 CPU 时间 (单位为秒);
        • -u :单一用户可以使用的最大程序(process)数量。
    10. 变量的判断:
      • ${变量#关键词}   若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除
      • ${变量##关键词}   若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
      • ${变量%关键词}   若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
      • ${变量%%关键词}   若变量内容仍尾向前的数据符合『关键词』,则将符合的最长数据删除
      • ${变量/旧字符串/新字符串} 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
      • ${变量//旧字符串/新字符串} 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』
    11. alias --------------------命令别名
      • alias rm='rm -i'
    12. unalias -----------------取消命令别名
      • unalias lm
    13. history-----------------历史命令
      • history [n]
      • history [-c]
      • history [-raw] histfiles
        • n :数字,意思是『要列出最近的 n 笔命令行表』的意思!
        • -c :将目前的 shell 中的所有 history 内容全部消除
        • -a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,则预设写入 ~/.bash_history
        • -r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;
        • -w :将目前的 history 记忆内容写入 histfiles 中!
    14. !number  --------------------------根据历史命令重复历史命令
      • !command
      • !!
        • number :执行第几笔指令的意思;
        • command :由最近的指令向前搜寻『指令串开头为 command』的那个指令,幵执行;
        • !! :就是执行上一个指令(相当于按↑按键后,按 Enter)
    15. source :读入环境配置文件的指令 -------------------不用注销,使修改的bash生效
      • source 配置文件档名
    16. stty--------------显示终端机的环境设定
      • stty -a ------------------将目前所有的 stty 参数列出来;
      • stty erase ^h-------------设置erase(删除)为[ctrl]+h 键
    17. set [-uvCHhmBx]
      • u :预设不启用。若启用后,当使用未设定变量时,会显示错误讯息;
      • -v :预设不启用。若启用后,在讯息被输出前,会先显示讯息的原始内容;
      • -x :预设不启用。若启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号)
      • -h :预设启用。与历史命令有关;
      • -H :预设启用。与历史命令有关;
      • -m :预设启用。与工作管理有关;
      • -B :预设启用。与刮号 [] 的作用有关;
      • -C :预设不启用。若使用 > 等,则若档案存在时,该档案不会被覆盖。
    18. cut-------------截取信息
      • cut -d'分隔字符' -f fields <==用于有特定分隔字符
      • cut -c 字符区间 <==用于排列整齐的讯息
        • -d :后面接分隔字符。与 -f 一起使用;
        • -f :依据 -d 的分隔字符将一段讯息分割成为数段,用 -f 取出第几段的意思;
        • -c :以字符 (characters) 的单位取出固定字符区间;
    19. grep------------分析一行信息。若有所要的信息就将该行拿出来
      • grep [-acinv] [--color=auto] '搜寻字符串' filename
        • -a :将 binary 档案以 text 档案的方式搜寻数据
        • -c :计算找到 '搜寻字符串' 的次数
        • -i :忽略大小写的不同,所以大小写规为相同
        • -n :顺便输出行号
        • -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
        • --color=auto :可以将找到的关键词部分加上颜色的显示喔!
    20. sort------------排序-----------可被管道使用
      • 先将语系统一----------LANG=C
      • sort [-fbMnrtuk] [file or stdin]
        • -f :忽略大小写的差异,例如 A 与 a 视为编码相同;
        • -b :忽略最前面的空格符部分;
        • -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
        • -n :使用『纯数字』进行排序(默认是以文字型态来排序的);
        • -r :反向排序;
        • -u :就是 uniq ,相同的数据中,仅出现一行代表;
        • -t :分隔符,预设是用 [tab] 键来分隔;
        • -k :以那个区间 (field) 来进行排序的意思
    21. uniq--------------消除重复----------可被管道使用
      • uniq [-ic]
        • -i :忽略大小写字符的不同;
        • -c :进行计数
    22. wc----------------计算输出的讯息的整体数据!----------可被管道使用
      • wc [-lwm]
        • -l :仅列出行;
        • -w :仅列出多少字(英文单字);
        • -m :多少字符;
    23. tee----------------双向重导向----------可被管道使用
      • tee [-a] file
        • -a :以累加 (append) 的方式,将数据加入 file 当中!
    24. 字符转换命令: tr, col, join, paste, expand
      1. tr 用来初除一段讯息当中的文字,戒者是进行文字讯息的替换!
        • tr [-ds] SET1 ...
          • -d :删除讯息当中的 SET1 这个字符串;
          • -s :取代掉重复的字符!
      2. col 删除跳脱符、将tab转换成空格
        • col [-xb]
          • -x :将 tab 键转换成对等的空格键
          • -b :在文字内有反斜杠 (/) 时,仅保留反斜杠最后接的那个字符
      3. join 处理两个档案之间的数据
        • join [-ti12] file1 file2
          • -t :join 默认以空格符分隔数据,幵且比对『第一个字段』的数据,如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个!
          • -i :忽略大小写的差异;
          • -1 :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思;
          • -2 :代表『第二个档案要用那个字段来分析』的意思。
        • 例:[root@www ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
      4. paste 将两行贴在一起,且中间以 [tab] 键隔开
        • paste [-d] file1 file2
          • -d :后面可以接分隔字符。预设是以 [tab] 来分隔的!
          • - :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。
        • 例:cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
      5. expand 将 [tab] 按键转成空格键
        • expand [-t] file
          • -t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。我们也可以自行定义一个 [tab] 按键代表多少个字符
    25. split----------分割命令
      • split [-bl] file PREFIX
        • -b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
        • -l :以行数来进行分割。
        • PREFIX :代表前导符的意思,可作为分割档案的前导文字。(如果分割的有三个文件,即为PREFIXaa、PREFIXbb、PREFIXcc)
    26. xargs-------参数代换,很多指令其实并不支持管线命令,因此我们可以透过 xargs 来提供该指令引用 standard input 之用!
      1. xargs [-0epn] command
        • -0 :如果输入的 stdin 吨有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数 可以将他还原成一般字符。这个参数可以用于特殊状态喔!
        • -e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到 这个字符串时,就会停止继续工作!
        • -p :在执行每个指令的 argument 时,都会询问使用者的意思;
        • -n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。
      2. 例:
        1. [root@www ~]# find /sbin -perm +7000 | ls -l
        2. # 结果竟然仅有列出 root 所在目录下的档案!这不是我们要的!
        3. # 因为 ll (ls) 并不是管线命令的原因啊!
        4. [root@www ~]# find /sbin -perm +7000 | xargs ls -l  即可解决

    bash中的通配符与特殊符号:

    • *     代表『 0 个到无穷多个』任意字符
    • ?     代表『一定有一个』任意字符
    • [ ]  同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
    • [ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的诧系编码是连续的!
    • [^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,叧要是非 a, b, c 的其他字符就接叐的意思。
    • # 批注符号:这个最常被使用在 script 当中,规为说明!在后的数据均不执行
    • 跳脱符号:将『特殊字符或通配符』还原成一般字符
    • | 管线 (pipe):分隔两个管线命令的界定;
    • ; 连续指令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
    • ~ 用户的家目录
    • $ 取用变数前导符:亦即是变量之前需要加的变量取代值
    • & 工作控制 (job control):将指令变成背景下工作
    • ! 逻辑运算意义上的『非』 not 的意思!
    • / 目录符号:路径分隔的符号
    • >, >> 数据流重导向:输出导向,分别是『取代』与『累加』
    • <, << 数据流重导向:输入导向
    • ' ' 单引号,不具有变量置换的功能
    • " " 具有变量置换的功能!
    • ` ` 两个『 ` 』中间为可以先执行的指令,亦可使用 $( )
    • ( ) 在中间为子 shell 的起始与结束
    • { } 在中间为命令区块的组合!

    ================================================================

    i="abcABC123ABCabc"

    ${#i}:输出变量i的长度

    ${i#a*c}:从开头删除,匹配最短  ABC123ABCabc

    ${i##a*c}:从开头删除,匹配最长 空

    ${i%a*c}:从结尾删除,匹配最短 abcABC123ABC

    ${i%%a*c}:从结尾删除,匹配最长 空

    ${i%%a*C}:从结尾删除,匹配最长 abcABC123ABCabc

    #和%这种匹配都是从字符开头或结尾开始匹配的,如果第一个(#)或者最后一个(%)不匹配,则就不匹配

    ${i/a/S}:将第一个a替换成S SbcABC123ABCabc

    ${i//a/S}:将第所有a替换成S SbcABC123ABCSbc

    批量修改文件名:# rename ".jpg" ".gaga" ./*.jpg  

  • 相关阅读:
    原生化:AnDevCon 2014 McVeigh 的主题演讲
    MVC 5 App 通过 Facebook OAuth2 登陆(Sign-on)的问题
    MVC 5 第三章 HTML Helper
    Node.js 初探
    MVC 5 第二章 项目结构
    MVC 5 第一章 起航
    新的开始
    Xcode开发如何在调试时轻松找到程序在哪里崩溃?
    100个直接可以拿来用的JavaScript实用功能代码片段(转)
    js得到当前页面的url信息方法(JS获取当前网址信息)
  • 原文地址:https://www.cnblogs.com/guojintao/p/5719375.html
Copyright © 2011-2022 走看看