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  

原文地址:https://www.cnblogs.com/guojintao/p/5719375.html