第二部分 第11章 认识Bash Shell
1.什么是Shell, 狭义的是指Bash,广义的就是指同核心交互的程序
2.shell的变量功能
1) echo 获取变量,echo $variable 例子:echo $PATH
echo $HOME ,$MAIL
2) 设置变量,myname=dillon, echo $myname
设置变量的规则
1.用=来连接
2.等号两边不能直接接空格
3.变量名称,只能是英文,数字,,数字不能是开头字符
4.若有空格,可以用“”,或‘’,“”保持变量特性,‘’仅为一般字符
5.必要时需要转移字符“/”(Enter,$, /,空格,‘)
6.用其他命令的方式:`command`
7.若变量为扩展变量内容,需用双引号及$变量名称,如“$PATH”:/home
累加
8.若该变量需要在其他子程序中执行,需要用export使变量变成环境
变量,如exprt PATH
9.通常大写字母为系统默认值,自行设置变量可以使用小写,便于判断
10.取消变量的方法为:unset变量名称
3) 一些环境变量的说明,env
HOME: 用户家目录
SHELL:当前环境使用的shell程序,bash默认的是/bin/bash
HISTSIZE:记录保存的历史数量个数
ENV:用户所用的环境设置文件的读取文件
MAIL:系统读取的邮件信箱文件
PATH:文件搜索路径,用:分隔,文件的目录顺序也很重要
LANG:语系文件
RANDOM:随机数变量
4)其他所得变量 :set
显示环境变量和其他所有自定义变量
几个重要的:
PS1:提示符的设置,命令提示符。默认的PS1特殊符号的含义:
/d:代表日期,
/H: 完整的主机名
/h: 主机的名称的第一个名字
/t: 显示时间,24小时格式
/T: 显示时间,12小时
/A: 24小时制,HH:MM
/u: 当前账户名称
/v: bash版本信息
/w:完整的工作目录,home以~替换
/W:利用basename取得工作目录的名称,所以仅会列出最后一个目录名
/#: 执行的第几个命令
/$: 提示符,如果是root提示符为#,否则为$
$ :当前PID,echo $$
?:上一个执行的命令所回传的值
OSTYPE HOSTTYPE MACHTYPE
5)自定义变量转化成环境变量 export
6)语系文件的变量(locale)
需要i18l支持的帮助,中文至少支持两种编码,BIG5和UTF-8
LANG:主语言环境
LC_CTYPE : 字符辨别的编码
LC_NUMERIC : 数字系统的显示消息
LC_ TIME: 时间系统的显示时间
LC_COLLATE: 字符窜的比较与排序
LC_MONETARY: 币值格式的显示
LC_MESSAGES: 消息内容的显示,如菜单,错误消息
LC_ALL: 语言环境整体设置
7)变量的有效范围
export的变量,其他子程序可以继续使用,没有export的则无法使用
环境变量可以让子程序继续使用的原因:
1)启动一个shell时,操作系统分配一块内容给shell,这个区域
的变量可以让子程序访问
2)使用export功能,可以让变量内容写到上述内存中(环境变量)
3)加载另一个shell时,子shell可以将父shell的环境变量所在内容
导入到自己的环境变量区块中
8)变量的键盘读取,数组与声明:read,array,declare
1.read read [-pt] variable
2.declare / typeset
declare [-aixr] variable
-a: 后面的变量定义为数组
-i:定义为数字
-x:定义为环境变量
-r: 设置为只读,不能更改,也不能取消设置
3.数组属性array说明
var[index]=contect
echo "${var[1]}"
9) 与文件系统及程序的限制关系:ulimit
ulimit [-SHacdflmnpstuv] [配额]
10)附加的变量设置功能
var=${str-expr}
var=${str:-expr}
var=${str+expr}
var=${str:+expr}
var=${str=expr}
var=${str:=expr}
var=${str?expr}
var=${str:?expr}
11) 命令别名与历史命令
alias cls=clear
alias lm='lm -l | more'
alias dir='ls -l'
unalias dir
12) 历史命令 history
history -n, history -c history -a history -w
!number, !command
13) 环境设置文件
etc/sysconfig/i18n 设置语系数据
/etc/profile 设置几个重要的数据变量,PATH,USER
MAIL,HOSTNAME,HISTSIZE
/etc/bashrc :确定umask功能,提示符内容(PS1)
/etc/profile.d/*.sh : 针对bash及C-shell规范了一些数据,
/etc/man.config :设置man page的搜索路径
/etc/inittab : 设置初始进入linux的模式。3代表字符控制台模式
5代表 X11 模式
14)个人设置值
~/.bash_profile, ~/.bash_login, ~/.profile
这个文件可以定义个性化的路径与环境变量
~/.bashrc 每次执行shell脚本时会重新读取这个文件,所以是最
完整的。而~/.bash_profile则只有在登录时才读取一次
~/bash_history 历史记录记录在这里,每次独立bash都会读取这个
文件
~/.bash_logout 这个文件记录,“当我注销后,系统再帮我做什么
操作后才离开”。
读取规则:
1.先读取 /etc/profile 再跟去/etc/profile内容读取其他附加
设置文件,例如/etc/profile.d与/etc/inputc等设置文件
2.根据不同用户读取~/.bash_profile ~/.bash_login ~/.profile
3.根据不同目录,读取~/.bashrc
利用source 指令或者. 都可以将设置文件的内容读进当前的shell环境
中。
/etc/issue 登录消息显示
/etc/motd 编辑用户登录后欢迎信息
15) 登录shell与非登录shell
登录shell,是用户登录linux系统时,所取得的那个shell。当登录后
再去执行其他shell,就是非登录shell。
X环境下所启动的终端,都是非登录shell
取得登录shell后,继续其他操作的shell时,读取的仅有!/.bashrc
大部分~/.bash_profile的内容都指向~/.bashrc
16) 终端的环境设置 stty, set
stty -a 列出当前所有的stty参数
特殊按键,[Ctrl] = ^
eof : 结束输入
erase :向后删除字符
intr:给当前正在运行的程序发送一个interrupt(中断)信号
kill:删除在当前命令行上的所有文字
quit:给当前正在运行的程序发送一个quit信号
start: 程序重启后,重新启动它的输出
stop: 停止当前的屏幕输出
susp: 给正在运行的程序发送terminal stop(终端停止)信号
set : 设置变量相关,echo $-, 显示所有默认设置
set -u 未定义变量,显示错误消息
set -x 显示该命令内容
其他键的设置功能,在/etc/inputrc
17)通配符与特殊符号
*,?,略
# :注释
/ :转义
| :分隔两个管道命令
; :连续两个命令的分隔符
~ : 用户家目录
$ :加在变量前面,变量替换
& :将命令变成后台工作
! :逻辑非
/ :路径分隔符
>, >>,输出导向,分别是输出与累加
’ :单引号,不具有变量置换功能
” : 具有变量置换功能
`` : 中间为可先执行的命令 可以用$()替换
() : 中间为子shell的起始于结束
[] : 中间为字符的组合
{} :中间为命令区块的组合
组合键:
Ctrl + C : 终止当前命令
Ctrl + D : 输入结束
Ctrl + M :就是Enter
Ctrl + S :暂停屏幕输出
Ctrl + Q :恢复屏幕的输出
Ctrl + U :在提示符下,删除整行命令
Ctrl + Z : 暂停当前命令
18) 数据流重导向
就是将某个命令执行后应该出现在屏幕上的数据,传输到其他地方。
一般命令执行流程
文件=》命令=>文件/设备
传送命令:
1.标准输入(stdin):代码为0,使用<或<<
2.标准输出(stdout):代码为1,使用>或>>
3.标准错误输出(stderr):代码为2,使用2> 或2>>
使用>, >>, >是替换功能,>>是追加功能
command > 1> 2> 2>> < 设备或文件
> 与 1>相同,都是标注输出,可以省略。
多个输出:find /home -name testing > list_right 2> list_error
一个输出:find /home -name testing > list_right 2> dev/null
同时输出到一个文件:
find /home -name testing > list 2>&1(特别注意,
&1表示输入到第一个设备)
输入:
cat > catfile :键盘输入,Ctrl + D结束
cat > catfile < testingfile
testingfile文件的内容将输出到catfile里面
cat > catfile <<eof
结束符为eof
用命令重导向的情况:
1.屏幕输出很总要,需要保存下来
2.后台执行的程序,不希望它干扰屏幕正常的输出结果
3.一些系统的例行命令执行结果,写昂可以保存
4.一些命令,我们可能已经知道错误消息,2>/dev/null将之去掉
5.错误消息与正确消息需要分别输出
19) 命令执行的判断依据:;,&&, ||
多个命令执行,用;隔开即可
&& 执行成功就执行后面的命令
|| 执行不成功然后执行后面的命令
20) 管道命令(pipe)
ls -al /etc | less
| 仅能处理通过前面一个命令传来的正确信息,也就是标准输出
(stdout)的信息,对于标准错误,并没有直接处理的能力。
后一个命令的输入是前一个命令的输出。
21) 选取命令:cut,grep
将一段数据分析后,取出我们想要的部分,或者通过分析关键词,
取得我们想要的行。一般来说,都是针对“逐行”分析的。
cut -d'分隔符' -f fields : 按照分隔符将一段消息分为数段
cut -c 字符范围 : 选组字符范围
echo $PATH | cut -d ':' -f 5
export | cut -c 12-20
last | cut -d ' ' -f 1
last | cut -d ' ' -f 1,2
grep [-acinv] '搜索字符串' filename
last | grep 'root'
last | grep -v 'root'
last | grep 'root' | cut -d ' ' -f 1
grep 支持正则表达式,可以解析一行文字,取得关键字,若存在此
关键字,则整行都会列出来
22) 排序命令: sort, wc, uniq
sort [-fbMnrtuk] [file or stdin]
cat /etc/passwd | sort
cat /etc/passwd | sort -t ':' -k 3
(以":"分隔,第三栏来进行排序,文字排序)
cat /etc/passwd | sort -t ':' -k 3 -n
(以":"分隔,第三栏来进行排序, 数字排序)
last | cut -d ‘ ’ -f 1 | sort (选取并排序)
uniq [-ic], 将重复的数据仅显示一次
last | cut -d ‘ ’ -f 1 | sort | uniq (不显示重复的)
last | cut -d ‘ ’ -f 1 | sort | uniq -c (显示计数)
wc [-lwm] :显示一个文件里有多少行,多少字,多少字节数。
cat /etc/man.config | wc
last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
显示登录的人的总次数
23) 双向重导向
既想出来数据流,又想保存文件等,可以tee命令
tee [-a] file
last | tee last.list | cut -d " " -f 1
ls -l /home | tee ~/homefile | more
ls -l /home | tee -a ~/homefile | more
24) 字符转换命令 :tr,col,join, paste, expand
tr [-ds] SET1 ..., 删除,或者文字消息的替换
last | tr '[a-z]' ['A-Z']
cat /etc/passwd | tr -d ':'
cat /dostext | tr -d '/r' > dostex-noM
col [-x] : 将tab键转换成对等的空格键
cat /etc/man.config | col -x | cat -A | more
join [-ti12] file1 file2
处理两个文件有相同的数据行,将他们加在一起
join -t ':' /etc/passwd /etc/shadow
join -t ':' -l 4 /etc/passwd -2 3 /etc/group
paste [-d] file1 file2,将两行贴在一起,中间以“tab”建隔开
paste /etc/passwd /etc/shadow
cat /etc/group | paste /etc/passwd /etc/shadow - | head -n 3
(重点在-使用上, 常常表示stdin)
expand [-t] file
将tab剑转成空格键
grep ‘^MANPATH’ /etc/man.config | head -n 3 | expand -t 6 -
| cat -A
25)文件拆分
split [-bl] file PREFIX
cd /tmp; split -b 300k /etc/terminfo terminfo
cat terminfo* >> terminfoback
ls -al / | split -l 10 -lsroot
26)参数代替 xargs [-0epn] command (产生参数共命令使用)
cut -d ':' -f 1 < /etc/passwd | head -n 3 | xargs finger
cut -d ':' -f 1 < /etc/passwd | head -n 3 | xargs -p finger
cut -d ':' -f 1 < /etc/passwd | xargs -p -n 5 finger
cut -d ':' -f 1 < /etc/passwd | xargs -p -e 'lp' finger
27) 减号(-)的用途
tar -cvf - /home | tar -xvf -
习题:
1.在Linux上可以找到哪些shell, 哪个文件记录可以的shell,
Linux默认的shell是什么
答:etc/shells 默认shell是bash
2.在shell环境下,有个提示符(prompt),它可以修改么,要改什么,
默认的提示符内容是什么
答:可以修改,修改PS1变量即可,默认提示符是'/[/u@/h/W/]/$'
3.如何显示HOME环境变量
答:echo $HOME
4.如何得知当前的所有变量与环境变量的设置值
答:set 和 env 或 export
5.是否可以设置一个变量名称为3myhome
答:不可以,变量名称开头不能是3
6.在这样的练习中“A=B且B=C“,执行”unset $A“ ,是取消的A还是B
答:取消的是B, $A相当于是去的B的名称
7.如何取消变量和命令别名的内容
答:unset variable and unalias command
8.如何设置一个变量名称为name内容为“It's my name”
答:name="It's my name"
9.环境变量文件的加载顺序是什么
答:系统先加载/etc/profile
10.man page的路径设置文件是什么
答:/etc/man.config
根据不同用户加载~/.bash_profile, ~/.bash_login, ~/.profile
根据不同的用户读取~/.bashrc
11.试说明‘,“,` 符号在变量定义中的用处
答:’ :单引号,不具有变量置换功能
” : 具有变量置换功能
`` : 中间为可先执行的命令 可以用$()替换
12.转义符号/有什么用途
答:用于表示一些特殊的符号,//, /', /"等
13.连续命令中,;&& || 有何不同
答:&& 前一个命令执行成功才执行后面的,|| 前一个命令执行不成功执行
才执行后面的指令
14.如何在last的结果中,独立显示出帐号,并且显示本月份
曾经登录过的帐号
答:last | cut -d ' ' -f 1 | sort | uniq
15.请问foo1 && foo2 | foo3 > foo4 中,foo1/foo2/foo3/foo4
是命令还是文件,整串命令的含义是什么
答:fool 是命令 foo2是命令 foo3 是命令 foo4是文件
执行foo1指令成功执行foo2,输出的结果让foo3进行操作,foo3
输出的结果写入到foo4文件中
16.如何显示出在/bin下任何以a为文件名的详细数据
答:ls -al /bin/a*
17.如何显示出/bin下文件名为4个字符的文件
答:ls /bin/????
18.如何显示出/bin下文件名开头不是a-d的文件
答:ls /bin/[!a-z]*
19.离开bash后,希望系统可以将最近工作的:工作日期,100个历史命令
独立记录到~/.bash_localcom 文件中,改如何设置
答:vi ~/.bash_logout
date >> ~/.bash_localcom
history 100 >> ~/.bash_localcom
20.要将终端机接口的登录提示符修改成自己喜好的样子,应该在哪里修改
答:PS1='/[/u@/h/W/]/$'
21.想让用户登录后才显示欢迎信息,应该在哪里修改
答:进入etc/motd修改