Linux鸟哥私房菜学习笔记_第十一章 学习和认识BASH

来源:互联网 发布:ad电路设计软件怎么样 编辑:程序博客网 时间:2024/05/16 15:14
命令编修能力(history)
~/.bash_history

命令与档案补全功能
[Tab]键 

Bash shell内建命令
type [-tpa] name :不加任何选项与参数时,type会显示出name是外部指令还是bash内建指令
-t :当加入-t参数时,type会显示出它的意义(file:外部指令,alias:命令别名,builtin:内建命令)
-p :后面接的name为外部指令时,才会显示完整文件名
-a :会有PATH变量定义的路径中,将所有含name的指令都列出来,包含alias
type locate
type -a cd
type -t ll

变量:就是以一组文字或符号等,来取代一些设定或者符号等,来取代一些设定或者是一串保留的数据
变量的取用与设定:echo,变量设定规则,unset
变量的设置原则:
1.用=来连结
2.等号两边不能直接接空格符
3.变量名称只能时英文字母与数字
4.变量内容包含空格符需要使用“”或‘’号将变量内容结合起来
5.使用跳脱符(\)将特殊符号变成一般字符(比如ENTER,‘等符号)
6.使用反单引号(``)或$号来获得其他指令信息
7.若变量为扩增变量内容时,则可用$变量名称或${变量}累加内容
8.若该变量需要在其他子程序执行,可需要以export来使变量变成环境变量
9.通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断
10.取消变量的方法为unset 变量名称

echo $PATH  :显示PATH变量
MYNAME=HELLOWORLD  :设置变量
echo $MYNAME  :显示变量内容
VERSION=$(uname -r)  :获取uname -r内容作为VERSION变量内容
VERSION=·uname -r·  :获取uname -r内容作为VERSION变量内容
PATH="$PATH":/home/bin  :累加变量内容
PATH=${PATH}:/home/bin  :累加变量内容
unset MYNAME  :取消变量名称
bash  :启用另一个shell程序
cd /lib/modules/$(uname -r)/kernel  :进入核心的模块目录

环境变量功能
env  :列出目前的shell环境下的所有环境变量与其内容
set :观察所有变量,含环境变量与自定义变量
HOME :家目录
SHELL :目前使用的SHELL是那支程序
HISTSIZE :与历史命令相关,记录数由这个决定
MAIL :当使用mail收信时,系统会去读取邮件信箱档案
PATH :执行文件搜寻的路径,目录与目录中介以冒号(:)分隔,
LANG :语系相关
RANDOM :随机数,系统会主动的随机取出一个介于0~32767的数字
declare -i number=$RANDOM*10/32768 ; echo $number  :随机取出0~9之间的数值
echo $$  :显示自己的pid,$代表自己的pid
echo $? :显示上一个执行命令的回传值
export :自定义变量转成环境变量
export MYNAME :将MYNAME设置为环境变量
export :后面没有接变量时,那么此时就会把所有的环境变量列出来

语系变量
locale -a :查看linux支持多少语系
echo $LANG :查看语系

变量的键盘读取
read yourname :由键盘输入内容作为yourname变量内容
read -p "Please enter your name:" -t 30 usernam :-p后面给提示信息,-t后面给超时时间

declare/typeset:宣告变量内心
declare [-aixr] variable
-a :将variable的变量定义成为数组array类型
-i :将variable的变量定义成为整数数字integer类型
-x :将variable的变量变成环境变量
-r :将变量设定为readonly类型,该变量不可被更改,也不饿能被unset
declare -i sum=100+20 :让变量sum进行100+20的总和
declare -x sum :将sum由自定义变量修改为环境变量
export | grep sum :查看环境变量中是否有sum
declare +x sum :将sum由环境变量修改为自定义变量
declare -p sum :列出变量类型

bash对于变量有几个基本的定义:
1.变量类型默认为字符串
2.bash环境中的数字运算,预设最多仅能达到整数形态,所以1/3结果为0

定义数组变量
var[1]="hello";var[2]="world" :定义两个数组并赋值
echo ${var[1]} ${var[2]} :打印数组内容

与文件系统及程序的限制关系:ulimit
ulimit [-SHacdfltu] [配额]
-H :hard limit ,严格的设定,不能超过这个值
-S :soft limit ,警告的设定,可以超过这个设定值,但会有警告信息
-a :后面不接参数。列出所有的限制额度
-c :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案,这种档案被成为核心档案(core file)
-f :此shell可以建立的最大档案容量,(一般可能设定为2G),单位为Kbytes
-d :程序可使用的最大断裂内存容量
-l :可用于锁定的内存量
-t :可使用的最大CPU时间
-u :单一用户可以使用的最大程序数量
ulimit -a :列出目前身份的所有限制资料
ulimit -f 10240 :限制用户仅你呢该建立10M以下的容量的档案

变量内容的删除与替换
${变量#关键词} :若变量内容从头开始的数据符合关键词,则将最短数据删除
${变量##关键词} 若变量内容从头开始的数据符合关键词,则将最长数据删除
${变量%关键词} :若变量内容从尾向前的数据符合关键词,则将符合的数据删除
${变量%%关键词} :若变量内容从尾向前的内容符合关键词,则将符合的数据删除
${变量/旧字符串/新字符串} :将第一个旧字符替换成新字符
${变量//旧字符串/新字符串} :将所有的旧字符替换成新字符
eg:mypath=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
echo ${mypath#/*/bin:} :删除/usr/kerberos/sbin:/usr/kerberos/bin:
echo ${mypath##/*/sbin:} :删除后只剩下/usr/bin:/root/bin
echo ${mypath%:*bin} :删除最后的:/root/bin
echo ${mypath%%:*bin} :删除后只剩下/usr/kerberos/sbin
echo ${mypath/local/me} :将第一个local替换成me
echo ${mypath//local/me} :将所有的local替换成me

变量的取代
var=${str-expr} :str变量没有设定时,var=expr;str变量已设定或为空字符串时,var=$str
var=${str:-expr} :str变量没有设定或为空字符串时,var=expr;str变量已设定,var=$str
var=${str+expr} :str变量没有设定时,var= ;str变量已设定,或为空字符串时,var=expr
var=${str:+expr} :str变量没有设定或为空字符串时,var= ;str变量已设定时,var=expr
var=${str=expr} :str变量没有设定时,var=str=expr;str变量已设定或为空字符串时,var=$str,str不变
var=${str:=expr} :str变量没有设定或为空字符串时,var=str=expr;str变量已设定时,var=$str,str不变
var=${str?expr} :str变量没有设定时,expr输出至stderr;str变量已设定或为空字符串时,
var=${str:?expr} :str变量没有设定或为空字符串时,expr输出至stderr;str变量已设定时,var=$str

命令别名
alias :查看当前所有别名
alias cls='clear' :设置clear(清屏)别名
alias ll='ls -alF
unalias cls :取消别名设置

历史命令:history
history :查看历史命令
history 10 :列出目前最近的10次历史
history -w :(强制写入)立刻将目前的历史写入~/.bash_history中,默认情况下,系统在注销时会自动将历史记录到history文件中。
echo $HISTSIZE :查看目前可以记录的历史上限数量
!! :执行上一条命令
!al :执行最近以al为开头的指令
history -c :清除所有历史记录

bash的进栈欢迎信息:/etc/issue,/etc/motd
通过修改/etc/issue文件内容来修改tty1~tty6登录系统时的进栈信息
issue文件内各代码意义:
\d :本地端时间的日期 
\l :显示第几个终端接口
\m :显示硬件的等级(i386/i486
\n :显示主机的网络名称
\o :显示domain name
\r :操作系统的版本(相当于uname -r)
\t :显示本地端时间
\s :操作系统的名称
\v :操作系统的版本

login与non-login shell
login shell:由tty1-tty6登入,需要输入用户名与密码,此时取得的bash就称为login bash
non-login shell:由图形化登入后,开启终端;或在原本的bash下再次下达bash这个命令

login shell会读取两个配置文件:
/etc/profile:这是系统整体的设定。
~/.bashrc 或 ~/.profile 或~/.bash_profile 或 ~/.bash_login:属于个人设定

~/.bash_history :记录历史命令的档案
~/.bash_logout :当注销bash后,系统再帮我做完什么动作后才离开

stty :用于设置热键
stty -a :列出所有热键与按键内容
eof :结束输入
erase :向后删除符
intr :送出一个中断讯号给正在run的程序
kill :删除在目前指令上的所有文字
quit :送出一个quit的讯号在正在运行的程序
stop :停止目前屏幕的输出
susp :送出一个终端停止的讯号给正在run的程序

组合键:
Ctrl + C :终止目前的命令
Ctrl + D :输入结束(EOF)
Ctrl + M :Enter
Ctrl + S :暂停屏幕的输出
Ctrl + Q :恢复屏幕的输出
Ctrl + U :在提示字符下,将整列命令删除
Ctrl + Z :暂停目前命令

通配符:
* :代表0个到无穷多个任意字符
? :代表一定有一个任意字符
[] :代表一定有一个在括号内的字符
[-] :代表在编码顺序内的所有字符中的一个字符,如[0-9]代表取0到9中任意一个
[^] :代表任意字符,但不包含括号内的字符

bash中的特殊符号:
# :注释符合
\ :跳脱符号,将特殊符号或通配符还原成一般字符
| :管线命令
; :连续指令下达分隔符
~ :用户家目录
$ :变量之前需要加的变量取代词
& :将指令变成背景下工作
! :逻辑运算符(非)
/ :目录符号,路径分隔的符号
>,>> :数据流重导向:分别是取代与累加
<,<< :数据流重导向:输入导向
 :单引号,不具有变量置换的功能
"" :双引号,具有变量置换的功能
·· :反单引号,两个反单引号中间为可以先执行的指令,亦可使用$()
() :中间为子shell的起始与结束
{} :在中间为命令区块的组合

标准输入 :代码为0,使用<或<<
标准输出 :代码为1,使用>或>>
标准错误输出 :代码为2,使用2>或2>>
find /root -name .bashrc > list_right 2> list_error :正确的信息重定向到list_right,错误的信息重定向到list_error

垃圾桶黑洞装置与特殊写法
find /root -name .bashrc 2> /dev/null :将错误的数据丢弃,屏幕上显示正确的数据

将指令的数据全部写入名为list的档案中
ll /root/ > list 2> list :错误写法
ll /root/ >list 2>&1 :正确写法
ll /root/ &> list :正确写法

使用cat指令来建立一个档案的简单流程
cat > hi.txt :输入档案内容,按Ctrl + d来离开
cat > bashrc < ~/.bashrc :将~/.bashrc文档内容输出到bashrc文档
cat > hello.txt << "quit" :输入内容到文档,输入quit时,输入结束

命令执行的判断依据:;,&&,||
sync;sync;shutdown -h now :连续执行多条命令
ls hello && touch hello/hello :如果目录存在才继续执行touch命令
ls hello || touch helloworld :如果第一个命令执行成功,第二个命令不会执行
ls ./hello || mkdir hello && touch hello/hi :如果hello目录不存在,则创建hello目录,并且创建hi文件
ls hello && echo "exist" || echo "no exist" :如果hello存在,打印exist,如果hello不存在,打印 not exist

管道命令(|)
cat /home/ckt/.bashrc |less :读取~/.bashrc文件,使用less来读取
1.管线命令仅会处理standard output,对于standard error output会予以忽略
2.管线命令必须要能够接受来自一个指令的数据成为standard input继续处理才行

撷取命令:cut,grep
echo $PATH|cut -d ":" -f 5 :以冒号作为分隔,将$PATH分段,取出第五段内容
echo $PATH|cut -d ":" -f 3,5 :分段,列出第三,五段内容
export|cut -c 12- :取出每行第12个字符以后的字符(-c以字符的单位取出固定字符区间,适合处理比较具有格式的输出数据)
export|cut -c 12-20 :取出12-20行之间的字符

grep [-acinv] --color=auto '搜寻字符串' filename
-a :将binary档案以text档案的方式搜寻数据
-c :计划找到'搜寻字符串'的次数
-i :忽略大小写
-R/r :读取目录下所有文件,依次查询
-n :输出行号
-v :反向选择,显示不包含'搜寻字符串'内容的那一行
-h :查询多文件时不显示文件名
-l :查询多文件时只输出包含匹配字符的文件名
-s :不显示不存在或无匹配文本的错误信息
--color==auto :将关键词部分以颜色显示

grep -irn 'hello' . :查询当前目录下包含hello字符串的文件
last |grep -v 'vbird' :显示出vbird的登录记录
grep 'MANPATH' /etc/manpath.config :取出/etc/manpath.config内包含MANPATH的那几行

排序命令:sort,wc,uniq
sort [-fbMnrtuk] [file or stdin]
-f :忽略大小写差异
-b :忽略最前面的空格符部分
-M :以月份的名字来排序
-n :用纯数字进行排序,默认是以文字形态来排序
-r :反向排序
-u :就时uniq,相同的数据中,仅出现一行代表
-t :分隔符,预设时用tab键来分隔
-k :以那个区间来进行排序

cat /etc/passwd |sort :将个人帐号进行排序
cat /etc/passwd |sort -t ':
last |cut -d ' ' -f1 |sort :输出最近登录信息,仅显示帐号,并加以排序
cat hello |sort :显示hello内容,并排序
cat hello |sort -fr :显示hello内容,并忽略大小写,以反向排序
sort -u hello :对hello文件内容进行排序,去掉重复

wc :查看档案里面有多少字,多少行,多少字符
wc -l :仅列出行
wc -w :仅列出多少字(英文单词)
wc -m :多少字符
wc hello :列出hello档案的行数,单词数,字符数
last |grep [a-zA-Z]|grep -v 'wtmp' |wc -l :查询这个月登录系统的总人次
cat /etc/passwd |wc -l :查询有多少帐号

双向重导向:tee(将数据显示到屏幕并重定向到文件
tee [-a] file
-a :以累加的方式写入文件
last |tee last.list |cut -d " " -f1 :将last的输出存一份到last_list,并对输出进行处理显示
ls ~/ |tee homefile |more :将ls的结果存一份到homefile,并显示
ls -al ~/ |tee -a homefile |more :将结果append到homefile中

字符转换命令:tr,col,join,paste,expand
tr :可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换
tr [-ds] 'SET1
-d :删除讯息当中的SET1这个字符串
-s :取代掉重复的字符
cat hello |tr '[a-z]' '[A-Z]' :将hello档案中所有小写变为大写
cat /etc/passwd |tr -d ':' :将文档中的:号去掉
cat hello |tr -d '\r' > hello.linux :读取hello(dos格式,todos hello转换)内容,去掉DOS格式换行符,并重定向到hello.linux中
file hello* :查看hello,hello.linux档案格式

col [-xb]
-x :将tab键转换成对等的空格键
-b :在文字内有反斜杠时,仅保留反斜杠最后的那个字符
cat hello |col -x >hello_col :将文档中的tab键换成空格键
cat -A hello_col :查看档案中是否还有tab键(^I为空格键)

join [-ti12] file1 file2
-t :join默认以空格符分割数据,如果两个档案相同,则将两笔数据连成一行,且第一个字段放在第一个
-i :忽略大小写的差异
-1 :第一个档案要用那个字段来分析
-2 :第二个档案要用那个字段来分析
注意:使用join之前,所需要处理的档案应该实现经过排序处理,否则有些比对的项目会被略过。
join -t ':' /etc/passwd /etc/shadow :将passwd和shadow相同行整合到一行
join -t ':' -1 4 /etc/passwd -2 3 /etc/group : 第一个档案使用第4个字段,第二个档案使用第3个字段来分析,取出相同的放在最前面,整合剩余部分到一行

paste [-d] file1 file2
-d :后面可以接分隔字符,预设是以tab来分隔的
- :file内容从标准输出获得
paste /etc/passwd /etc/group :同一行的拼在一起,中间是以tab按键隔开
cat group |paste passwd shadow - |head -n 3 :将passwd,shadow,group拼接在一起,显示前3行

ecpand [-t] file
-t :后面可以接数字,一般来说,一个tab按键可以用8个空格取代,我们也可以自定义一个tab按键代表多少个字符
paste passwd shadow |expand -t 2 -|cat -A :拼接passwd和shadow档案,将tab键设定成两个空格键

分割命令:split
split [-bl] file PREFIX
-b :后面可接欲分割的档案大小,可加单位,例如b,k,m等
-l :以行数来进行分割
PREFIX :代表前导符的意思,可作为分割档案的前导文字
split -b 512k python python_sp :将python档案分割为每个512k大小,文件名以python_sp开头
cat python_spa* >> python_sp :将刚才分割的档案重新合成一个档案
ls -al / |split -l 10 - lsroot :将ls -al / 内容按照每10行记录成一个档案

参数代换:xargs
xargs [-Oepn] command
-O :如果输入的stdin含有特殊字符时,-O参数可以将它还原成一般字符
-e :后面接一个字符串,当xargs分析到这个字符串时,就会停止继续工作
-p :在执行每个命令的argument时,都会询问使用者的意思
-n :后面接次数,每次command指令执行时,要使用几个参数
当xargs后面没有接任何的指令时,默认是以echo来进行输出的
cut -d ':' -f1 passwd |head -n 3 |xargs finger :取出passwd内的第一栏,仅取3行,使用finger这个指令将每个帐号内容show出来
cut -d ':' -f1 passwd |head -n 3 |xargs -p finger :每次执行finger时都要询问是否动作
cut -d ':' -f1 passwd |xargs -p -n 2 finger :将所有passwd内所有帐号都以finger查询,但一次仅查询2个帐号
find /sbin/ -perm +7000 |xargs ls -l :找出/sbin地下具有特殊权限的档名,并使用ls -l列出详细属性
0 0
原创粉丝点击