第十一章 认识 Bash Shell
学习笔记
Bash Shell
管理整个硬件的是核心(kernel),通常用户(user)都是以 Shell 来与核心沟通
什么是Shell
系统的 shell 与 /etc/shells 功能
系统可用的shell:检查 /etc/shells 文件,至少有下面几个可用的shells:
- /bin/sh (已经被 /bin/bash 所取代)
- /bin/bash (就是 Linux 预设的 shell)
- /bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash)
- /bin/tcsh (整合 C Shell ,提供更多的功能)
- /bin/csh (已经被 /bin/tcsh 所取代)
- /bin/zsh (基于 ksh 发展出来的,功能更强大的 shell)
主要的两个shell:bash 、csh 系统默认:bash shell
Bash Shell 的功能
BASH 主要的优点:
- 命令记忆能力(类似 DOS 的 doskey 功能)
命令行按“上下键”,就可以找到前一个输入的命令。
用户执行的命令记录在:~/.bash_history - 命令与文件补全功能
[Tab] 接在一串命令的第一个字的后面,则为命令补全;
[Tab] 接在一串命令的第二个字以后时,则为“档案补齐”。 - 命令别名(alias)设置功能
举例,直接设置别名:
alias lm=‘ls -al’ - 作业控制(jobs)、前台、后台控制
可以在单一登录的环境中,达到多任务的目的 - Shell scripts 的强大功能
- 通配符
Bash Shell 的内置命令:type
type命令可以观察命令是来自于外部命令(指的是其他非 bash 套件所提供的命令)或是内置在 bash 中的。
[root@linux ~]# type [-tpa] name
参数:
:不加任何参数时,则 type 会显示出那个 name 是外部命令还是 bash 内置的命令!
-t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
file :表示为外部指令;
alias :表示该指令为命令别名所设定的名称;
builtin :表示该指令为 bash 内建的指令功能;
-p :如果后面接的 name 为指令时,会显示完整文件名(外部指令)或显示为内建指令;
-a :会将由 PATH 变量定义的路径中,将所有含有 name 的指令都列出来,包含 alias
执行命令
[root@linux ~]# command [-options] parameter1 parameter2 ...
指令 选项 参数(1) 参数(2)
说明:
0. 一行指令中第一个输入的绝对是『指令(command)』或『可执行文件』
1. command 为指令的名称,例如变换路径的指令为 cd 等等;
2. 中刮号[]并不存在于实际的指令中,而加入参数设定时,通常为 - 号,例如 -h;
有时候完整参数名称会输入 -- 符号,例如 --help;
3. parameter1 parameter2.. 为依附在 option 后面的参数,
或者是 command 的参数;
4. command, -options, parameter1.. 这几个咚咚中间以空格来区分,
不论空几格 shell 都视为一格;
5. 按下 [Enter] 按键后,该指令就立即执行。[Enter] 按键为 <CR> 字符,
他代表着一行指令的开始启动。
6. 指令太长的时候,可以使用 \ 符号来跳脱 [Enter] 符号,
使指令连续到下一行。注意! \ 后就立刻接特殊字符。
7. 在 Linux 系统中,英文大小写字母是不一样的。举例来说, cd 与 CD 并不同。
Shell 的变量功能
为了与自定义变量区别,环境变量通常以大写字母表示。
变量的获取与设置:echo、变量设置规则、unset
显示变量内容:
[root@linux ~]# echo $variable
[root@linux ~]# echo ${variable}
设置或修改变量内容:用“等号(=)”连接变量与它的内容
变量的设置规则:
① 变量与变量内容以等号“=”来连接;
② 等号两边不能直接接空格符;
③ 变量名称只能是英文字母与数字,但数字不能是开头字符;
④ 若有空格符,可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但要特别注意,双引号内的特殊字符可以保持变量特性,但单引号内的特殊字符则仅为一般字符;
⑤ 必要时需要以转义字符『 \ 』将特殊符号(如 Enter、$、\、空格符、' 等)变为一般符号;
⑥ 在一串命令中,还需要通过其他命令提供的信息,可以使用这样的方式『 `command` 』;(特别特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!)
⑦ 若变量为扩展变量内容,需以双引号及 $变量名称 如 『 "$PATH":/home』继续累加内容;
⑧ 若该变量需要在其他子程序中执行,则需要用 export 使变量变成环境变量,如『export PATH』;
⑨ 通常大写字母为系统默认变量,自行设置变量可以使用小写字母,便于判断(根据用户兴趣与喜好)
⑩ 取消变量的方法为:『unset 变量名称』。
在指令下达的过程中, quote ( ` ) 这个符号代表的意义为何?
在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息!例如 uname -r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先执行 uname -r 找出核心版本,然后再以『 cd 目录』到该目录下,当然也可以执行如同上面范例六的执行内容啰。
另外再举个例子,我们也知道, locate 指令可以列出所有的相关档案档名,但是, 如果我想要知道各个档案的权限呢?举例来说,我想要知道每个 crontab 相关档名的权限:
[root@linux ~]# ls -l `locate crontab`
如此一来,先以 locate 将文件名数据都列出来,再以 ls 指令来处理
变量的用途
① 简化路径名称
② 程序和脚本中
环境变量的功能
查看有多少变量:
-
一些环境变量的说明:env
范例一:列出目前的 shell 环境下的所有环境变量与其内容。 [root@linux ~]# env HOSTNAME=linux.dmtsai.tw <== 这部主机的主机名 SHELL=/bin/bash <== 目前这个环境下,使用的 Shell 是哪一个程序? TERM=xterm <== 这个终端机使用的环境是什么类型 HISTSIZE=1000 <== 这个就是『记录指令的笔数』在 FC4 默认可记录 1000 笔 USER=root <== 使用者的名称啊! LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01: or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=0 0;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz= 00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;3 1:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00 ;35:*.xpm=00;35:*.png=00;35:*.tif=00;35: <== 一些颜色显示 ENV=/root/.bashrc <== 使用的个人环境配置文件 MAIL=/var/spool/mail/root <== 这个用户所取用的 mailbox 位置 PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin: /root/bin <== 不再多讲啊!是执行文件指令搜寻路径 INPUTRC=/etc/inputrc <== 与键盘按键功能有关。可以设定特殊按键! PWD=/root <== 目前用户所在的工作目录 (利用 pwd 取出!) LANG=en_US.UTF-8 <== 这个与语系有关,底下会再介绍! HOME=/root <== 这个用户的家目录啊! _=/bin/env <== 上一次使用的指令的最后一个参数(或指令本身)
上面这些变量有些什么功用:
-
HOME : 代表用户的家目录。还记得我们可以使用 cd ~ 去到用户的家目录吗?或者利用 cd 就可以直接回到用户家目录了。那就是取用这个功能啦~ 有很多程序都可能会取用到这个变量的值喔!
-
SHELL : 告知我们,目前这个环境使用的 SHELL 是哪支程序? 如果是 bash 的话,默认是 /bin/bash 的啦!
-
HISTSIZE : 这个与『历史命令』有关,我们曾经下达过的指令可以被系统记录下来,而记录的『数目』则是由这个值来设定的。
-
ENV : 这个使用者所使用的个人化环境配置文件的读取文件。
-
MAIL : 当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱文件 (mailbox)。
-
PATH : 就是执行文件搜寻的路径啦~目录与目录中间以冒号(:)分隔, 由于文件的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的喔。
-
LANG : 这个重要!就是语系文件~很多数据都会用到他, 举例来说,当我们在启动某些 perl 的程序语言文件时,他会主动的去分析语系数据文件, 如果发现有他无法解析的编码语系,可能会产生错误喔!一般来说,我们中文编码通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,这两个编码偏偏不容易被解译出来,所以,有的时候,可能需要修订一下语系数据。
-
RANDOM : 这个玩意儿就是『随机数』的变量啦!目前大多数的 distributions 都会有随机数生成器,那就是 /dev/random 这个档案。 我们可以透过这个随机数档案相关的变量 ($RANDOM) 来随机取得随机数值喔。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,所以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。万一我想要使用 0~9 之间的数值呢?呵呵~利用 declare 宣告数值类型, 然后这样做就可以了:
[root@linux ~]# declare -i number=$RANDOM*10/32767 ; echo $number 8 <== 此时会随机取出 0~9 之间的数值喔!
-
其他所有的变量说明:set
[root@linux ~]# set BASH=/bin/bash <== bash 的主程序放置路径 BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu") <== bash 的版本啊! BASH_VERSION='3.00.16(1)-release' <== bash 的版本啊! COLORS=/etc/DIR_COLORS.xterm <== 使用的颜色纪录档案 COLUMNS=115 <== 在目前的终端机环境下,使用的字段有几个字符长度 HISTFILE=/root/.bash_history <== 历史命令记录的放置档案,隐藏档 HISTFILESIZE=1000 <== 存起来(与上个变量有关)的档案之指令的最大纪录笔数。 HISTSIZE=1000 <== 目前环境下,可记录的历史命令最大笔数。 HOSTTYPE=i386 <== 主机安装的软件主要类型。我们用的是 i386 兼容机器软件 IFS=$' \t\n' <== 预设的分隔符 LINES=35 <== 目前的终端机下的最大行数 MACHTYPE=i386-redhat-linux-gnu <== 安装的机器类型 MAILCHECK=60 <== 与邮件有关。每 60 秒去扫瞄一次信箱有无新信! OLDPWD=/home <== 上个工作目录。我们可以用 cd - 来取用这个变量。 OSTYPE=linux-gnu <== 操作系统的类型! PPID=20046 <== 父程序的 PID (会在后续章节才介绍) PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"' <== 上面这个是命令提示字符!与底下也有关。 PS1='[\u@\h \W]\$ ' <== PS1 就厉害了。这个是命令提示字符,也就是我们常见的 [root@linux ~]# 或 [dmtsai ~]$ 的设定值啦!可以更动的! RANDOM=13586 <== 随机数啊!上面已经提过啰~ SUPPORTED=zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8 <== 本系统所支持的语系 name=VBird <== 刚刚设定的自定义变量也可以被列出来喔! $ <== 目前这个 shell 所使用的 PID ? <== 刚刚执行完指令的回传值。
比较重要的变量:
-
PS1:(提示符的设置)
FC4 的环境下, 默认的 bash 的 PS1 变量内的特殊符号代表意义:\d :代表日期,格式为 Weekday Month Date,例如 "Mon Aug 1" \H :完整的主机名。举例来说,鸟哥的练习机 linux.dmtsai.tw ,那么这个主机名就是 linux.dmtsai.tw \h :仅取主机名的第一个名字。以上述来讲,就是 linux 而已, .dmtsai.tw 被省略。 \t :显示时间,为 24 小时格式,如: HH:MM:SS \T :显示时间,12 小时的时间格式! \A :显示时间,24 小时格式, HH:MM \u :目前使用者的账号名称; \v :BASH 的版本信息; \w :完整的工作目录名称。家目录会以 ~ 取代; \W :利用 basename 取得工作目录名称,所以仅会列出最后一个目录名。 \# :下达的第几个指令。 \$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~
-
$:(关于本 shell 的 PID)
PID:进程号;想知道shell的PID,使用 echo $$即可 -
?:(关于上个执行指令的回传码)
当我们执行某些指令时, 这些指令都会回传一个执行后的代码。一般来说,如果成功的执行该指令, 则会回传一个 0 值,如果执行过程发生错误,就会回传『错误代码』,一般就是以非为 0 的数值来取代。 -
OSTYPE, HOSTTYPE, MACHTYPE:(主机硬件与核心的等级)
与程序安装有关
- 自定义变量转成环境变量:export
让变量内容在子程序中使用:
export 变量
如果仅下达export而没有变量会将所有的“环境变量”显示出来。
语系文件的变量(locale)
[root@linux ~]# LANG <==主语言的环境
[root@linux ~]# LC_CTYPE <==字符辨识的编码
[root@linux ~]# LC_NUMERIC <==数字系统的显示讯息
[root@linux ~]# LC_TIME <==时间系统的显示数据
[root@linux ~]# LC_COLLATE <==字符串的比较与排序等
[root@linux ~]# LC_MONETARY <==币值格式的显示等
[root@linux ~]# LC_MESSAGES <==讯息显示的内容,如菜单、错误讯息等
[root@linux ~]# LC_ALL <==语言环境的整体设定。
语系文件都放置在: /usr/lib/locale/
语系配置文件:/etc/sysconfig/i18n
变量的有效范围
环境变量可以让子程序继续引用的原因:
- 启动一个 shell 时,操作系统分配一块内存给 shell 使用,这个区域的环境变量可以让子程序访问;
- 利用 export 功能,可以让变量内容写道上述内存中(环境变量);
- 当加载另一个 shell 时(即启动子程序,而离开原来的父程序),子 shell 可以将父 shell 的环境变量所在的内存导入自己的环境变量区块中。
变量键盘读取、数组与声明:read、array、declare
-
read
[root@linux ~]# read [-pt] variable 参数: -p :后面可以接提示字符! -t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者
-
declare / typeset
[root@linux ~]# declare [-aixr] variable 参数: -a :将后面的 variable 定义成为数组 (array) -i :将后面接的 variable 定义成为整数数字 (integer) -x :用法与 export 一样,就是将后面的 variable 变成环境变量; -r :将一个 variable 的变量设定成为 readonly(只读) ,该变量不可被更改内容,也不能 unset(取消设置)
-
数组属性 array 说明
数组的设置方式:var[index]=content
读取: echo “${数组}”
与文件系统及程序的限制关系:ulimit
[root@linux ~]# ulimit [-SHacdflmnpstuv] [配额]
参数:
-H :hard limit ,严格的设定,必定不能超过设定的值;
-S :soft limit ,警告的设定,可以超过这个设定值,但是会有警告讯息,
并且,还是无法超过 hard limit 的喔!也就是说,假设我的 soft limit
为 80 , hard limit 为 100 ,那么我的某个资源可以用到 90 ,
可以超过 80 ,还是无法超过 100 ,而且在 80~90 之间,会有警告讯息的意思。
-a :列出所有的限制额度;
-c :可建立的最大核心档案容量 (core files)
-d :程序数据可使用的最大容量
-f :此 shell 可以建立的最大档案容量 (一般可能设定为 2GB)单位为 Kbytes
-l :可用于锁定 (lock) 的内存量
-p :可用以管线处理 (pipe) 的数量
-t :可使用的最大 CPU 时间 (单位为秒)
-u :单一用户可以使用的最大程序(process)数量
命令别名与历史命令
命令别名设置:alias、unalias
alias 设置别名
unalias 取消别名
历史命令:history
查询命令
[root@linux ~]# history [n]
[root@linux ~]# history [-c]
[root@linux ~]# history [-raw] histfiles
参数:
n :数字,意思是『要列出最近的 n 笔命令行表』的意思!
-c :将目前的 shell 中的所有 history 内容全部消除
-a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,
则预设写入 ~/.bash_history
-r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;
-w :将目前的 history 记忆内容写入 histfiles 中!
执行命令
[root@linux ~]# !number
[root@linux ~]# !command
[root@linux ~]# !!
参数:
number :执行第几笔指令的意思;
command :由最近的指令向前搜寻『指令串开头为 command』的那个指令,并执行;
!! :就是执行上一个指令(相当于按↑按键后,按 Enter)
Bash Shell 使用环境
登陆消息显示数据: /etc/issue、/etc/motd
issue 内各代码的意义:
代码 | 说明 |
---|---|
\d | 本地端时间的日期 |
\l | 显示第几个终端接口 |
\m | 显示硬件的等级 (i386/i486/i586/i686…) |
\n | 显示主机的网络名称 |
\o | 显示 domain name(域名) |
\r | 操作系统的版本 (相当于 uname -r) |
\t | 显示本地端时间的时间 |
\s | 操作系统的名称 |
\v | 操作系统的版本 |
/etc/issue.net :它是提供给 telnet 这个远程登录程序用的。 当我们使用 telnet 连接到主机时,主机的登入画面就会显示 /etc/issue.net 而不是 /etc/issue
环境设置文件: bashrc, ~/.bashrc, ~/.profile, profile…,/etc/inputrc, source
-
系统设置值
① /etc/sysconfig/i18n :语言/语系设置文件
② /etc/profile :该文件设置了几个重要变量(PATH USER MAIL HOSTNAME HISTSIZE UMASK等)
③ /etc/bashrc :确定 umask 的功能,也确定提示符的内容(PS1)
④ /etc/profile.d/*.sh :针对 bash 及 C-shell 规范了一些数据
⑤ /etc/man.config :规范了使用 man 的时候, man page 的路径到哪里去寻找 -
个人设置值
① ~/.bash_profile(默认), ~/.bash_login, ~/.profile :三个只要一个即可,定义个性化的路径(PATH)与环境变量等,只在登录时读取一次。
② ~/.bashrc :个人化设定值,例如命令别名、路径等,每次执行 shell 脚本时,都会重新读取这个文件。
③ ~/.bash_history :历史命令,登录时读取
④ ~/.bash_logout :记录『当我注销 bash 后,系统再帮我做完什么动作后才离开』让设置文件立即生效:
[root@linux ~]# source file
-
登录 shell 与非登录 shell
当登入 Linux ,亦即是取得 login shell 时,会读取 ~/.bash_profile, ~/.bash_login, ~/.profile, 这三个档案的优先级已经在上面提过,自行参考一下。至于在取得 login shell 后继续动作的其他 non-login shell ,读取的就是仅有 ~/.bashrc 啰~
终端的环境设置:stty、set
root@linux ~]# stty [-a]
参数:
-a :将目前所有的 stty 参数列出来;
几个重要的参数代表的含义:
- eof : End of file (文件结束)的意思,代表『结束输入』。
- erase : 向后删除字符,
- intr : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序;
- kill : 删除在目前指令列上的所有文字;
- quit : 送出一个 quit 的讯号给目前正在 run 的程序;
- start : 在某个程序停止后,重新启动他的 output
- stop : 停止目前屏幕的输出;
- susp : 送出一个 terminal stop 的讯号给正在 run 的程序。
如果你想要用 [ctrl]+h 来进行字符的删除,那么可以下达:
[root@linux ~]# stty erase ^h
从此之后,你的删除字符就得要使用 [ctrl]+h 啰,按下 [backspace] 则会出现 ^? 字样了, 如果想要恢复利用 [backspace] ,就下达 stty erase ^? 即可
set来设置:
[root@linux ~]# set [-uvCHhmBx]
参数:
-u :预设不启用。若启用后,当使用未设定变量时,会显示错误讯息;
-v :预设不启用。若启用后,在讯息被输出前,会先显示讯息的原始内容;
-x :预设不启用。若启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号)
-h :预设启用。与历史命令有关(下节介绍);
-H :预设启用。与历史命令有关(下节介绍);
-m :预设启用。与工作管理有关(未来介绍);
-B :预设启用。与刮号 [] 的作用有关;
-C :预设不启用。若使用 > 等,则若档案存在时,该档案不会被覆盖。
[root@linux ~]# echo $-
himBH
# 那个 $- 变量内容就是 set 的所有设定啦! bash 预设是 himBH 喔!
其实我们还有其他的按键设定功能呢!就是在 /etc/inputrc 这个档案里面设定。
[root@linux ~]# cat /etc/inputrc
通配符与特殊符号
符号 | 内容 |
---|---|
* | 通配符,代表 0 个或多个字符(或数字) |
? | 通配符,代表『一定有』一个字母 |
# | 注释,这个最常被使用在 script(脚本) 当中,视为说明! |
\ | 转义符号,将『特殊字符或通配符』还原成一般字符 |
丨 | 分隔两个管道命令 |
; | 连续命令的分隔(注意!与管线命令并不相同) |
~ | 用户的家目录 |
$ | 变量之前需要加的变量替换值 |
& | 将指令变成后台工作 |
! | 逻辑运算意义上的『非』 not 的意思! |
/ | 路径分隔的符号 |
>, >> | 输出导向,分别是『替换』与『累加』 |
’ | 单引号,不具有变量置换的功能 |
" | 具有变量置换的功能! |
| 两个『 ` 』中间为可以先执行的指令! |
( ) | 在中间为子 shell 的起始与结束 |
[ ] | 在中间为字符的组合 |
{ } | 在中间为命令区块的组合! |
组合按键 | 执行结果 |
Ctrl + C | 终止当前的命令 |
Ctrl + D | 输入结束(EOF),例如邮件结束的时候 |
Ctrl + M | 就是 Enter 啦! |
Ctrl + S | 暂停屏幕的输出 |
Ctrl + Q | 恢复屏幕的输出 |
Ctrl + U | 在提示字符下,将整行命令删除 |
Ctrl + Z | 『暂停』当前的命令 |
数据流重导向
命令的执行如图:
执行命令时,这个命令可能会通过文件读入数据,经过处理后,再将数据输出到屏幕上。如图,标准输出和标准错误分别表示标准输出和标准错误输出。
在这样的过程中,可以将标准错误(简称stderr)与标准输出(简称stdout)传送到其他不同的地方,而不是屏幕上。传送的目标处,通常是文件或设备。
传送的命令如下:
① 标准输入(stdin) :代码为 0 ,使用 < 或 << ;
② 标准输出(stdout):代码为 1 ,使用 > 或 >> ;
③ 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
/dev/null 垃圾桶 (一般错误信息发到垃圾桶)
将错误输出和标准输出到同一个文件中 2> &1
使用命令输出重导向的场合:
- 当屏幕输出的信息很重要,而且我们需要将它存下来的时候;
- 背景执行中的程序,不希望它干扰屏幕正常的输出结果时;
- 一些系统的例行命令(例如写在 /etc/crontab 中的文件)的执行结果,希望它可以存下来时;
- 一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时;
- 错误讯息与正确讯息需要分别输出时。
命令执行的判断根据:;、&&、||
;为命令分隔符,;前命令执行完后才执行;后的命令
&& 前为true 才执行&& 后的命令
||前为false 才执行 || 后的命令
由于指令是一个接着一个去执行的,因此,如果真要使用判断, 那么这个 && 与 || 的顺序就不能搞错~一般来说,判断式最多会有三个,也就是:
command1 && command2 || command3
而且顺序通常不会变,因为一般来说, command2 与 command3 会放置肯定可以执行成功的指令
管道命令(pipe)
管道命令“|”仅能处理通过前面一个命令传来的正确信息。
选取命令:cut、grep
-
cut
[root@linux ~]# cut -d'分隔字符' -f fields [root@linux ~]# cut -c 字符区间 参数: -d :后面接分隔字符。与 -f 一起使用; -f :依据 -d 的分隔字符将一段消息分为数段,用 -f 取出第几段的意思; -c :以字符 (characters) 的单位取出固定字符范围;
常用在分析数据或文字数据时,cut 在处理多空格相连的数据时,会比较吃力。
-
grep
[root@linux ~]# grep [-acinv] '搜索字符串' filename 参数: -a :将 binary(二进制) 文件以 text(文本) 文件的方式搜索数据 -c :计算找到 '搜索字符串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺便输出行号 -v :反向选择,即显示出没有 '搜索字符串' 内容的那一行!
grep 可以解析一行文字,取得关键词,若该行存在关键词,就会整行列出来。
排序命令:sort、wc、unip
-
sort
[root@linux ~]# sort [-fbMnrtuk] [file or stdin] 参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同; -b :忽略最前面的空格符部分; -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; -n :使用『纯数字』进行排序(默认是以文字类型来排序的); -r :反向排序; -u :就是 uniq ,相同的数据中,仅出现一行代表; -t :分隔符,预设是 tab 键; -k :以那个区间 (field) 来进行排序的意思。
-
uniq
[root@linux ~]# uniq [-ic] 参数: -i :忽略大小写字符的不同; -c :进行计数
-
wc
[root@linux ~]# wc [-lwm] 参数: -l :仅显示多少行; -w :仅显示多少字(英文单词); -m :多少字符。
双向重导向:tee
tee 的工作流程:
[root@linux ~]# tee [-a] file
参数:
-a :以累加 (append) 的方式,将数据加入 file 当中
字符转换命令:tr、col、join、paste、expand
-
tr
[root@linux ~]# tr [-ds] SET1 ... 参数: -d :删除消息当中的 SET1 这个字符串; -s :替换掉重复的字符! 注:DOS下的换行符 ^M = \r
-
col
[root@linux ~]# col [-x] 参数: -x :将 tab 键转换成对等的空格键
-
join
[root@linux ~]# join [-ti12] file1 file2 参数: -t :join 默认以空格符分隔数据,并且比对『第一个字段』的数据, 如果两个文件相同,则将两个数据联成一行,且第一个字段放在第一个! -i :忽略大小写的差异; -1 :这个是数字的 1 ,代表『第一个文件要用那个字段来分析』的意思; -2 :代表『第二个文件要用那个字段来分析』的意思。
-
paste
[root@linux ~]# paste [-d] file1 file2 参数: -d :后面可以接分隔字符。预设是以 [tab] 来分隔的! - :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。
-
expand
[root@linux ~]# expand [-t] file 参数: -t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。 我们也可以自行定义一个 [tab] 按键代表多少个字符呢!
unexpand 将空白转成[Tab]
拆分命令:split
[root@linux ~]# split [-bl] file PREFIX
参数:
-b :后面可接要拆分的文件大小,可加单位,例如 b, k, m 等;
-l :按行数来进行拆分。
参数代换:xargs
[root@linux ~]# xargs [-0epn] command
参数:
-0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数
可以将他还原成一般字符。这个参数可以用于特殊状态喔!
-e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到
这个字符串时,就会停止继续工作!
-p :在执行每个指令的 argument(参数) 时,都会询问使用者的意思;
-n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。
当 xargs 后面没有接任何的指令时,默认是以 echo 来进行输出喔!
减号(-)的用途
stdin 与 stdout 可以利用减号 “-” 来替代
课后习题及答案
-
在 Linux 上可以找到哪些 shell(举出三个) ?哪个文件记录可用的 shell ?而 Linux 默认的 shell 是什么?
① /bin/bash, /bin/tcsh, /bin/csh
②/etc/shells
③ bash ,亦即是 /bin/bash。 -
在 shell 环境下,有个提示字符 (prompt),它可以修改吗?要改什么?默认的提示字符内容是什么?
可以修改的,改 PS1 这个变量,这个 PS1 变量的默认内容为:『[\u@\h \W]$』
-
如何显示 HOME 环境变量?
echo $HOME
-
如何得知目前的所有变量与环境变量的设定值?
环境变量用 env 而所有变量用 set 即可显示
-
是否可以设定一个变量名称为 3myhome ?
不行!变量不能以数字做为开头,参考变量设定规则的内容
-
在这样的练习中『A=B』且『B=C』,若我下达『unset $A』,则取消的变量是 A 还是 B?
被取消的是 B 喔,因为 unset $A 相当于 unset B 所以取消的是 B ,A 会继续存在!
-
如何取消变量与命令别名的内容?
使用 unset 及 unalias 即可
-
如何设定一个变量名称为 name 内容为 It’s my name ?
name=It’s\ my\ name 或 name=“It’s my name”
-
环境变量文件的加载顺序?
先由 /etc/passwd 取得 bash 这个 shell ,再到 /etc/profile 读取主要的环境变量,同时亦会将 /etc/inputrc 及 /etc/profile.d 内容均读入。之后,再到个人的家目录读取 ~/.bash_profile 及 ~/.bashrc 等档案!
-
man page 的路径设置文件是什么?
/etc/man.config 或 /etc/man.conf
-
试说明 ', ", 与 ` 这些符号在变量定义中的用途?
参考变量规则那一章节,其中, " 可以具有变量的上下文属性, ’ 则仅有一般字符,至于 ` 之内则是可先被执行的指令。
-
转义符号 \ 有什么用途?
可以用来转义特殊字符,例如 Enter, $ 等等,使成为一般字符!
-
连续命令中, ;, &&, || 有何不同?
分号可以让两个 command 连续运作,不考虑 command1 的输出状态, && 则前一个指令必需要没有错误讯息,亦即回传值需为 0 则 command2 才会被执行, || 则与 && 相反!
-
如何将 last 的结果中,独立出账号,并且印出本月份曾经登入过的账号?
last | cut –d “ “ –f1 | sort | uniq
-
请问 foo1 && foo2 | foo3 > foo4 ,这个指令串当中, foo1/foo2/foo3/foo4 是指令还是文件? 整串指令的意义为?
foo1/foo2 与 foo3 都是指令, foo4 是装置或档案。整串指令意义为:
当 foo1 执行结果有错误时,则该指令串结束;
若 foo1 执行结果没有错误时,则执行 foo2 | foo3 > foo4 ;
foo2 将 stdout 输出的结果传给 foo3 处理;
foo3 将来自 foo2 的 stdout 当成 stdin ,处理完后将数据流重新导向 foo4 这个装置/档案 -
如何列出在 /bin 底下任何以 a 为开头的文件名的详细资料?
ls -l /bin/a*
-
如何列出 /bin 底下,文件名为四个字符的文件?
ls -l /bin/???
-
如何列出 /bin 底下,文件名开头不是 a-d 的文件?
ls -l /bin/[!a-d]*
-
当我离开 bash 后,希望系统可以帮我将最近工作的:1.)工作日期; 2.)100 个历史命令独立 记录到 ~/.bash_localcom 档案中,该如何设定?
我可以编辑 ~/.bash_logout ,将这个档案内容变成:
# ~/.bash_logout
date >> ~/.bash_localcom
history 100 >> ~/.bash_localcom
clear -
我想要让终端机接口的登入提示字符修改成我自己喜好的模样,应该要改哪里?(filename)
/etc/issue
-
承上题,如果我是想要让使用者登入后,才显示欢迎讯息,又应该要改哪里?
/etc/motd