认识与学习BASHshell
认识 BASH 这个 Shellbash
Bash shell 的功能学习
查询指令是否为 Bash shell 的内置命令: type字体
范例一:查询一下 ls 这个指令是否为 bash 内置?编码
[dmtsai@study ~]$ type ls
复制代码
Shell 的变量功能spa
变量的取用与设置:echo, 变量设置规则, unset.net
echo $PATH命令行
设置变量:code
[dmtsai@study ~]$ echo ${myname}
<==这里并无任何数据~由于这个变量还没有被设置!是空的!
[dmtsai@study ~]$ myname=VBird
[dmtsai@study ~]$ echo ${myname}
VBird <==出现了!由于这个变量已经被设置了
复制代码
:如何进入到您目前核心的模块目录?cdn
[dmtsai@study ~]$ cd /lib/modules/$(uname -r)/kernel # 以此例较佳!
复制代码
其实上面的指令能够说是做了两次动做,亦便是:
环境变量的功能
用 env 观察环境变量与常见环境变量说明
用 set 观察全部变量 (含环境变量与自订变量)
影响显示结果的语系变量 (locale)
变量键盘读取、阵列与宣告: read, array, declare
read
范例一:让使用者由键盘输入一内容,将该内容变成名为 atest 的变量 [dmtsai@study ~] echo ${atest} This is a test <==你刚刚输入的数据已经变成一个变量内容!
declare / typeset
范例一:让变量 sum 进行 100+300+50 的加总结果
declare 或 typeset 是同样的功能,就是在“宣告变量的类型”。若是使用 declare 后面并无接任何参数,那么 bash 就会主动的将全部的变量名称与内容统统叫出来,就好像使用 set 同样啦!
[dmtsai@study ~]$ sum=100+300+50
[dmtsai@study ~]$ echo ${sum}
100+300+50 <==咦!怎么没有帮我计算加总?由于这是文字体态的变量属性啊!
[dmtsai@study ~]$ declare -i sum=100+300+50
[dmtsai@study ~]$ echo ${sum}
450
复制代码
范例:设置上面提到的 var[1] ~ var[3] 的变量。
[dmtsai@study ~]$ var[1]="small min"
[dmtsai@study ~]$ var[2]="big min"
[dmtsai@study ~]$ var[3]="nice min"
[dmtsai@study ~]$ echo "${var[1]}, ${var[2]}, ${var[3]}"
small min, big min, nice min
复制代码
与文件系统及程序的限制关系: ulimit
变量内容的删除、取代与替换
范例一:先让小写的 path 自订变量设置的与 PATH 内容相同
[dmtsai@study ~]$ path=${PATH}
[dmtsai@study ~]$ echo ${path}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
复制代码
范例二:假设我不喜欢 local/bin,因此要将前 1 个目录删除掉,如何显示?
[dmtsai@study ~]$ echo ${path#/*local/bin:}
/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
复制代码
范例六:将 path 的变量内容内的 sbin 取代成大写 SBIN:
[dmtsai@study ~]$ echo ${path/sbin/SBIN}
/usr/local/bin:/usr/bin:/usr/local/SBIN:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
复制代码
这个部分就容易理解的多了!关键字在于那两个斜线,两斜线中间的是旧字串
后面的是新字串,因此结果就会出现如上述的特殊字体部分啰!
[dmtsai@study ~]$ echo ${path//sbin/SBIN}
/usr/local/bin:/usr/bin:/usr/local/SBIN:/usr/SBIN:/home/dmtsai/.local/bin:/home/dmtsai/bin
复制代码
若是是两条斜线,那么就变成全部符合的内容都会被取代喔!
咱们将这部份做个总结说明一下:
变量设置方式 | 说明 |
---|---|
{变量#关键 字} | |
{变量##关键字} | 若变量内容从头开始的数据符合“关键字”,则将符合的最短数据删除若变量内容从头开始的数据符合“关键字”,则将符合的最长数据删除 |
{变量%关键 字} | |
{变量%%关键字} | 若变量内容从尾向前的数据符合“关键字”,则将符合的最短数据删除 若变量内容从尾向前的数据符合“关键字”,则将符合的最长数据删除 |
{变量/旧字串/新字串} | |
{变量//旧字串/新字串} | 若变量内容符合“旧字串”则“第一个旧字串会被新字串取代” 若变量内容符合“旧字串”则“所有的旧字串会被新字串取代” |
Bash Shell 的操做环境:
bash 的环境配置文件
source :读入环境配置文件的指令
万用字符与特殊符号
符号 意义
表明“ 0 个到无穷多个”任意字符
复制代码
? 表明“必定有一个”任意字符
[ ] 一样表明“必定有一个在括号内”的字符(非任意字符)。例如 [abcd] 表明“必定有一个字符, 多是 a, b, c, d 这四个任何一个 [ -] 如有减号在中括号内时,表明“在编码顺序内的全部字符”。例如 [0-9] 表明 0 到 9 之间的全部数字,由于数字的语系编码是连续的! [^] 若中括号内的第一个字符为指数符号 (^) ,那表示“反向选择”,例如 abc 表明必定有一个字符,只要是非 a, b, c 的其余字符就接受的意思。
除了万用字符以外,bash 环境中的特殊符号有哪些呢?下面咱们先汇整一下:
数据流重导向
标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; 为了理解 stdout 与 stderr ,咱们先来进行一个范例的练习: 范例一:观察你的系统根目录 (/) 下各目录的文件名、权限与属性,并记录下来
[dmtsai@study ~] ll / > ~/rootfile ==屏幕并没有任何信息 [dmtsai@study ~]$ ll ~/rootfile ==有个新文件被建立了! -rw-rw-r--. 1 dmtsai dmtsai 1078 Jul 9 18:51 /home/dmtsai/rootfile
1> :以覆盖的方法将“正确的数据”输出到指定的文件或设备上; 1>>:以累加的方法将“正确的数据”输出到指定的文件或设备上; 2> :以覆盖的方法将“错误的数据”输出到指定的文件或设备上; 2>>:以累加的方法将“错误的数据”输出到指定的文件或设备上;
范例五:将指令的数据所有写入名为 list 的文件中
[dmtsai@study ~]$ find /home -name .bashrc > list 2> list ==错误
[dmtsai@study ~]$ find /home -name .bashrc > list 2>&1 ==正确
[dmtsai@study ~]$ find /home -name .bashrc &> list ==正确
复制代码
standard input : < 与 << 了解了 stderr 与 stdout 后,那么那个 < 又是什么呀?呵呵!以最简单的说法来讲, 那就 是“将本来须要由键盘输入的数据,改由文件内容来取代”的意思。 咱们先由下面的 cat 指令操 做来了解一下什么叫作“键盘输入”吧!
范例六:利用 cat 指令来建立一个文件的简单流程
[dmtsai@study ~]$ cat < catfile
testing
cat file test
< ==这里按下 [ctrl]+d 来离开
[dmtsai@study ~]$ cat catfile
testing
cat file test
复制代码
命令执行的判断依据: ; , &&, ||
cmd ; cmd (不考虑指令相关性的连续指令下达)
在某些时候,咱们但愿能够一次执行多个指令,例如在关机的时候我但愿能够先执行两次sync 同步化写入磁盘后才 shutdown 计算机,那么能够怎么做呢?这样作呀:
复制代码
[root@study ~]# sync; sync; shutdown -h now
在某些时候,咱们但愿能够一次执行多个指令,例如在关机的时候我但愿能够先执行两次 sync 同步化写入磁盘后才 shutdown 计算机,那么能够怎么做呢?这样作呀: [root@study ~]# sync; sync; shutdown -h now
$? (指令回传值) 与 && 或 ||
cmd1&&cmd2
若 cmd1 执行完毕且正确执行(?=0),则开始执行 cmd2。 2. 若 cmd1 执行完毕且为错误 (?≠0),则 cmd2 不执行。
cmd1 ||cmd2
若 cmd1 执行完毕且正确执行(?=0),则 cmd2 不执行。 2. 若 cmd1 执 行完毕且为错误 (?≠0),则开始执行 cmd2。
范例一:使用 ls 查阅目录 /tmp/abc 是否存在,若存在则用 touch 建立 /tmp/abc/hehe
[dmtsai@study ~]$ ls /tmp/abc && touch /tmp/abc/hehe
ls: cannot access /tmp/abc: No such file or directory
复制代码
ls 很干脆的说明找不到该目录,但并无 touch 的错误,表示 touch 并无执行
管线命令 (pipe)
撷取命令: cut, grep
范例一:将 PATH 变量取出,我要找出第五个路径。
[dmtsai@study ~]$ echo ${PATH}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
[dmtsai@study ~]$ echo ${PATH} | cut -d ':' -f 5
#如同上面的数字显示,咱们是以“ : ”做为分隔,所以会出现 /home/dmtsai/.local/bin
#那么若是想要列出第 3 与第 5 呢?,就是这样:
[dmtsai@study ~]$ echo ${PATH} | cut -d ':' -f 3,5
范例一:将 last 当中,有出现 root 的那一行就取出来;
[dmtsai@study ~]$ last|grep 'root'
范例二:与范例一相反,只要没有 root 的就取出!
[dmtsai@study ~]$ last | grep -v 'root'
复制代码
排序命令: sort, wc, uniq
范例一:我的账号都记录在 /etc/passwd 下,请将账号进行排序。
[dmtsai@study ~]$ cat /etc/passwd | sort
范例一:使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位;
[dmtsai@study ~]$ last | cut -d ' ' -f1 | sort| uniq
范例一:那个 /etc/man_db.conf 里面到底有多少相关字、行、字符数?
[dmtsai@study ~]$ cat /etc/man_db.conf | wc
131 723 5171
#输出的三个数字中,分别表明: “行、字数、字符数”
复制代码
双向重导向: tee
[dmtsai@study ~]$ last | tee last.list | cut -d " " -f1
复制代码
这个范例可让咱们将 last 的输出存一份到 last.list 文件中;
字符转换命令: tr, col, join, paste, expand
tr 能够用来删除一段讯息当中的文字,或者是进行文字讯息的替换!
复制代码
范例一:将 last 输出的讯息中,全部的小写变成大写字符:
[dmtsai@study ~]$ last | tr '[a-z]' '[A-Z]'
复制代码
事实上,没有加上单引号也是能够执行的,如:“ last tr [a-z] [A-Z] ”
join 看字面上的意义 (加入/参加) 就能够知道,他是在处理两个文件之间的数据, 并且,
复制代码
主要是在处理“两个文件当中,有 "相同数据" 的那一行,才将他加在一块儿”的意思。
这个 paste 就要比 join 简单多了!相对于 join 必需要比对两个文件的数据相关性, paste 就
复制代码
直接“将两行贴在一块儿,且中间以 [tab] 键隔开”
expand 这玩意儿就是在将 [tab] 按键转成空白键啦。
复制代码
分区命令: split
范例一:个人 /etc/services 有六百多K,若想要分红 300K 一个文件时?
[dmtsai@study ~]$ cd / | split -b 300k /etc/services services
[dmtsai@study tmp]$ ll -k services*
-rw-rw-r--. 1 dmtsai dmtsai 307200 Jul 9 22:52 servicesaa
-rw-rw-r--. 1 dmtsai dmtsai 307200 Jul 9 22:52 servicesab
-rw-rw-r--. 1 dmtsai dmtsai 55893 Jul 9 22:52 servicesac
复制代码
参数代换: xargs
关于减号 - 的用途
管线命令在 bash 的连续的处理程序中是至关重要的!另外,在 log file 的分析当中也是至关 重要的一环, 因此请特别留意!另外,在管线命令当中,经常会使用到前一个指令的 stdout 做为此次的 stdin , 某些指令须要用到文件名称 (例如 tar) 来进行处理时,该 stdin 与 stdout 能够利用减号 "-" 来替代, 举例来讲:
[root@study ~]# mkdir /tmp/homeback
[root@study ~]# tar -cvf - /home | tar -xvf - -C /tmp/homeback
复制代码
上面这个例子是说:“我将 /home 里面的文件给他打包,但打包的数据不是纪录到文件,而是 传送到 stdout; 通过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - ”。后面的这个 - 则 是取用前一个指令的 stdout, 所以,咱们就不须要使用 filename 了!这是很常见的例子喔! 注意注意!