认识与学习bash
变量
什么是子程序?
#name=yuhang (命名一个变量name)
#bash (进入到所谓的子程序中)
#echo $name (尝试输出变量)
————>(变量并没有被正确输出)
#exit (退出子进程)
#export name (讲其命名为环境变量)
#bash (进入到子进程)
#echo $name (尝试打印name变量)
yuhang ————>(打印成功)
#exit (退出子程序)所以说什么是子程序呢,就是在一个shell下新开启了一个shell,注意在父shell中定义的变量子shell中并不能同步定义,需要将其转变为export 环境变量才能全局使用。
变量的设定中双引号和单引号的作用:双引号中定义新变量时,$原变量输出变量内容。而单引号中$原变量echo之后直接是' '中的内容
[root@linuxedu ~]# name=yuhang
[root@linuxedu ~]# echo $name
yuhang
[root@linuxedu ~]# myname="$name is god"
[root@linuxedu ~]# echo myname
myname
[root@linuxedu ~]# echo $myname
yuhang is god
[root@linuxedu ~]# myname='$name is god'
[root@linuxedu ~]# echo $myname
$name is god
变量内容的删除与匹配
sheell截取操作符(贪婪匹配)

变量的设定方式

example:
[root@linuxedu ~]# unset str;var=${str-expr}
//假设str没被设定,str的值被设定为expr,即var=str=expr
[root@linuxedu ~]# echo str="$str",var="$var"
//屏幕上输出str,var的值都为expr
str=,var=expr
通配符与特殊符号
数据流重导向
输出导向
1:标准输出 2:标准错误 dev/null数据黑
输入导向
下面常见的命令经常出没于管道命令中,找到自己想要的文本信息应熟练掌握!
sort的选项和参数
-f :忽略大小写的差异
-n :使用纯数字进行排序
-r : 反向排序
-u: 就是uniq,相同的数据中,仅出现一行代表
cut(见名知意,就是把内容切开)选项和参数
-d : 后面接分隔字符,与-f一起使用
-f : 依据 -d 癿分隑字符将一段讯息分割成为数段,用 -f 叏出第几段癿意思;
uniq
uniq [-ic]
选项与参数:
-i :忽略大小写字符的不同;
-c :进行计数
范例一:使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位;
last | cut -d ' ' -f1 | sort | uniq
范例二:承上题,如果我还想要知道每个人的登入总次数呢?
last | cut -d ' ' -f1 | sort | uniq -c
wc [-lwm]
选项与参数:
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字符;
tee(双重管道)
双重管道就是将数据分流到屏幕和文件中去,输出到屏幕的就是标准输出,可以让下个指令继续处理
tee [-a] file
选项与参数:
-a :以累加 (append) 的方式,将数据加入 file 当中!
范例一:将 last 的输出存一份到 last.list 档案中,同时继续处理后续命令
last | tee last.list | cut -d " " -f1
范例二:将 ls 的数据存一份到 ~/homefile,同时屏幕也有输出讯息
ls -l /home | tee ~/homefile | more
范例三:累加方式,将数据追加到 ~/homefile
ls -l / | tee -a ~/homefile | moretr [-ds] SET1 ...
选项与参数:
-d :删除讯息当中的 SET1 这个字符串;
-s :取代掉重复的字符!
范例一:将 last 输出的讯息中,所有的小写变成大写字符:
last | tr '[a-z]' '[A-Z]'
范例二:将 /etc/passwd 输出的讯息中,将冒号(:)删除
cat /etc/passwd | tr -d ':'
col -x
将Tab键转化为空格键输出更加美观
[root@www ~]# cat /etc/man.config | col -x | cat -A | more
join
[root@www ~]# join [-ti12] file1 file2
选项与参数:
-t : join 默认以空格符分隔数据,并且比对『第一个字段』的数据,
如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i : 忽略大小写的差异;
-1 : 这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思;
-2 : 代表『第二个档案要用那个字段来分析』的意思。
[root@linuxedu ~]# head -n 3 /etc/passwd /etc/group
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
==> /etc/group <==
root:x:0:
bin:x:1:
daemon:x:2:
//可以看出/etc/passwd中的GID在第四个字段,/etc/group中的GROUP在第三个字段
[root@linuxedu ~]# join -t : -1 4 /etc/passwd -2 3 /etc/group
#通过此命令将相同的字段(比如第一行的0为GID)输出到开头,后面的内容依次打印
0:root:x:0:root:/root:/bin/bash:root:x:
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:
4:adm:x:3:adm:/var/adm:/sbin/nologin:adm:x:
join: /etc/passwd:6: is not sorted: sync:x:5:0:sync:/sbin:/bin/sync
7:lp:x:4:lp:/var/spool/lpd:/sbin/nologin:lp:x:
join: /etc/group:11: is not sorted: wheel:x:10:
99:nobody:x:99:Nobody:/:/sbin/nologin:nobody:x:
paste: 将两个文件中的相同的行数拼接在一起
[root@linuxedu ~]# paste /etc/passwd /etc/shadow
分割命令split
选项与参数:
-b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
-l :以行数来进行分割。
如果档案档案太大,利用split 根据档案的大小或者行数来进行拆分成几个小文件
[root@linuxedu ~]# split -b 200k /root/temp_600k.txt splittest
-rw-r--r-- 1 root root 204800 Aug 26 09:07 splittestaa
-rw-r--r-- 1 root root 204800 Aug 26 09:07 splittestab
-rw-r--r-- 1 root root 204800 Aug 26 09:07 splittestac
-rw-r--r-- 1 root root 614400 Aug 26 09:06 temp_600k.txt
xargs:很多命令并不支持被管道接收!!!本章总结:
- 由于核心在内存中是受保护的区块,因此我们必须要透过『Shell』将我们输入的指令与 Kernel 沟通,好让 Kernel 可以控制硬件来正确无误的工作
- 学习 shell 的原因主要有:文字接口的 shell 在各大 distribution 都一样;远程管理时文字接口速度较快;shell 是管理 Linux 系统非常重要的一环,因为 Linux 内很多控制都是以 shell 撰写的。
- 系统合法的 shell 均写在 /etc/shells 档案中;
- 用户默认登入取得的 shell 记录于 /etc/passwd 的最后一个字段;
- bash 的功能主要有:命令编辑能力;命令与档案补全功能;命令别名设定功能;工作控制、前景背景控制;程序化脚本;通配符
- type 可以用来找到执行指令为何种类型,亦可用于与 which 相同的功能;
- 变量就是一组文字或符号等,来取代一些设定或者是一串保留的数据
- 变量主要有环境变量与自定义变量,或称为全局变量与局部变量
- 使用 env 与 export 可观察环境变量,其中 export 可以将自定义变量转成环境变量;
- set 可以观察目前 bash 环境下的所有变量;
- $? 为变量,是前一个指令执行完毕后的回传值。在 Linux 回传值为 0 代表执行成功;
- locale 可用于观察语言资料;
- 可用 read 让用户由键盘输入变量的值
- ulimit 可以用限制用户使用系统的资源情况
- bash 的配置文件主要分为 login shell 与 non-login shell。login shell 主要读取 /etc/profile 与 ~/.bash_profile,non-login shell 则仅读取 ~/.bashrc
- 通配符主要有 *,?,[] 等等
- 数据流重导向透过 >, >>, < 之类的符号将输出的信息转到其他档案或装置去;
- 连续命令的下达可通过 && || 等符号来处理
- 管线命令的重点是:『管线命令仅会处理 standard output,对于 standard error output 会予以忽略』『管线命令必须能够接受来自前一个指令的数据成为 standard input 继续处理才行。』
本章介绍的管线命令主要有:cut, grep, sort, wc, uniq, tee, tr, col, join, paste, expand, split, xargs 等。
本章习题
评论