本文包含的命令: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。
概念与知识点:
- 双引号里面的变量有意义,单引号里面的变量没有意义。
- 变量的简单定义:『变量就是以一组文字或符号等,来取代一些设定或者是一串保留的数据!』
- 变量设定的规则:
- 变量与变量内容以一个等号『=』来连结,如下所示: 『myname=VBird』
- 等号两边不能直接接空格符,如下所示为错误: 『myname = VBird』或『myname=VBird Tsai』
- 变量名称叧能是英文字母与数字,但是开头字符不能是数字,如下为错误: 『2myname=VBird』
- 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
- 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
- 『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
- 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
- 『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
- 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
- 可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;
- 在一串指令中,还需要藉由其他的指令提供的信息,可以使用反单引号『`指令`』或 『$(指令)』。
- 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:『PATH="$PATH":/home/bin』
- 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量:『export PATH』
- 通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断。
- 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的设定:『unset myname』
- 环境变量会被子程序继承,而自定义变量不会被子程序继承。
- 变量内容的删除、取代与替换
- 删除-----例:
- ${path#/*:}---------匹配的是第一个是/,最后一个是:的内容 *为通配符
- # :符合取代文字的『最短的』那一个;-------------从前面开始删除
- ##:符合取代文字的『最长的』那一个
- %与%%意义与#与##类似,与过是从后面开始删除
- ${path#/*:}---------匹配的是第一个是/,最后一个是:的内容 *为通配符
- 取代-----${path/sbin/SBIN}
- 删除-----例:
- 路径与指令搜寻顺序
- 以相对/绝对路径执行指令,例如『 /bin/ls 』或『 ./ls 』;
- 由 alias 找到该指令来执行;
- 由 bash 内建的 (builtin) 指令来执行;
- 透过 $PATH 这个变量的顺序搜寻到的第一个指令来执行。
- bash 的进站与欢迎讯息: /etc/issue, /etc/motd /etc/issue.net
- issue内的各代码意义
- \d 本地端时间的日期;
- \l 显示第几个终端机接口;
- \m 显示硬件的等级 (i386/i486/i586/i686...);
- \n 显示主机的网络名称;
- \o 显示 domain name;
- \r 操作系统的版本 (相当于 uname -r)
- \t 显示本地端时间的时间;
- \s 操作系统的名称;
- \v 操作系统的版本。
- /etc/issue.net---------供telnet登录显示的欢迎信息,设置同 issue一样
- /etc/motd ----登入系统后得到的一些警告或维护信息
- issue内的各代码意义
- bash 的环境配置文件
- login 与 non-login shell
- login shell:取得 bash 时需要完整的登入流程
- 会读取的配置文件
- /etc/profile:这是系统整体的设定,你最好不要修改这个档案;
- /etc/inputrc
- /etc/profile.d/*.sh
- /etc/sysconfig/i18n
- ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:属于使用者个人设定,你要改自己的数据,就写入这里!
- /etc/profile:这是系统整体的设定,你最好不要修改这个档案;
- 会读取的配置文件
- non-login shell:取得 bash 接口的方法不需要重复登入的举动(不需要再次输入密码)
- 会读取的配置文件
- ~/.bashrc---呼叫/etc/bashrc
- 会读取的配置文件
- login shell:取得 bash 时需要完整的登入流程
- login 与 non-login shell
- 数据流量导向
- 标准输入 (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。
- cmd1 && 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
- 数组变量的赋值
- 数组名[参数序号]=内容
相关命令:
- cat /etc/shells-----------查看系统可用的shells
- type---------查看命令的类型:内建或外部-------------只能查找执行档
- type [-tpa] name
- -t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
- file :表示为外部指令;
- alias :表示该指令为命令别名所设定的名称;
- builtin :表示该指令为 bash 内建的指令功能;
- -p :如果后面接的 name 为外部指令时,才会显示完整文件名;
- -a :会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias
- -t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
- type [-tpa] name
- echo----------变量的取用
- echo $变量名 --------------显示变量的具体路径
- -e 选项为使内容中的特殊字符生效,例如\n 换行
- evn---------观察环境变量
- set----------观察环境变量(含所有变量:环境变量与自定义变量)
- locale -a---------显示所有的语系变量
- read-------------读取来自键盘输入的变量
- read [-pt] 变量名称 ==============变量名与参数之间必须需要空格
- -p :后面可以接提示字符!
- -t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
- read [-pt] 变量名称 ==============变量名与参数之间必须需要空格
- declare / typeset----------变量类型宣告
- declare [-aixr] variable
- -a :将后面名为 variable 的变量定义成为数组 (array) 类型
- -i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
- -x :用法不 export 一样,就是将后面的 variable 变成环境变量;
- -r :将变量设定成为 readonly 类型,该变量不可被更改内容,也不能 unset
- declare [-aixr] variable
- ulimit------------与文件系统及程序的限制关系:
- ulimit [-SHacdfltu] [配额]
- -H :hard limit ,严格的设定,必定不能超过这个设定的数值;
- -S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息。
- -a :后面不接任何选项不参数,可列出所有的限制额度;
- -c :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案(除错用),这种档案就被称为核心档案(corefile)。此为限制每个核心档案的最大容量。
- -f :此 shell 可以建立的最大档案容量(一般可能设定为 2GB)单位为 Kbytes
- -d :程序可使用的最大断裂内存(segment)容量;
- -l :可用于锁定 (lock) 的内存量;
- -t :可使用的最大 CPU 时间 (单位为秒);
- -u :单一用户可以使用的最大程序(process)数量。
- ulimit [-SHacdfltu] [配额]
- 变量的判断:
- ${变量#关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除
- ${变量##关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
- ${变量%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
- ${变量%%关键词} 若变量内容仍尾向前的数据符合『关键词』,则将符合的最长数据删除
- ${变量/旧字符串/新字符串} 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
- ${变量//旧字符串/新字符串} 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』
- alias --------------------命令别名
- alias rm='rm -i'
- unalias -----------------取消命令别名
- unalias lm
- 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 中!
- !number --------------------------根据历史命令重复历史命令
- !command
- !!
- number :执行第几笔指令的意思;
- command :由最近的指令向前搜寻『指令串开头为 command』的那个指令,幵执行;
- !! :就是执行上一个指令(相当于按↑按键后,按 Enter)
- source :读入环境配置文件的指令 -------------------不用注销,使修改的bash生效
- source 配置文件档名
- stty--------------显示终端机的环境设定
- stty -a ------------------将目前所有的 stty 参数列出来;
- stty erase ^h-------------设置erase(删除)为[ctrl]+h 键
- set [-uvCHhmBx]
- u :预设不启用。若启用后,当使用未设定变量时,会显示错误讯息;
- -v :预设不启用。若启用后,在讯息被输出前,会先显示讯息的原始内容;
- -x :预设不启用。若启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号)
- -h :预设启用。与历史命令有关;
- -H :预设启用。与历史命令有关;
- -m :预设启用。与工作管理有关;
- -B :预设启用。与刮号 [] 的作用有关;
- -C :预设不启用。若使用 > 等,则若档案存在时,该档案不会被覆盖。
- cut-------------截取信息
- cut -d'分隔字符' -f fields <==用于有特定分隔字符
- cut -c 字符区间 <==用于排列整齐的讯息
- -d :后面接分隔字符。与 -f 一起使用;
- -f :依据 -d 的分隔字符将一段讯息分割成为数段,用 -f 取出第几段的意思;
- -c :以字符 (characters) 的单位取出固定字符区间;
- grep------------分析一行信息。若有所要的信息就将该行拿出来
- grep [-acinv] [--color=auto] '搜寻字符串' filename
- -a :将 binary 档案以 text 档案的方式搜寻数据
- -c :计算找到 '搜寻字符串' 的次数
- -i :忽略大小写的不同,所以大小写规为相同
- -n :顺便输出行号
- -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
- --color=auto :可以将找到的关键词部分加上颜色的显示喔!
- grep [-acinv] [--color=auto] '搜寻字符串' filename
- sort------------排序-----------可被管道使用
- 先将语系统一----------LANG=C
- sort [-fbMnrtuk] [file or stdin]
- -f :忽略大小写的差异,例如 A 与 a 视为编码相同;
- -b :忽略最前面的空格符部分;
- -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
- -n :使用『纯数字』进行排序(默认是以文字型态来排序的);
- -r :反向排序;
- -u :就是 uniq ,相同的数据中,仅出现一行代表;
- -t :分隔符,预设是用 [tab] 键来分隔;
- -k :以那个区间 (field) 来进行排序的意思
- uniq--------------消除重复----------可被管道使用
- uniq [-ic]
- -i :忽略大小写字符的不同;
- -c :进行计数
- uniq [-ic]
- wc----------------计算输出的讯息的整体数据!----------可被管道使用
- wc [-lwm]
- -l :仅列出行;
- -w :仅列出多少字(英文单字);
- -m :多少字符;
- wc [-lwm]
- tee----------------双向重导向----------可被管道使用
- tee [-a] file
- -a :以累加 (append) 的方式,将数据加入 file 当中!
- tee [-a] file
- 字符转换命令: tr, col, join, paste, expand
- tr 用来初除一段讯息当中的文字,戒者是进行文字讯息的替换!
- tr [-ds] SET1 ...
- -d :删除讯息当中的 SET1 这个字符串;
- -s :取代掉重复的字符!
- tr [-ds] SET1 ...
- col 删除跳脱符、将tab转换成空格
- col [-xb]
- -x :将 tab 键转换成对等的空格键
- -b :在文字内有反斜杠 (/) 时,仅保留反斜杠最后接的那个字符
- col [-xb]
- join 处理两个档案之间的数据
- join [-ti12] file1 file2
- -t :join 默认以空格符分隔数据,幵且比对『第一个字段』的数据,如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个!
- -i :忽略大小写的差异;
- -1 :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思;
- -2 :代表『第二个档案要用那个字段来分析』的意思。
- 例:[root@www ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
- join [-ti12] file1 file2
- paste 将两行贴在一起,且中间以 [tab] 键隔开
- paste [-d] file1 file2
- -d :后面可以接分隔字符。预设是以 [tab] 来分隔的!
- - :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。
- 例:cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
- paste [-d] file1 file2
- expand 将 [tab] 按键转成空格键
- expand [-t] file
- -t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。我们也可以自行定义一个 [tab] 按键代表多少个字符
- expand [-t] file
- tr 用来初除一段讯息当中的文字,戒者是进行文字讯息的替换!
- split----------分割命令
- split [-bl] file PREFIX
- -b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
- -l :以行数来进行分割。
- PREFIX :代表前导符的意思,可作为分割档案的前导文字。(如果分割的有三个文件,即为PREFIXaa、PREFIXbb、PREFIXcc)
- split [-bl] file PREFIX
- xargs-------参数代换,很多指令其实并不支持管线命令,因此我们可以透过 xargs 来提供该指令引用 standard input 之用!
- xargs [-0epn] command
- -0 :如果输入的 stdin 吨有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数 可以将他还原成一般字符。这个参数可以用于特殊状态喔!
- -e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到 这个字符串时,就会停止继续工作!
- -p :在执行每个指令的 argument 时,都会询问使用者的意思;
- -n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。
- 例:
- [root@www ~]# find /sbin -perm +7000 | ls -l
- # 结果竟然仅有列出 root 所在目录下的档案!这不是我们要的!
- # 因为 ll (ls) 并不是管线命令的原因啊!
- [root@www ~]# find /sbin -perm +7000 | xargs ls -l 即可解决
- xargs [-0epn] command
bash中的通配符与特殊符号:
- * 代表『 0 个到无穷多个』任意字符
- ? 代表『一定有一个』任意字符
- [ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
- [ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的诧系编码是连续的!
- [^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,叧要是非 a, b, c 的其他字符就接叐的意思。
- # 批注符号:这个最常被使用在 script 当中,规为说明!在后的数据均不执行
- \ 跳脱符号:将『特殊字符或通配符』还原成一般字符
- | 管线 (pipe):分隔两个管线命令的界定;
- ; 连续指令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
- ~ 用户的家目录
- $ 取用变数前导符:亦即是变量之前需要加的变量取代值
- & 工作控制 (job control):将指令变成背景下工作
- ! 逻辑运算意义上的『非』 not 的意思!
- / 目录符号:路径分隔的符号
- >, >> 数据流重导向:输出导向,分别是『取代』与『累加』
- <, << 数据流重导向:输入导向
- ' ' 单引号,不具有变量置换的功能
- " " 具有变量置换的功能!
- ` ` 两个『 ` 』中间为可以先执行的指令,亦可使用 $( )
- ( ) 在中间为子 shell 的起始与结束
- { } 在中间为命令区块的组合!