shell的变量功能
1.变量的配置守则
- 若该变量需要在其它子程序运行,则需要用export使变量成为环境变量环境变量
export name=Tom
在其它子程序中会使用到该变量的值 - 取消变量的方法为unset
- 变量的配置当中,单引号与双引号的用途有何不同?
双引号中仍然可以保留变量的内容,单引号仅能是一般字符
name=TOM
myname=“He is ${name}”
myname=‘He is ${name}’ - ``的意义
在一串命令中, `中的命令将先被运行,其运行出来的结果将作为外部的输入信息 - read:用来读取用户的输入
read atest
Tom <=此时光标等待输入
echo $atest
输出 Tom
- 变量的类型 declare/typeset
declare [-aixr] var
选项与参数: -a则将var定义成数组(array)
-i 定义成整数数字(integer)
-x 用法与export一样,将var定义成环境变量
-r 将var定义成readonly
declare -x sum #让sum变为环境变量
export | grep sum #输出450
declare +x sum #让sum变为非环境变量的自定义变量
declare -p sum #列出sum的类型;
定义数组
score_arr[1]="97" #数组的名称为score_arr
score_arr[2]="71"
echo $score_arr[2]
命令别名和历史命令
- 命令别名配置 alias, unalias
alias lm='ls -al | more'
取消
unalias lm
- 历史命令: history
查看历史命令
history #列出所有历史命令
history 10 #列出最近10个历史命令
history -c 将历史命令全部清除
配置文件
- ~/.bash_priofile (login shell才会读)
bash在读完整体的环境配置,再读个人配置,会按照下列次序,如果命中一个,则后面的就不会读,次序如下:
~/.bash_profile
~/.bash_login
~/.profile
- source 读入环境配置文件的命令
source或.都可以将配置文件的内容读入到目前的环境中 - ~/.bashrc (non-login shell才会读)
~/.bashrc: 在non-login shell这种非登陆情况取得 bash 操作接口的环境配置文件 - 快捷键
ctrl +c | 终止目前的命令 |
---|---|
ctrl + z | 暂停目前的命令 |
ctrl + s | 暂停屏幕的输出 |
ctrl + q | 恢复屏幕的输出 |
通配符及特殊符号
- 通配符
bash中常用的通配符如下:
* | 从0个到无穷个的任意字符 |
---|---|
? | 一定有一个字符, |
[] | 一定有一个在括号内 |
- | 在某一范围内 |
^ | 反向选择 |
例如:
ls ./???,列出文件名长度为5的文件
ls ./*[0-9]*, 列出文件名包含数字的文件
ls ./[^a-z]*, 列出开头非小写字母的文件
2. 特殊符号
# | 注释符号 |
---|---|
\ | 将通配符或特殊符号还原成一般符号 |
| | 管线 |
; | 连续命令的分隔符 |
~ | 用户的根目录 |
& | 工作控制(job control):将命令变成背景下的工作 |
! | 逻辑非 |
>,>> | 数据流重导向,输出导向,取代,累加 |
<,<< | 输入导向 |
‘’ | 单引号:不具备置换功能 |
“” | 具有置换功能 |
`` | 可以先运行的命令 |
() | 子shell的起始与结束 |
数据流重导向
- standard output 与 standard error output
标准输入(stdin) | 代码为 0,使用 < 或 << |
---|---|
标准输出(stdout) | 代码为 1 ,使用 > 或 >> |
标准错误输出(stderr) | 代码为 2 ,使用 2> 或 2>> |
- standard input : < 与 <<
将原本需要由文件输入的内容改为文件内容取代
命令运行的判断依据
很多命令我想一次性输入完成,不想分次运行,有下面两种情况
- cmd;cmd 命令之间没有相关性
- $?(命令回传值)与&&或||
若前一个命令正确,则$?=0
cmd1&&cmd2: 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2;若 cmd1 运行完毕且为错误 ($?≠0),则 cmd2 不运行。
cmd1 || cmd2: 若 cmd1 运行完毕且正确运行($?=0),则 cmd2 不运行;若 cmd1 运行完毕且为错误 ($?≠0),则开始运行 cmd2。
管线命令
- 什么是管线命令?
a.管线命令仅会处理 standard output,对于 standard error output 会予以忽略
b.管线命令必须要能够接受来自前一个命令的数据成为 standard input 继续处理才行。 - 截取命令: cut, grep
- cut:以行为单位,把信息给切出来
范例一:将 PATH 变量取出,我要找出第五个路径cut -d'分隔字符' -f fields <==用于有特定分隔字符 cut -c 字符区间 <==用于排列整齐的信息 选项与参数: -d :后面接分隔字符。与 -f 一起使用; -f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思; -c :以字符 (characters) 的单位取出固定字符区间;
# 那么如果想要列出第 3 与第 5 呢?,就是这样:[root@www ~]# echo $PATH /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games: \# 1 | 2 | 3 | 4 | 5 | 6 | 7 [root@www ~]# echo $PATH | cut -d ':' -f 5 \# 如同上面的数字显示,我们是以『 : 』作为分隔,因此会出现 /usr/local/bin
范例二:将 export 输出的信息,取得第 12 字符以后的所有字符串[root@www ~]# echo $PATH | cut -d ':' -f 3,5
[root@www ~]# export
declare -x HISTSIZE=“1000”
declare -x INPUTRC="/etc/inputrc"
declare -x KDEDIR="/usr"
declare -x LANG=“zh_TW.big5”
…(其他省略)…
# 注意看,每个数据都是排列整齐的输出!如果我们不想要『 declare -x 』时,
# 就得这么做:
[root@www ~]# export | cut -c 12-
HISTSIZE="1000"
INPUTRC="/etc/inputrc"
KDEDIR="/usr"
LANG="zh_TW.big5"
# 我们还可以指定某个范围的值,例如第 12-20 的字符,就是 cut -c 12-20 等等!
范例三:用 last 将显示的登陆者的信息中,仅留下用户大名
[root@www ~]# last
root pts/1 192.168.201.101 Sat Feb 7 12:35 still logged in
root pts/1 192.168.201.101 Fri Feb 6 12:13 - 18:46 (06:33)
root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16)
# last 可以输出『账号/终端机/来源/日期时间』的数据,并且是排列整齐的
[root@www ~]# last | cut -d ' ' -f 1
# 由输出的结果我们可以发现第一个空白分隔的字段代表账号,所以使用如上命令:
- grep
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 ‘搜寻字符串’ 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
–color=auto :可以将找到的关键词部分加上颜色的显示喔!
范例一:将 last 当中,有出现 root 的那一行就取出来;
[root@www ~]# last | grep 'root'
范例二:与范例一相反,只要没有 root 的就取出!
[root@www ~]# last | grep -v 'root'
范例三:在 last 的输出信息中,只要有 root 就取出,并且仅取第一栏
[root@www ~]# last | grep 'root' |cut -d ' ' -f1
# 在取出 root 之后,利用上个命令 cut 的处理,就能够仅取得第一栏啰!
范例四:取出 /etc/man.config 内含 MANPATH 的那几行
[root@www ~]# grep --color=auto 'MANPATH' /etc/man.config
....(前面省略)....
MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man
MANPATH_MAP /usr/bin/X11 /usr/X11R6/man
MANPATH_MAP /usr/bin/mh /usr/share/man
# 神奇的是,如果加上 --color=auto 的选项,找到的关键词部分会用特殊颜色显示喔!
- 排序命令: sort, wc, uniq